Tôi đã xem nhiều bài viết về chủ đề này nhưng không thể nhận được giải pháp hoạt động trong trường hợp của tôi.Chuyển hướng sau thời gian HttpSession ra
Tôi đang sử dụng Java EE 6 với JSF 2.0 (triển khai trên JBoss AS 7.1)
Trong web.xml
của tôi, tôi có:
<session-config>
<session-timeout>1</session-timeout>
</session-config>
và tôi muốn người dùng được chuyển hướng đến trang đăng nhập khi phiên tự động hết giờ.
những gì tôi đã cố gắng:
Cách tiếp cận 1: sử dụng bộ lọc
Tôi đã thử các bộ lọc sau:
@WebFilter()
public class TimeOutFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
System.out.println("filter called");
final HttpServletRequest req = (HttpServletRequest) request;
final HttpSession session = req.getSession(false);
if (session != null && !session.isNew()) {
chain.doFilter(request, response);
} else {
System.out.println("Has timed out");
req.getRequestDispatcher("/logon.xthml").forward(request, response);
}
}
@Override
public void destroy() {
}
}
Trong web.xml
Tôi đã thử
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
và
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
Bộ lọc hoạt động như được gọi trên mọi yêu cầu (ghi nhật ký "fiter được gọi là" trong bảng điều khiển). Tuy nhiên, nó không được gọi khi phiên họp hết giờ.
Phương pháp 2: HttpSessionLister
Tôi đã cố gắng sử dụng một HttpSessionListerner
. Phương thức được gọi có chữ ký sau:
public void sessionDestroyed(HttpSessionEvent se) {
}
Tôi không thể chuyển hướng đến một trang cụ thể. Khi tôi muốn chuyển hướng người dùng, tôi thường sử dụng số NavigationHandler
từ FacesContext
nhưng trong trường hợp này không có FacesContext
(FacesContext.getCurrentInstance()
trả về null
).
Theo điều này post, HttpListener không thể chuyển hướng người dùng vì nó không phải là một phần của yêu cầu.
Câu hỏi
cách tốt nhất để đi đến giải quyết vấn đề này là gì? Tôi có thể làm gì để thực hiện một trong hai cách tiếp cận trên để làm việc?
liên quan: http://stackoverflow.com/q/ 4992526/1065197 –
@LuiggiMendoza: Cảm ơn bạn rất thú vị. Mặc dù tôi chưa bao giờ thấy 'ViewExpiredException' và tôi muốn, nếu có thể, để chuyển hướng đến trang đăng nhập mà không cần người dùng phải nhấp vào bất kỳ thứ gì. – phoenix7360
Bạn cần một số hình thức bỏ phiếu ở phía khách hàng để kích hoạt 302 ở phía máy chủ của bạn. một nhịp tim ... –