解决vue+springboot先后端分离项目,前端跨域访问sessionID不一致致使的session为null问题

问题: 前端跨域访问后端接口, 在浏览器的安全策略下默认是不携带cookie的, 因此每次请求都开启了一次新的会话. 前端

在后台打印sessionID咱们会发现, 每次请求的sessionID都是不一样的, 既然每次请求都是一个新的会话, 那咱们去获取session的时候天然就是null了.vue

解决办法以下: java

环境: ios

vue 2.0web

springboot 2.1.6spring

 

1、前端部分

1.  在vue引入axios的位置添加如下代码axios

import axios from 'axios' axios.defaults.withCredentials = true;// 容许跨域携带cookie

  

2、后台部分

1. 新建一个FilterConfig类, 编写一个拦截器类后端

/** * 容许跨域请求 * @author Administrator * */
import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.*; @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", "*"); response.setHeader("Access-Control-Allow-Credentials", "true");//是否支持cookie跨域
        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
        return true; } }

 2. 在建立一个SpringMVCConfig类, 请用拦截器跨域

/** * 启用跨域配置 * 编写SpringMVCConfig类使用FilterConfig中的配置 * @author Administrator * */
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("/**"); } }

 问题解决, 重启工程后咱们再次打印每次请求的sessionID就会发现sessionID是一致的, 固然也就能够获取咱们存入session的内容了.浏览器

System.out.println(request.getSession().getId());
相关文章
相关标签/搜索