由于前后端分离,前端使用的是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;
}
}
}
强烈推荐参考:SpringBoot加了拦截器后出现的跨域问题解析