1. Cookie,Session他们之间的区别?
参考掘金好文
关于cookie和session的分析:
? 先说说背景,了解什么是cookie和session,为什么需要cookie和session。
? http是无状态协议 ,就是说服务端对每一次请求都是无记忆的,因此服务端就不知道,这个请求的用户登录没有?,有没有访问权限?。因此cookie和session就是用来记录用户信息进行会话跟踪 ,从而让服务端区别是哪个用户发来的请求的。当客户端第一次请求服务端时,服务端就会生成一个cookie和session ,将sessio保存在服务器中,将cookie添加到http响应报文中返回给客户端,后续客户端每次对服务端进行请求时都会带上sessionID ,服务端通过sessionID区分不同用户发送的请求。
? 简单理解cookie和session就是两个用于存放用户信息的数据结构,一个保存在客户端,一个保存在服务端。cookie可以由服务端和客户端生成,session只能由客户端生成,两者配合共同完成记录会话信息的功能。
http响应报文的首部行
Set-Cookie = xxxx sessionID + cookie创建信息
两者对比:
回答角度 | cookie | session |
---|
存储位置 | 保存在客户端 | 保存在服务端 | 存储数据容量 | <= 4kb | 无限制,但会占用服务端内存资源,一般不存储太多 | 存储的时长 | 可以长期保存 | 关闭浏览器超过一定时间(30分钟)就会自动删除 | 两者的安全性 | 保存在服务端相对更安全,不存在信息泄露风险 | 保存在客户端,cookie可能被窃取导致信息泄露 | 是否占用服务端资源 | 保存在客户端,不占用服务端资源 | 保存在服务端,占用资源 | 存储的数据类型 | 只能保存字符串类型 | 任意类型 | 创建方 | 可以由客户端发起创建,也可以由前端发起创建 | 只能由服务端创建 | | | | | | |
如何在Java中创建和设置Cookie和Session?
- 写入cookie --> http响应报文,set-cookie字段写入cookie数据到浏览器
- 编写一个Controller,加入
HttpServletResponse response 参数 - new 一个Cookie,设置相关属性
- 将cookie实例添加到response中即可
- 读取cookie
- 编写一个Controller,加入
HttpServletRequest request 参数 - 通过 request.getCookies() 获取所有该域名下的cookies
- 遍历cookies通过比较cookie.getName() 查找到指定cookie
- 同理,通过request.getSession() 可以获得HttpSession对象。
@GetMapping("/goodsList")
public void getGoodsList(HttpServletRequest request, HttpServletResponse response) {
Cookie cookie = new Cookie("cookieName","cookieValue");
cookie.setHttpOnly(true);
cookie.setMaxAge(60*10);
cookie.setValue("newValue")
response.addCookie(cookie);
}
@GetMapping("/goodsList")
public void getGoodsList(HttpServletRequest request, HttpServletResponse response) {
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
cookie.getName();
}
}
关于cookie和session的补充
- 做分布式集群需要对session做分布式session共享(存到redis中去),否则会导致在机器A上的session在机器B上失效。
- 跨域时,当后端项目向浏览器写入cookie时,
前端项目协议、域名、端口和后端接口的协议、域名、端口必须相同时才能写到浏览器 - 浏览器禁用cookie-session机制,手动传递sessionID,URL重写
- cookie无法跨域共享问题?–》token
参考>>
2. Token是什么?
另一种授权登录方案,主要用于无状态应用,非浏览器应用。。。
- token是代表用户身份的令牌,通常客户端在登录时就发起申请由服务端进行授权签发,里面存放着一些关于用户的合法信息,用于判断请求是否合法(已登录),哪个用户发送的请求
- 用户在登录时通过验证后获得
由服务端签发的token ,由服务端将用户信息加密后写入到token中,因此token中的加密信息都是合法的,可以使用JJWT依赖 完成以上操作。 - 每次请求服务端时,服务端都会对用户携带的token合法性进行验证,有效即可获得token中的信息,进而判断是哪个用户发送的请求。
- 与浏览器隐私策略无关
核心信息:
- token由服务端进行签发
- 服务端可以自由写入数据到token中
- 可以设置token的过期时间
- token不依赖于浏览器,可以让一套API跨端共用(用在小程序,安卓应用,IOS,桌面应用)
- JJWT可选择各种各样的加密算法,例如HS-512等安全的加密算法
|