2009-06-23 3 views
18

이 질문은 저의 다른 질문 "How to redirect to Login page when Session is expired in Java web application?"과 관련이 있습니다. 아래는 내가 할 노력하고있어 무엇 : 나는 JBoss AS 5에서 실행중인 JSF 웹 응용 프로그램에서 '세션 만료 됨'처리

  • 사용자가 비활성 인 5 AS 제이 보스에서 실행되는 JSF 웹 응용 프로그램을했습니다

    1. 을, 나는 사용자가 로그 아웃 할 필요가, 15 분 말하고 세션이 만료 된 후에 응용 프로그램을 사용하려고하면 로그인 페이지로 리디렉션하십시오.
    2. 'JSF Logout and Redirect'에서 제안한대로 세션 만료 조건을 검사하고 세션이 만료 된 경우 사용자를 session-timed-out.jsp 페이지로 리디렉션하는 필터를 구현했습니다.
    3. web.xml의 다른 모든 필터 정의 위에 SessionExpiryCheckFilter를 추가 했으므로 세션 만료 검사에서 첫 번째 히트가 항상 발생합니다.

    이제 에 대한 답변을 드리겠습니다.입니다. JBoss AS를 사용하고 있으므로 세션이 만료되면 JBoss가 자동으로 로그인 페이지로 리디렉션합니다 (세션 만료 확인 필터가 호출되지 않음). 그래서 로그인 한 후, 내 SessionExpiryCheckFilter가 요청을 가로 채고 세션이 사용 가능하다고 판단합니다. 그러나 예외가 throw됩니다. javax.faces.application.ViewExpiredException: viewId:/mypage.faces - View /mypage.faces could not be restored.

    전에이 문제에 직면 한 사람이 있습니까? 이 문제를 해결할 수있는 아이디어가 있습니까?

  • +0

    Seam을 사용하고 있습니까? –

    +0

    아니요. 저는 Seam을 사용하지 않습니다. – Veera

    +0

    Facelets 또는 JSP를 사용하고 있습니까? – mtpettyp

    답변

    15

    참조하십시오. JspL core taglib 리디렉션을 사용하고 jsp 리디렉션을 사용하지 않아야합니다 (jsp도 만료 됨).

    <error-page> 
        <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
        <location>/sessionExpired.jsf</location> 
    </error-page> 
    

    sessionExpired.jsp : 당신은 다른 오류 유형에 대해이 방법을 사용할 수 있습니다

    <%@page contentType="text/html" pageEncoding="UTF-8"%> 
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd"> 
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
    
    <c:redirect url="/login.jsf" /> 
    

    당신의 FacesConfig.xml에서

    는 다음과 같은 넣어 또는 예외. 예를 들어 요소가 오류 코드 또는 예외 유형 및 웹 응용 프로그램의 리소스의 경로 :

    <error-page> 
        <error-code>400</error-code> 
        <location>/400.html</location> 
    </error-page> 
    

    또는 요소가 자바 예외 유형의 정규화 된 클래스 이름을 포함 간의 매핑이 포함되어 있습니다.

    <error-page> 
        <exception-type>javax.servlet.ServletException</exception-type> 
        <location>/servlet/ErrorDisplay</location> 
    </error-page> 
    
    0

    필터와 함께 세션 수신기를 작성하는 것이 좋습니다.

    세션이 만료되면 새 세션 개체를 만들고 새 개체에 시간 제한 값을 설정할 수 있습니다.

    필터의 시간 초과 값을 확인하고 브라우저를 리디렉션하십시오.

    는 다음 방법은 나를 위해 작동 http://www.java2s.com/Code/Java/Servlets/Servletsessionlistener.htm

    3

    Mojarra/Sun RI를 사용하는 경우이 내용을 웹에 추가하려고 할 수 있습니다.xml :

    <context-param> 
        <param-name>com.sun.faces.enableRestoreView11Compatibility</param-name> 
        <param-value>true</param-value> 
    </context-param> 
    

    그러나 이것이 항상 완벽한 해결책은 아닙니다. 사용자가 세션을 잃었다는 사실을 숨 깁니다. 얼굴-config.xml 파일에서보기

    @Override 
    public void afterPhase(PhaseEvent event) { 
        FacesContext facesContext = event.getFacesContext(); 
        if(facesContext.getViewRoot()==null){ 
         try{ 
          facesContext.getExternalContext().redirect(HOME_PAGE); 
          facesContext.responseComplete(); 
         } catch (IOException e){ 
          e.printStackTrace(); 
         } 
        } 
    } 
    
    @Override 
    public void beforePhase(PhaseEvent event) {} 
    
    @Override 
    public PhaseId getPhaseId() { 
        return PhaseId.RESTORE_VIEW; 
    } 
    

    레지스터를 복원하기위한

    +0

    이것은 최선의 해결책은 아닙니다. – Makky

    0

    내가 나를 위해 작동하지 않는 한 그것을 위해 필터하지만 어떤 방법을 쓸 시도 javax.faces.event.PhaseListener 구현 그래서 나는 을 번갈아 만들었습니다.

    나는 사용자가 로그인없이 액세스하지 않으려는 모든 페이지에서 다음과 같이 그것을했다 :

    <f:view> 
        <h:dataTable value="#{userHome.validuser()}"/> 
        // my code 
    <f:view/> 
    

    이 내 세션 빈 관리에있는 기능 validuser()를 호출합니다.

    이제 제 기능입니다. 로그인 중에 이미 사용자 개체를 세션에 삽입합니다.

    public void validuser() 
    { 
        FacesContext context = FacesContext.getCurrentInstance(); 
        UserLogin ul = (UserLogin) context.getExternalContext().getSessionMap().get("userbean"); 
    
        if (ul == null) 
         try{ 
           context.getExternalContext().redirect("/HIBJSF/faces/LoginPage.xhtml"); 
           context.responseComplete(); 
         } 
         catch (IOException e) 
         { 
         e.printStackTrace(); 
         } 
    } 
    

    세션이 있지만 로그인 한 사람이없는 경우 리디렉션 페이지로 연결됩니다.