繁体   English   中英

登录后将不会调用PostConstruct方法

[英]PostConstruct method will not be called after login

在我们的应用程序中,我们有一个仪表板,该仪表板将在登录后从带有PostConstruct批注的init()方法中加载。

一切正常,直到会话过期。 此时,如果我单击仪表板中的按钮,虽然我尚未登录,但该init方法将再次被调用。我将被重定向到登录页面,现在如果我登录,将不再调用PostConstruct方法。并且无法加载仪表板的内容。

我知道创建会话后,PostConstruct将仅被调用一次(Controller类为@SessionScoped)。 我猜问题是服务器在超时后创建了一个新会话,因为init方法超时和登录之前被调用,导致在再次登录后不再被调用。 解决此问题的最佳解决方案是什么?

一种解决方法是以一种未用PostConstruct注释的方法加载仪表板的内容。 但是我想知道问题是否可以通过其他方式解决。

您可以实现Servlet过滤器以监视用户会话的状态。 这样,您将在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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM