1.测试过程中修改web.xml中的超时时间单位分钟,便于测试;
2.配置过滤器
3.session超时有两种情况;
一种是普通请求,即发起请求返回视图和模型;另外一种是Ajax请求,主要返回模型数据。后端进行处理时就要根据不同的请求返回不同的内容。
对于普通请求,我们直接返回JavaScript脚本,脚本内容可以是将页面跳转到登录页面。
对于Ajax请求,则需要返回非200的状态码,这样ajax请求才会进入到error回调函数中以及全局的Ajax错误回调函数AjaxError中。
4.后端拦截器在preHandle()中处理session超时
public class ParamsInterceptor extends HandlerInterceptorAdapter {
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object o) throws Exception {
Map paramsMap = request.getParameterMap();
for (Iterator<Map.Entry> it = paramsMap.entrySet().iterator(); it.hasNext(); ) {
Map.Entry entry = it.next();
Object[] values = (Object[]) entry.getValue();
for (Object obj : values) {
String oldStr = obj.toString();
String newStr = StringUtil.StringFilter(oldStr);
if (!oldStr.equals(newStr)) {
throw new ParamsUncheckException();
}
}
}
BossUser bossUser = (BossUser) request.getSession().getAttribute("user");
String uri = request.getRequestURI();
if (bossUser == null) {
response.setContentType("text/html;charset=UTF-8");
if (request.getHeader("x-requested-with") != null
&& request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
// Ajax请求, 前端根据此header进行处理
response.setHeader("sessionTimeout", "Session time out, you need relogin !");
// 返回未认证的状态码(401)
response.setStatus(HttpStatus.UNAUTHORIZED.value());
//System.out.println("请求路径:" + uri + ", 请求方式 :Ajax请求, Session超时, 需要重新登录!");
}
}
return super.preHandle(request, response, o);
}
public void postHandle(HttpServletRequest hsr, HttpServletResponse hsr1,
Object o, ModelAndView mav) throws Exception {
}
public void afterCompletion(HttpServletRequest hsr,
HttpServletResponse hsr1, Object o, Exception excptn)
throws Exception {
}
}
通过获取Session中的User对象是否存在来判断Session是否超时,如果Session超时,则根据不同的请求方式进行返回。如果是普通请求,则直接返回JavaScript脚本,该脚本可以将页面跳转到其它URL。如果是Ajax请求,则返回401状态码,并且在返回的header中加入sessionTimeout,该数据将会在前端使用。
5.在使用ajax请求的前端页面处理拦截器发来的数据
对于普通请求,后端返回的是JavaScript脚本,会立刻执行,这里前端不需要任何处理。
对于Ajax请求,后端返回401状态码,并在header中设置的sessionTimeout。这里使用jQuery的ajaxComplete回调函数处理,具体如下:
测试可以正常拦截处理,大功告成!
在此感谢以下两位博主的分享,特附链接;
https://blog.csdn.net/u012383839/article/details/53727008
https://www.cnblogs.com/jpfss/p/9487235.html
注:如有问题可以回复,看到第一时间分析解决,码农不易,感觉对您有用,帮助到您,可否打赏一杯可乐,在此谢过诸位,愿诸君终成大神,前程似锦~~~