Cookie和Session

目录

1.Cookie

1.1Cookie是什么 ?

 1.2为什么要使用Cookie?以及Cookie的机制

2.Session

 2.1Session是什么?

 2.2具体流程

3.cookie和session常见面试题

3.1Cookie 和 Session 的区别

3.2session产生的session_id放在cookie里面,如果用户把cookie禁止掉,是不是session也不能用了呢?

4.获取Cookie和Session

4.1获取Cookie

4.1.1传统获取Cookie

 4.1.2简洁获取Cookie

4.2获取Session

4.2.1设置Session

4.2.2传统获取Session

4.2.3简洁获取Session1

4.2.4简洁获取Session2


1.Cookie

1.1Cookie是什么 ?

Cookie,其实就是储存在用户本地终端上的数据(通常经过加密),由用户计算机暂时或永久保存的信息,类型为“小型文本文件”。

可以理解是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据。

 1.2为什么要使用Cookie?以及Cookie的机制

HTTP是无状态的,不能保存每次提交的信息,如果用户发来一个新请求,服务器无法知道它是否与上次的请求有联系。

cookie的出现就是为了解决这个问题。

  登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户再次发送请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户的状态。

具体如下图:

此时在服务器这边就需要记录"令牌"信息, 以及令牌对应的⽤⼾信息, 这个就是 Session 机制所做的⼯ 作.

2.Session

我们先来了解⼀下什么是会话?

在计算机领域, 会话是⼀个客⼾与服务器之间的不中断的请求响应,当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了。

 2.1Session是什么?

服务器同⼀时刻收到的请求是很多的. 服务器需要清楚的区分每个请求是从属于哪个⽤⼾, 也就是属于 哪个会话, 就需要在服务器这边记录每个会话以及与⽤⼾的信息的对应关系。
Session是服务器为了保存⽤⼾信息⽽创建的⼀个特殊的对象.
Session的本质就是⼀个 "哈希表", 存储了⼀些键值对结构. Key 就是SessionID, Value 就是⽤⼾信息(⽤ 户信息可以根据需求灵活设计)

​ 

SessionId 是由服务器⽣成的⼀个 "唯⼀性字符串", 从 Session 机制的⻆度来看, 这个唯⼀性字符串称 为 "SessionId". 但是站在整个登录流程中看待, 也可以把这个唯⼀性字符串称为 "token".

 2.2具体流程

1.当⽤⼾登陆的时候, 服务器在 Session 中新增⼀个新记录, 并把 sessionId返回给客⼾端. (通过
HTTP 响应中的 Set-Cookie 字段返回)

 2.客⼾端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId. (通过 HTTP 请求中的 Cookie 字段带上).

 3.服务器收到请求之后, 根据请求中的 sessionId在 Session 信息中获取到对应的⽤⼾信息, 再进⾏后 续操作.找不到则重新创建Session, 并把SessionID返回

注意:

(1)Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失。

(2)同一客户端启动二次session_start的话,session_id是不一样的。 


3.cookie和session常见面试题

3.1Cookie 和 Session 的区别

(1)Cookie 是客⼾端保存⽤⼾信息的⼀种机制. Session 是服务器端保存⽤⼾信息的⼀种机制.

(2)Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁。

(3)Cookie 和 Session 经常会在⼀起配合使⽤. 但是不是必须配合。

Session 中的sessionId 也不需要⾮得通过 Cookie/Set-Cookie 传递, ⽐如通过URL传递。

3.2session产生的session_id放在cookie里面,如果用户把cookie禁止掉,是不是session也不能用了呢?

禁止掉cookie后,session当然可以用,不过通过其他的方式来获得这个sessionid,比如,可以跟在url的后面,或者以表单的形势提交到服务器端。从而使服务器端了解客户端的状态。


4.获取Cookie和Session

4.1获取Cookie

4.1.1传统获取Cookie
   @RequestMapping("getC")
    public String getC(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            Arrays.stream(cookies).forEach(ck -> System.out.println(ck.getName() + " " + ck.getValue()));
        }
        return "获取Cookie成功";
    }
 4.1.2简洁获取Cookie

比如我们获取Cookie的值

@RequestMapping("getC2")
    public String getC2(@CookieValue("wh") String val) {
        return "获取Cookie成功 cookie的值" + val;
    }

4.2获取Session

4.2.1设置Session
    @RequestMapping("setSession")
    public String setSession(HttpServletRequest request) {
        HttpSession session = request.getSession();
        session.setAttribute("name", "wh");
        return "设置成功";
    }
4.2.2传统获取Session
  @RequestMapping("getSession")
    public String getSession(HttpServletRequest request) {
        HttpSession session = request.getSession();
        String name = (String) session.getAttribute("name");
        return "name:" + name;
    }
4.2.3简洁获取Session1
@RequestMapping("getSession2")
    public String getSession(HttpSession session) {
        String name = (String) session.getAttribute("name");
        return "name:" + name;
    }
4.2.4简洁获取Session2
    @RequestMapping("getSession3")
    public String getSession(@SessionAttribute("name") String name) {
        return "name:" + name;
    }

以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值