Maison > Questions et réponses > le corps du texte
拦截器代码(想实现的功能就是如果当前 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 的值。请问这是什么原因呢,解决办法是什么?
高洛峰2017-04-18 10:50:55
Lorsque
SpringMVC
intercepte la demande ajax
, response.sendRedirect
ne peut pas sauter normalement. Vous pouvez déterminer s'il s'agit d'une demande ajax
. Si tel est le cas, renvoyez un message à la réception, et la réception accédera à la page de connexion après l'avoir reçu.
@Override
public 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;
}