我正在使用过滤器处理JSF 2.0中的会话到期.这是代码
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
HttpSession session = httpServletRequest.getSession(false);
if (session == null) {
//session timeout check.
if (httpServletRequest.getRequestedSessionId() != null && !httpServletRequest.isRequestedSessionIdValid()) {
System.out.println("Session has expired");
session = httpServletRequest.getSession(true);
session.setAttribute("logedin", "0"); // public user
httpServletResponse.sendRedirect(timeoutPage);
} else {
session = httpServletRequest.getSession(true);
session.setAttribute("logedin", "0");
filterChain.doFilter(httpServletRequest, httpServletResponse);
}
}
} //end of doFilter()
Run Code Online (Sandbox Code Playgroud)
但问题是,当会话到期并且用户点击后退按钮时,他会获得所有样式的页面.无论如何,当会话到期时,如果用户单击浏览器后退按钮,则他会指向timeoutPage.
还有一点,我也在我的页面上使用Prime Faces组件,比如datatable.我正在使用分页.如果会话超时,并且我单击分页,则不会出现会话到期消息.似乎ajax请求不调用过滤器?如何连接我的ajax事件,或者你可以说数据表分页事件到会话到期?
谢谢
当会话到期时,如果用户点击后退按钮,那么他将获得所有样式的页面
您需要告诉浏览器不要将页面缓存在浏览器缓存中.浏览器应该向服务器发送完整请求.
在filterChain.doFilter()调用之前添加以下行.
if (!httpServletRequest.getRequestURI().startsWith(httpServletRequest.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
httpServletResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
httpServletResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0.
httpServletResponse.setDateHeader("Expires", 0); // Proxies.
}
Run Code Online (Sandbox Code Playgroud)
如果会话超时,并且我单击分页,则不会出现会话到期消息.似乎ajax请求不调用过滤器?
JSF ajax请求期望HTTP状态为200的XML响应.如果发送同步重定向,则将发送HTTP状态302响应,JSF ajax引擎将完全忽略该响应.您应该使用特定的XML发送正常的HTTP 200响应,该响应告诉JSF ajax引擎执行重定向.这样做而不是httpServletResponse.sendRedirect():
if ("partial/ajax".equals(httpServletRequest.getHeader("Faces-Request"))) {
httpServletResponse.setContentType("text/xml");
httpServletResponse.getWriter()
.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
.printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", timeoutPage);
}
else {
httpServletResponse.sendRedirect(timeoutPage);
}
Run Code Online (Sandbox Code Playgroud)
请注意,当你已经JSF上下文中(例如,通过PhaseListener或SystemEventListener或者一个@ManagedBean),那么你可以只使用ExternalContext#redirect()方法.它将相应地透明地处理同步/异步请求.
| 归档时间: |
|
| 查看次数: |
7968 次 |
| 最近记录: |