关于session和cookie

说到session和cookie,想必大家都不会陌生,正巧前些天看了一些这方面的知识,所以结合自己的理解,整理记录一下,希望能对小伙伴有些帮助。

1.产生原因

在B/S架构中,通常是用http请求的形式来进行前后端(或者说客户端与服务端)的交互,但问题就来了,HTTP是一种无状态协议,即服务器不保留与客户交易时的任何状态(这也是其保持较快的响应速度的原因),所以当多个用户同时请求到服务器的时候,服务器到底应该怎么区分不同的用户呢。所以,能不能让用户请求服务器的时候,服务器给该用户一个独一无二的凭证,这样用户下次请求的时候每次都带上这个凭证(就好比每次都要输入密码),然后服务端根据凭证信息就可以知道是谁发起了请求,这样的话,就可以正确区分不同的用户了。基于这种思想,session和cookie就这样产生了。

2.是什么?

  • session
    基于上面的策略,客户端和服务端都应该需要存储凭证的地方,一个用于发送凭证,一个是收到凭证后在凭证库中查找并核对。所以,理所当然地应该分为两个部分。session就主要是在服务器端工作,服务器会为每个用户创建一个session并放在服务器中,这个session就叫会话。
  • cookie
    cookie自然就是在用户本地工作,是存在用户本地的电脑上的由一个个键值对构成的字符串,它可以持久存储。客户端每次发送请求,就会将cookie的值存放在请求头并发送给服务端。

3.session和cookie的联系

客户端第一次向服务端发送请求的时候,客户端的cookie为空,服务端接收到客户端发来的请求后,先查看cookie中有没有JSESSIONID这一项,如果没有,则认为是这个客户端对应的用户是第一次请求,所以会生成一个新的JSESSIONID来对应该用户,如下图的Response Headers中的Set-Cookie项,这代表着给前端返回JSESSIONID,从此之后该用户的请求就会带着这个JSESSIONID,凭此来证明自己的身份。
在这里插入图片描述可以看到之后发送的请求的Request Headers中的cookie都带有刚刚的JSESSIONID,而且是同一个,并且不会产生新的ID。
在这里插入图片描述
可以说,session的机制的实现必须要借助cookie这个载体,通过cookie承载session的id,达到sessionid从客户端到服务端的传递,从而实现了不同会话的跟踪(最近比较流行的token凭证也是相同的原理,比如jwt)。但反过来则不一样,cookie不需要依赖于session,它可以传递其它任何需要的键值对到服务端,服务端有专门的方法获取。

4.session安全规范

  1. 用户登录前后的session应该发生变化。代码示例
    @GetMapping("/login")
    public UserBean login(HttpServletRequest request, HttpServletResponse response){
        //获取登录前session
        HttpSession preSession=request.getSession();
        //若session中带有参数,则先在这里获取并保存参数
        //...
        //然后销毁登录前的session
        preSession.invalidate();
        //登录操作
        UserBean userInfo=doLogin();
        //获取登录后的session
        HttpSession afterSession=request.getSession(true);
        //将刚才保存的参数在这里赋值给新的session
        //...
        return userInfo;
    }

这是登录前的sessionid
在这里插入图片描述
这是登录后的sessionid
在这里插入图片描述
经处理可以看到两次的sessionid已经不一致了。相应的,用户退出登录,也应该改变sessionid,代码如下:

    @GetMapping("/loginout")
    public void logout(HttpServletRequest request){
        HttpSession session=request.getSession(true);
        if(session!=null){
            //注销的时候注意销毁session
            session.invalidate();
        }
    }
  1. session应该主动设置过期时间。
session.setMaxInactiveInterval()

5.其它补充

  1. 后台给前端设置cookie的方法是response.setCookie(cookie),需要注意以下两个方法。

    cookie.setMaxAge(); //若不设置该项,则每次关闭浏览器就清除cookie,和session的生命周期保持一致。
    cookie.setPath(); //默认值是/,即项目域名根目录下,若设置为/demo ,则只有域名下/demo地址才能获取到该cookie

  2. cookie后面带有HttpOnly的意思是安全传输,只能在http传输过程中可以读取,用浏览器的方式无法读取到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值