SSM使用拦截器Interceptor后,跨域失败的解决方案
由于前后端分离,前端使用的是Vue,后端使用的是SSM,所以跨域的解决方案是使用@CrossOrigin注解
@CrossOrigin(origins = "*", allowCredentials = "true")
但是使用SpringMVC的拦截器Interceptor后,就会跨域失败了,拦截器是拦截登录操作,判断用户是否登录
@CrossOrigin(origins = "*", allowCredentials = "true") public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); User user = (User) session.getAttribute("user"); if ("OPTIONS".equals(request.getMethod().toUpperCase())) { return true; } if (user != null) { return true; } else { response.setContentType("application/json;charset=utf-8"); response.getWriter().print(JsonUtil.resp(-1, "用户未登录,不能使用该功能!")); return false; } } }
至于跨域失败的原因是拦截器的preHandle()方法的执行在@CrossOrigin注解之前执行,所以执行不到@CrossOrigin解决跨域,就被拦截了,所以跨域失败。
直接说下解决方案吧,具体原因参考下面给出的参考连接,在拦截器中的preHandle()方法中,添加下面这段代码:
所以修改后拦截器的完整代码为:
@CrossOrigin(origins = "*", allowCredentials = "true") public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); User user = (User) session.getAttribute("user"); if ("OPTIONS".equals(request.getMethod().toUpperCase())) { return true; } if (user != null) { return true; } else { response.setContentType("application/json;charset=utf-8"); response.getWriter().print(JsonUtil.resp(-1, "用户未登录,不能使用该功能!")); return false; } } }
强烈推荐参考: