san*_*ngh 1 java browser session jquery servlets
我有一个单页应用程序,使用Jquery编写,后端使用了Java。
会话超时后,如果用户进行了一些触发Ajax调用的活动,则应将用户重定向到登录屏幕。
如果这将是另一个页面请求,那么以下解决方案可能已经奏效,但是由于它是Ajax调用,因此重定向只会对成功函数给出另一个响应。
我试过了
在主过滤器中
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)通过在ajax调用中从主过滤器内部发送以下标头来刷新标签
httpResponse.setHeader("Refresh", "0; URL=" + targetUrl);
Run Code Online (Sandbox Code Playgroud)服务器端:添加一个过滤器,该过滤器将针对每个单个请求进行处理,在该过滤器的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)
对我来说,重新加载就足够了,可以让用户登录屏幕