栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

用比喻法来彻底理解cookie、session、token的区别

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用比喻法来彻底理解cookie、session、token的区别

因为http是无状态的,但是用户每次将商品加入购物车时,就不知道这个客户是谁,继而不知道将商品加入到谁的购物车中

首先用通俗的语言来解释:

一、cookie就类似于纸质笔记本,服务器就像老师,浏览器就像学生,每次学生请教老师问题,老师就告诉学生答案,学生自己将问题和答案记在自己的笔记本上。下次学生再请教老师问题的时候,也要带着自己的笔记本去,这样老师就知道这个学生之前问过哪些问题,以便更好地知道学生的掌握情况。

当浏览器第一次请求服务器,服务器就是生成一个key=value的数据,放在http响应头的set-cookie属性中,浏览器看到了就会保存到本地,下次请求这个地址,就会自动带上。服务器通过http请求头的set-cookie属性值,就知道这个请求是谁发的。

老师有时候不知道这个笔记本是不是这个学生的,所以cookie可以被盗取。

二、session就像工牌,每个人身上的工牌只保存姓名和工号,详细的信息,例如部门、职位、工位等信息,都是保存在公司物业的名单上的

员工每次请求物业,物业就知道这个员工是谁,以及之前做过什么操作

为什么有了cookie,还要使用session?
1、如果浏览器禁用cookie,就会出现问题
2、如果将账户信息保存在cookie中,一旦数据被截取,就会存在数据泄漏

cookie是存储在客户端方,Session是存储在服务端方,客户端只存储SessionId

session是tomcat等容器创建的,也是tomcat来维护

如果服务器是多台,就可以将session存放到redis中

三、token就类似于令牌,服务器并不存储,只是签发,让浏览器存储。就像一个土匪窝给每个土匪都发了一块令牌,土匪之间可能不认识,土匪窝的门卫也不认识每一个人,但是门卫只需要校验这个令牌是不是真的就行,这个令牌基本无法伪造,因为它的加密方式,只有制作者知道。每次请求的时候,服务器的任务只是验证令牌的真实性,防止伪造。

这三种方式,如何使用代码实现?常用哪一种?

一、cookie登录用代码如何实现

在controller层的post调用方法中,写如下代码:
cookie c = new cookie(“name”,“jenkins”);
resp.addcookie©;
就可以在客户端的接受的http响应的响应头中看到:
Set-cookie: name=jenkins
其中,Set-cookie是key,name=jenkins是value,name是key,jenkins是value

二、session登录如何实现

在controller层的post调用方法中,写如下代码:
HttpSession session = request.getSession(true);
tomat容器就是自动生成sessionid放在http响应头的中
Set-cookie: JSESSIonID=3A21BE36578FC09777D3E33FE8561407; Path=/; HttpOnly
其中,Set-cookie是key,JSESSIonID=3A21BE36578FC09777D3E33FE8561407是value,JSESSIONID是key,3A21BE36578FC09777D3E33FE8561407是value

//绑定对象
void session.setAttribute(String name,Object boj);
//获取绑定对象
Object session.getAttribute(String name);
//移除绑定对象
void session.removeAttribute(String name);
//删除session对象
session.invalidate();

代码示例:

@RequestMapping("/testSessioon")
    @ResponseBody
    public String testSession(HttpServletRequest httpServletRequest){
        HttpSession session = httpServletRequest.getSession(true);
        //通过生成的session,绑定一对数据
        session.setAttribute("testSession", "this is my session");
        return "testSession";
    }
 @RequestMapping("/testGetSessioon")
    @ResponseBody
    public String testGetSession(HttpServletRequest httpServletRequest){
        //在控制台打印sessionId
        System.out.println(httpServletRequest.getSession().getId());
        //接收客户端带过来的sessionId
        //获取该session中存储的值,通过key获取value
        Object testSession = httpServletRequest.getSession().getAttribute("testSession");
        return String.valueOf(testSession);
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/292088.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号