gpt4 book ai didi

java - HttpSession 超时后重定向

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:54:17 24 4
gpt4 key购买 nike

我一直在查看有关此主题的许多帖子,但找不到适合我的解决方案。

我正在使用 Java EE 6 和 JSF 2.0(部署在 JBoss AS 7.1 上)

在我的 web.xml 中我有:

    <session-config>
<session-timeout>1</session-timeout>
</session-config>

并且我希望在 session 自动超时时将用户重定向到登录页面。

我尝试过的:

方法一:使用过滤器

我试过以下过滤器:

@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() {
}
}

web.xml我试过了

<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>

<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

过滤器在每次请求时都会被调用(在控制台中记录“fiter called”)。 但是当 session 超时时它不会被调用。

方法二:HttpSessionLister

我尝试使用 HttpSessionListerner。调用的方法具有以下签名:

public void sessionDestroyed(HttpSessionEvent se) {
}

我无法重定向到特定页面。当我想重定向用户时,我通常使用 FacesContext 中的 NavigationHandler 但在这种情况下没有 FacesContext (FacesContext. getCurrentInstance() 返回 null)。

根据这个post ,HttpListener 无法重定向用户,因为它不是请求的一部分。

问题

解决这个问题的最佳方法是什么?我该怎么做才能使上述两种方法中的一种起作用?

最佳答案

只要客户端未发送 HTTP 请求,您就无法发送 HTTP 响应。就那么简单。这就是 HTTP 的工作原理。如果任何网站能够在没有客户端请求的情况下不经意地推送 HTTP 响应,那么 Internet 看起来会非常不同。

基于客户端键盘/鼠标 Activity 的基于 JavaScript 的心跳,如回答 here ,或元 refresh header ,如回答 here如果您基本上是一个单页 Web 应用程序(因此,您实际上没有使用 session 范围而是使用 View 范围),这将是解决方案,但如果您在多个选项卡中打开页面,那将不会很好地工作/同一 session 中的窗口。

从理论上讲,Websockets 是向客户端推送内容的正确解决方案,但这反过来又需要一个 Activity session 。先有鸡还是先有蛋的问题。此外,它不适用于目前仍相对广泛使用的旧版浏览器,因此它目前应该仅用于渐进式增强。

最好的办法是只定义一个错误页面来处理最终用户在 session 过期时调用操作的情况。另见 javax.faces.application.ViewExpiredException: View could not be restored .

关于java - HttpSession 超时后重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15573221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com