java - AJAX 请求时,SpringMVC 拦截器无法获得 session 中的值
问题描述
拦截器代码(想实现的功能就是如果当前 Session 中有 user,那么就可以访问页面和使用 AJAX 请求):
public class UserLoginInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HttpSession session = request.getSession();if (session.getAttribute('user') != null) { return true;}request.getRequestDispatcher('/WEB-INF/views/page/user/login.jsp').forward(request, response);return false; }}
该拦截器拦截了所有的方法(/**),对于返回 ModelAndView 的控制器方法对应的路径,拦截器可以正常获得 session 的值;但是对于 AJAX 访问的控制器方法(被 @ResponseBody 注解的方法)对应的路径,拦截器却无法获得 session 的值。请问这是什么原因呢,解决办法是什么?
问题解答
回答1:SpringMVC拦截ajax请求时,response.sendRedirect不能正常跳转。你可以判断是否为ajax请求,如果是,给前台返回一个信息,前台收到后跳到登录页。
@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); if (session.getAttribute('user') != null) {return true; } // 如果是ajax请求,请求头会有x-requested-with String requestWith = request.getHeader('x-requested-with'); if (requestWith != null && requestWith.equalsIgnoreCase('XMLHttpRequest')){ServletOutputStreamout = rep.getOutputStream();out.print('unlogin');//返回给前端页面的未登陆标识out.flush();out.close(); } else {response.sendRedirect('/WEB-INF/views/page/user/login.jsp'); } return false;}