SpringBoot和Vue跨域Session不是同一个怎么解决(不用Redis)
在使用Vue和SpringBoot做前后端分离项目时,会出现以下问题:
- 前端直接请求数据会出现跨域访问限制的问题。
- 如果登录的时候我们在Session域中保存了UserLogin,然后为了防止用户直接在不登录的情况下访问主页面,我们还要判断Session域中是否有UserLogin。这个时候,我们会发现访问的Session不是同一个(想知道是不是同一个Session,我们可以调用HttpSession对象的isNew方法判断是不是同一个Session。)
有些人可能在Controller上面加了@CrossOrigin注解来解决上面的第一个数据跨域问题。但是@CrossOrigin注解并不能解决第二个问题,因为第二个问题的主要原因是我们的Cookie并没有跟着一起跨域,这才导致我们的Session在不同的请求下都会创建一个新的Session。
所以,这个问题就很好解决了,我们只需要写一个拦截器,拦截素有的请求,并且让所有的请求都能够处理数据和Cookie的跨域就可以啦。
需要添加的详细代码如下:
FilterConfig.java
package com.example.boot.config;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class FilterConfig implements HandlerInterceptor {
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
}
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2)
throws Exception {
}
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
//支持跨域请求
response.setHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", "*");
//支持cookie跨域
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", "Authorization,Origin, X-Requested-With, Content-Type, Accept,Access-Token");//Origin, X-Requested-With, Content-Type, Accept,Access-Token
//如果使用REST风格的话,还需要加上下面这句,允许这些请求方法跨域
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT, OPTIONS");
return true;
}
}
SpringMVCConfig.java(注意:我把SpringMVCConfig.java和上面的FilterConfig.java放在同一个包下了,所以这里并不需要导入FilterConfig,切记不要导入spring的FilterConfig)
package com.example.boot.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@SuppressWarnings("deprecation")
@SpringBootConfiguration
public class SpringMVCConfig extends WebMvcConfigurerAdapter{
@Autowired
private FilterConfig filterConfig;
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(filterConfig).addPathPatterns("/**");
}
}
然后我们在Vue下面添加这个:
axios.defaults.withCredentials = true
为了防止路人不知道这一句加在哪里,这里给个提示(在你配置响应拦截器的那个页面的上面,如下图所示)
之后我们就可以去掉Controller上面的@CrossOrigin注解啦(如果有加这个注解的话,当然不删掉也是可以的)