后端将用户的信息保存在session中,以便进行用户是否登陆的判断或从session中拿取用户信息。

我首先将验证码放在了session中,而后又从session中拿取验证码来和用户输入的验证码比较。在swagger的测试页面的时候未发现问题(因为没有跨域),但当我在vue里使用的时候却出现了登陆失败的情况。检查后发现cookie的JSESSIONID每次发送的都不一样,造成了后端每次都认为是新的会话。困扰许久,查了很多资料
下面奉上解决方法

  1. 首先配置axios请求,允许其携带cookie
import axios from 'axios'
axios.defaults.withCredentials=true
  1. 在后端WebConfigurer中加入,来解决跨域的问题
    这里注意 .allowedOrigins("前端的域名")//前端哪些域名可以跨域这个域名一定不能是*(允许所有跨域)`,否则会报错
@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")//项目中所有接口都支持跨域
            .allowedOrigins("前端的域名")//前端哪些域名可以跨域
            .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")//允许所有请求方式
            .allowCredentials(true)//自己的的项目需要带cookie凭证
            .maxAge(3600)//跨域允许时间
            .allowedHeaders("*");//请求信息所有
}
  1. 而后还要将自己的项目配置上https(secure为true时,服务只能通过https来进行cookie的传递,使用http服务无法提供服务)
    后端配置https需要下载证书。配置过程可以看这里 https://blog.csdn.net/weixin_51751522/article/details/121232947
  2. 此时后端配置完https后我在火狐和360急速浏览器上已经可以实现在一次会话中cookie的JSESSIONID一致了。但是谷歌上不行,可能是因为谷歌对cookie要求更严格
    在这里插入图片描述

当我将vue也配置上https访问后,谷歌发送请求的cookie的JSESSIONID也一致了。
vue只需要在webpack.dev.conf.js中加上这句就可以开启本地https
在这里插入图片描述

  1. 当浏览器关闭后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);
  1. 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。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐