springboot+vue前后端分离cookie--session问题
后端将用户的信息保存在session中,以便进行用户是否登陆的判断或从session中拿取用户信息。我首先将验证码放在了session中,而后又从session中拿取验证码来和用户输入的验证码比较。在swagger的测试页面的时候未发现问题(因为没有跨域),但当我在vue里使用的时候却出现了登陆失败的情况。检查后发现cookie的JSESSIONID每次发送的都不一样,造成了后端每次都认为是新的会
后端将用户的信息保存在session中,以便进行用户是否登陆的判断或从session中拿取用户信息。
我首先将验证码放在了session中,而后又从session中拿取验证码来和用户输入的验证码比较。在swagger的测试页面的时候未发现问题(因为没有跨域),但当我在vue里使用的时候却出现了登陆失败的情况。检查后发现cookie的JSESSIONID每次发送的都不一样,造成了后端每次都认为是新的会话。困扰许久,查了很多资料
下面奉上解决方法
- 首先配置axios请求,允许其携带cookie
import axios from 'axios'
axios.defaults.withCredentials=true
- 在后端WebConfigurer中加入,来解决跨域的问题
这里注意.allowedOrigins("前端的域名")//前端哪些域名可以跨域
这个域名一定不能是*
(允许所有跨域)`,否则会报错
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")//项目中所有接口都支持跨域
.allowedOrigins("前端的域名")//前端哪些域名可以跨域
.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")//允许所有请求方式
.allowCredentials(true)//自己的的项目需要带cookie凭证
.maxAge(3600)//跨域允许时间
.allowedHeaders("*");//请求信息所有
}
- 而后还要将自己的项目配置上https(secure为true时,服务只能通过https来进行cookie的传递,使用http服务无法提供服务)
后端配置https需要下载证书。配置过程可以看这里 https://blog.csdn.net/weixin_51751522/article/details/121232947 - 此时后端配置完https后我在火狐和360急速浏览器上已经可以实现在一次会话中cookie的JSESSIONID一致了。但是谷歌上不行,可能是因为谷歌对cookie要求更严格
当我将vue也配置上https访问后,谷歌发送请求的cookie的JSESSIONID也一致了。
vue只需要在webpack.dev.conf.js中加上这句就可以开启本地https
- 当浏览器关闭后cookie中的sessionid失效
因为默认情况下,当getSession()后,session就被被创建。session在创建时,服务器会通过Cookie返回session 的ID给浏览器,之后服务器根据浏览器Cookie里的session的ID来分辨不同用户。但是,这种方法返回的cookie是保存在浏览器的内存中,浏览器关闭后内存会被清理,所以在session在关闭浏览器后就失效了。虽然在服务器保存的session会在在有效期后才会被销毁,但是用户的cookie里没有session的ID,服务器就不能判断出当前用户是否是原先的那个用户。
解决方法
我们可以创建一个新的CooKie,该Cookie的名字为jsession,path为WEB应用的虚拟路径,并设置setMaxAge()的毫秒值,让Cookie保存在客户端的硬盘中,这时即使多次对浏览器进行关开操作是不会清除客户端硬盘文件的。所以,Cookie就不丢失了,SessionId也不会随浏览器关闭而丢失。
Cookie cookie = new Cookie("JSESSIONID",httpServletRequest.getSession().getId());
cookie.setPath(httpServletRequest.getContextPath()+"/");
cookie.setMaxAge(6*60*60);
httpServletResponse.addCookie(cookie);
-
Cookie的不可跨域名性
很多网站都会使用Cookie。例如,Google会向客户端颁发Cookie,Baidu也会向客户端颁发Cookie。那浏览器访问Google会不会也携带上Baidu颁发的Cookie呢?或者Google能不能修改Baidu颁发的Cookie呢?答案是否定的。Cookie具有不可跨域名性。根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。
Cookie在客户端是由浏览器来管理的。浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie。
更多推荐
所有评论(0)