2017-11-27 1 views
0

우리 응용 프로그램에는 PostConstruct 주석을 사용하여 init() 메서드에서 로그인 한 후로드되는 대시 보드가 있습니다.로그인 후 PostConstruct 메서드가 호출되지 않습니다

세션이 만료 될 때까지 모든 것이 정상적으로 작동합니다. 이 순간, 대시 보드에서 버튼을 클릭하면이 init 메소드가 다시 호출됩니다. 로그인하지 않은 경우 로그인 페이지로 리디렉션됩니다. 이제 로그인하면 PostConstruct 메소드가 이 아닌이됩니다. 더 이상 불려지고 대시 보드의 내용을로드 할 수 없습니다.

저는 PostConstruct가 세션이 생성 된 후에 한 번만 호출된다는 것을 알고 있습니다 (컨트롤러 클래스는 @SessionScoped 임). 나는 문제가 서버가 시간 초과 후에 로그인 전에 으로 불려서 로그인 후에 다시 호출되지 않기 때문에 서버가 시간 초과 후 새 세션을 생성한다는 것입니다. 이 문제를 해결하는 가장 좋은 해결책은 무엇입니까?

한 가지 해결 방법은 대시 보드의 내용을 PostConstruct로 주석 처리되지 않은 방법으로로드하는 것입니다. 그러나 문제가 다르게 해결 될 수 있는지 궁금합니다.

+0

시작 알아 내기로하고 prebent하려고 그 – Kukeltje

답변

0

사용자 세션의 상태를 모니터링하기 위해 서블릿 필터를 구현할 수 있습니다. 이렇게하면 Managed Bean에서 만료 된 세션을 감지하여 init 메소드가 호출되지 않습니다.

public class UriFilter implements javax.servlet.Filter { 
    @Inject SessionController session; 
    private static final String SIGNON_PAGE_URI = "/myappname/engine/index.xhtml"; 
    private static final String SUBDOMAIN_URI = "/myappname/engine/"; 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletResponse res = (HttpServletResponse)response; 
     HttpServletRequest req = (HttpServletRequest)request; 
     String uri = ((HttpServletRequest) request).getRequestURI(); 
     if(!this.authorize(req) && !(uri.endsWith("/") || uri.endsWith("index.xhtml") || !uri.endsWith(".xhtml"))){ 
      if(request.getParameter("fileName") != null) 
       res.sendRedirect(SIGNON_PAGE_URI+"?uri="+uri.substring(SUBDOMAIN_URI.length(), uri.length())+"?fileName="+request.getParameter("fileName")); 
      else { 
       res.setHeader("Cache-Control","no-cache, no-store, must-revalidate"); 
       res.setHeader("Pragma","no-cache"); 
       res.setDateHeader("Expires",0); 
       res.sendRedirect(SIGNON_PAGE_URI+"?faces-redirect=true"); 
      } 
     } else{ 
      //Desativa o cache do browser 
      res.setHeader("Cache-Control","no-cache, no-store, must-revalidate"); 
      res.setHeader("Pragma","no-cache"); 
      res.setDateHeader("Expires",0); 
      //Processa request e response 
      chain.doFilter(req, res); 
     } 


    } 

    private boolean authorize(HttpServletRequest req){ 
     boolean authorized = false; 
     HttpSession session = req.getSession(false);   
     if(session != null){ 
      if(this.session != null) { 
       if(this.session.getLogged() != null) { 
        authorized = true; 
       } 
      } 
     } 
     return authorized; 
    } 

    @Override 
    public void destroy() { 

    } 


} 

SessionController은 로그인 한 사용자를 추적하려면 @SessionScoped입니다 : 같은

이 필터는 보일 수 있습니다. 당신의 web.xml 파일에서

당신은 필터를 지정해야합니다 : 소위

<filter> 
     <filter-name>URI Filter</filter-name> 
     <filter-class>com.myappname.filter.UriFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>URI Filter</filter-name> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>/engine/*</url-pattern> 
    </filter-mapping> 
관련 문제