![](/img/trans.png)
[英]Save flash message on database after “addFlash” method is called on Symfony Controller
[英]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.