文章目录
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中即可
- 编写一个Controller,加入
- 读取cookie
- 编写一个Controller,加入
HttpServletRequest request
参数 - 通过 request.getCookies() 获取所有该域名下的cookies
- 遍历cookies通过比较cookie.getName() 查找到指定cookie
- 编写一个Controller,加入
- 同理,通过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") //重新设置cookei值
response.addCookie(cookie);
}
@GetMapping("/goodsList")
public void getGoodsList(HttpServletRequest request, HttpServletResponse response) {
//HttpSession session = request.getSession();
//session.setAttribute("key","value");
//session.setAttribute("key2","value2");
Cookie[] cookies = request.getCookies(); // 获取所有cookie
for (Cookie cookie : cookies) {
cookie.getName(); // 查找到指定cookie
}
}
关于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等安全的加密算法