springboot-vue前后端分离项目跨域session不一致的问题

本文详细探讨了在SpringBoot和Vue项目中遇到的跨域问题,重点解决了前后端分离场景下session不一致的挑战,通过配置前端axios和后端过滤器,确保cookie跨域携带,从而保持会话状态的一致性。

1.待解决的问题

待解决问题:
1.springboot+vue前后端分离项目的跨域问题
2.springboot+vue前后端分离项目跨域每次访问后端接口sessionid不一致的问题

2.问题分析

问题分析:
前后台分离项目session不能获取到的原因是因为跨域导致请求无法携带和服务器对应的cookie,不是因为前后台分离!前后台分离项目涉及跨域,所以导致每次请求的sessionid不一致

那各位就会有疑问了,为什么浏览器会产生跨域问题呢?那就牵扯到浏览器的同源保护机制了
同源策略是浏览器保证安全的基础,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页同源。
所谓同源是指:
1.协议相同
2.域名相同
3.端口相同

3.问题的解决

1.1、如果前后端项目不进行任何配置,前端直接访问后端,会在浏览器中报“NETWORK”错误,也就是跨域错误,具体报错如下
在这里插入图片描述

1.2、后端再被访问的控制层上添加跨域注解@CrossOrigin,即可解决问题一
在这里插入图片描述

2.1、解决完问题一后启动项目,进行访问,你会发现尽管你在登录成功后将用户的信息存入到了session中,你在后面还是会取不到session中的值
在这里插入图片描述细心的人会发现上面两次请求的session对象不一样

2.2、于是我发送了多次请求,但是每次请求中传递的session都不一样,如下:
在这里插入图片描述2.3百度后得知是因为每次请求都不会默认携带cookie,而传统的请求中会使用cookie + session的机制进行session的校验,因此我们只需要在前后端进行请求携带cookie的配置即可

前端配置:在封装的axios(即request.js)中,进行如下配置
在这里插入图片描述前端进行了请求cookie的携带,那么后端也需要进行相关的cookie接收

后端配置:
创建过滤器:
在这里插入图片描述

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("########进入到了过滤器中{}",filterChain);
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setHeader(“Access-Control-Allow-Origin”, request.getHeader(“Origin”));
response.setHeader(“Access-Control-Allow-Methods”, “POST, GET, OPTIONS, DELETE”);
response.setHeader(“Access-Control-Max-Age”, “3600”);
response.setHeader(“Access-Control-Allow-Headers”, “Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token”);
response.setHeader(“Access-Control-Allow-Credentials”,“true”); //是否支持cookie跨域
filterChain.doFilter(servletRequest, servletResponse);
}

创建过滤器的配置类在这里插入图片描述

@Configuration
public class LoginFilterConfiguration {
@Bean
public RegistrationBean myFilter(){
LoginFilter loginFilter = new LoginFilter();
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(loginFilter);
filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
return filterRegistrationBean;
}
}

完成以上配置后,就会解决问题一和问题二了,有什么问题,在评论区说吧,看到会回复的

Vue前后端分离的开发模式下,如何处理Session问题是一个常见的需求。由于前后端分离的特点,前端与后端之间的通信是通过API接口进行的,因此在处理Session时需要考虑如何保持用户的登录状态。 一种常见的方式是使用Token来管理Session。当用户成功登录后,后端会生成一个Token,并将其返回给前端。前端在后续的请求中需要将该Token携带在请求的Header中,以便后端进行鉴权。后端在接收到请求时,会验证Token的有效性,如果验证通过,则继续处理请求,否则返回错误信息。 在前端中,可以使用localStorage或者cookie来保存Token。当用户访问页面时,前端可以先尝试从localStorage或cookie中获取Token,并将其添加到请求的Header中,以保证用户的登录状态。当用户退出登录时,前端需要删除保存的Token,以确保下次访问时用户需要重新登录。 当然,为了增强安全性,可以在Token中加入一些额外的信息,如过期时间、权限等,以确保用户的身份和授权信息的有效性。 此外,还可以使用JWT(JSON Web Token)来管理Session。JWT是一种基于JSON的开放标准,可以用于在某些信任的环境中安全地传输信息。JWT由头部、载荷和签名三部分组成,其中载荷部分可以储存用户的数据,例如用户ID、用户名等。通过对头部和载荷进行签名,可以保证JWT的完整性和可信度。 总而言之,Vue前后端分离Session管理可以通过Token或JWT来实现。这样可以实现用户的登录状态的保持,并且提供一定的安全性保障。
评论 24
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值