如何将用户重定向到登录屏幕,如果会话超时后收到ajax呼叫

san*_*ngh 1 java browser session jquery servlets

我有一个单页应用程序,使用Jquery编写,后端使用了Java。

会话超时后,如果用户进行了一些触发Ajax调用的活动,则应将用户重定向到登录屏幕。
如果这将是另一个页面请求,那么以下解决方案可能已经奏效,但是由于它是Ajax调用,因此重定向只会对成功函数给出另一个响应。

我试过了

  1. 在主过滤器​​中

    HttpSession session = request.getSession(false);
    if(session != null && !session.isNew()) {
        chain.doFilter(request, response);
    }else {
        response.sendRedirect("/login.jsp");
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过在ajax调用中从主过滤器内部发送以下标头来刷新标签

    httpResponse.setHeader("Refresh", "0; URL=" + targetUrl);
    
    Run Code Online (Sandbox Code Playgroud)

san*_*ngh 6

服务器端:添加一个过滤器,该过滤器将针对每个单个请求进行处理,在该过滤器的doFilter方法内添加以下代码:

HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;

HttpSession session = httpRequest.getSession(false);// don't create if it doesn't exist
if(session == null || session.isNew()) {
    httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // status code is 401
}else{
    // pass the request along the filter chain
    chain.doFilter(request, response);
}
Run Code Online (Sandbox Code Playgroud)

客户端:配置ajax,使其在接收到任何状态码为401的响应时,将重新加载选项卡或更改window.location。这是使用jquery可以做到的:

$(window).load(function(){
    $.ajaxSetup({
        statusCode: {
            401: function(){
                    location.reload(); // or window.location="http://www.example.com"
                }
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

对我来说,重新加载就足够了,可以让用户登录屏幕