2011-11-17 1 views
2

성공적으로 로그인 한 후 내 JSF 응용 프로그램에서 Logout 링크가있는 응용 프로그램의 내 홈 페이지로 이동합니다.tr : commandLink 작업 메서드가 다음 페이지로 이동하지 않습니다. 대신 같은 페이지를 다시로드합니다.

다음은 로그 아웃 링크와 관련된 html입니다.

<div id="top_white"> 
     <div style="float: right"><tr:form><tr:commandLink id="logout" action="#{Controller.Logout}"><img alt="logout" src="../../images/logout.gif"/></tr:commandLink></tr:form></div> 
    </div> 

그리고 여기에 내가 세션에서 사용자 ID를 확인하고 사용자에게 특정 목록을로드 생성자에서 sessionscoped

public class Controller { 

    private static Logger LOGGER = Logger.getLogger(Controller.class); 

    public Controller() { 
     req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
     session = req.getSession(false); 
     String userid = session.getAttribute("userid").toString(); 
     if(List == null){ 
      List = new ArrayList<List>(); 
      List = new DAO().loadListByid(Long.valueOf(userid)); 
      LOGGER.debug("successfully loaded the list for the user"); 
     } 
    } 

    private long Username; 
    private String Password=null; 
    HttpServletRequest req; 
    HttpSession session; 


    private List<List> List=null; 
    // getter and setters 


    public String Logout(){ 
     session.invalidate(); 
     LOGGER.debug("In LogOut"); 
     return "loggedout"; 
    } 
} 

Controller이다.

나는 또한 session.If 각 일부 ID를 확인하는 ServletFilter가가의 ID를 검사하는 그래서 /faces/jsp/*에 JSP 폴더에있는 모든 JSP 년대에 그 매핑되는 InvalidUser page.My 필터로 리디렉션을 찾을 수없는이 세션. 여기

내가 또한 here에서 가져옵니다 JSF 라이프 사이클을 디버깅 할 PhaseListener을 추가 내 필터

public void doFilter(ServletRequest req, ServletResponse res, 
      FilterChain chain) throws IOException, ServletException { 

      LOGGER.debug("In doFilter"); 
      HttpServletRequest request = (HttpServletRequest) req; 
      HttpServletResponse response = (HttpServletResponse) res; 
      HttpSession session = request.getSession(false); 
      LOGGER.debug("request:" + request.getRequestURL().toString()); 
      try{ 
       if (session.getAttribute("id") != null) { 
        LOGGER.debug("id found:" + session.getAttribute("id")); 
        chain.doFilter(req, res); // id found, so just continue request. 
       } 
      }catch(NullPointerException e){ 
       LOGGER.debug("No id found Exception: ", e); 
       response.sendRedirect(properties.getProperty(INVALID_USER_REDIRECTURL, true)); // No id found, so redirect to Invalid user page. 

      } 

    } 

doFilter 방법이다. 페이지 처음 stuff.So의 어떤 양식 제출 형식이 없기 때문에 내가 위의 로그가 예상대로

["http-bio-8090"-exec-114] DEBUG SessionFilter - In doFilter 
["http-bio-8090"-exec-114] DEBUG SessionFilter - request:http://my homepageurl 
["http-bio-8090"-exec-114] DEBUG SessionFilter - id found 
["http-bio-8090"-exec-114] ERROR org.apache.myfaces.config.FacesConfigurator - Configuration objects do not support clean-up. Update aborted 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE RESTORE_VIEW(1) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE RESTORE_VIEW(1) 
["http-bio-8090"-exec-114] DEBUG org.apache.myfaces.lifecycle.LifecycleImpl - exiting from lifecycle.execute in RESTORE_VIEW(1) because getRenderResponse is true from one of the after listeners 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE RENDER_RESPONSE(6) 
["http-bio-8090"-exec-114] INFO org.apache.myfaces.config.annotation.DefaultLifecycleProviderFactory - Using LifecycleProvider org.apache.myfaces.config.annotation.AllAnnotationLifecycleProvider 
["http-bio-8090"-exec-114] DEBUG Controller - id found in controller 
["http-bio-8090"-exec-114] DEBUG DAOProperties - dao.properties loaded successfully 
["http-bio-8090"-exec-114] DEBUG SvrConnection - In JNDI 
["http-bio-8090"-exec-114] DEBUG DAO - Successfully connected to database 
["http-bio-8090"-exec-114] DEBUG DAO - connection closed 
["http-bio-8090"-exec-114] DEBUG Controller - successfully loaded the list for the user 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE RENDER_RESPONSE(6) 

JSF 라이프 사이클의 첫 번째와 마지막 단계로 다음과 같은 서버 로그를 참조로드

만 첫 단계와 마지막 단계가 나열됩니다.

그러나이 게시물의 맨 위에서 언급 한 Logout commandLink를 클릭하면 실제 문제가 발생합니다.

Logout 링크를 클릭하면 여기에 서버 로그가 표시됩니다. 내 액션 메소드가 INVOKE_APPLICATION에 호출되고 내 컨트롤러의 Logout() 메소드가 호출되고 세션이 무효화되고 문자열 loggedout가 반환됩니다 예상대로 위의 로그에서

["http-bio-8090"-exec-114] DEBUG SessionFilter - In doFilter 
["http-bio-8090"-exec-114] DEBUG SessionFilter - request:http://my homepage url 
["http-bio-8090"-exec-114] DEBUG SessionFilter - appid found 
["http-bio-8090"-exec-114] ERROR org.apache.myfaces.config.FacesConfigurator - Configuration objects do not support clean-up. Update aborted 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE RESTORE_VIEW(1) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE RESTORE_VIEW(1) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE APPLY_REQUEST_VALUES(2) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE APPLY_REQUEST_VALUES(2) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE PROCESS_VALIDATIONS(3) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE PROCESS_VALIDATIONS(3) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE UPDATE_MODEL_VALUES(4) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE UPDATE_MODEL_VALUES(4) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE INVOKE_APPLICATION(5) 
["http-bio-8090"-exec-114] DEBUG Controller - In LogOut 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE INVOKE_APPLICATION(5) 
["http-bio-8090"-exec-114] DEBUG org.apache.myfaces.lifecycle.LifecycleImpl - exiting from lifecycle.execute in INVOKE_APPLICATION(5) because getRenderResponse is true from one of the after listeners 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE RENDER_RESPONSE(6) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE RENDER_RESPONSE(6) 
["http-bio-8090"-exec-116] DEBUG SessionFilter - In doFilter 
["http-bio-8090"-exec-116] DEBUG SessionFilter - request:http://my homepage url 
["http-bio-8090"-exec-116] DEBUG SessionFilter - No id found Exception: 
java.lang.NullPointerException 

.

은 내가 faces-config.xml

<navigation-rule> 
    <from-view-id>/jsp/Services.jsp</from-view-id> 
    <navigation-case> 
     <from-outcome>loggedout</from-outcome> 
     <to-view-id>/others/Logout.jsp</to-view-id> 
    </navigation-case> 
    </navigation-rule> 

에서 다음 탐색 규칙이 그러나이 navigation-rule은 실행되지 않습니다. 대신에 RENDER_RESPONSE 단계에서 동일한 홈 페이지 URL을 다시로드하려고 시도합니다. 분명히 NullPointerException을 던지는 세션에 id이 없습니다.

위의 각 폴더에 jsp가 있습니다. JSF 1.2 및 myFaces 1.2.9를 사용하고 있습니다.

1) 탐색 케이스가 실행되지 않는 이유는 무엇입니까?

2) 다시 내 홈페이지 URL을 다시로드하는 이유는 무엇입니까?

누군가의 도움을주십시오.

답변

0

이것이 tr : commandLink의 JSF.Not 문제와 관련한 로그 아웃 문제라는 것을 알게되었습니다.

그래서 여기 JSF 로그 아웃 문제에 대한 게시물을 읽고 구현했습니다.

예상대로 작동합니다.

+0

안녕하세요. Sreeram! 고정 된 것에 대해 좀 더 자세하게 설명해 주실 수 있습니까? Tomcat에 재배포 한 후 "JSF 프로젝트에서"org.apache.myfaces.config.FacesConfigurator - 구성 객체가 정리를 지원하지 않습니다. 업데이트가 중단되었습니다. "라는 오류 메시지가 나타납니다. 최악의 경우는 어떤 종류의 무작위적인 것입니다. 때로는 때로는 제대로 작동합니다. –

관련 문제