当前位置:网站首页>你真的了解 Session 和 Cookie 吗?
你真的了解 Session 和 Cookie 吗?
2022-07-27 05:11:00 【nuzzzzz】
前言
我们知道,HTTP 是无状态的协议,服务端并不知道哪个请求是哪个用户发起的。有些场景我们需要知道请求是哪个用户发起的,哪个用户操作的。例如商城服务,用户发起请求下单,服务端需要识别是哪个具体的用户。所以服务端需要使用某种机制来识别,记录用户的信息,状态等。
Session 机制就能实现,它可以让无状态协议的 HTTP 有状态化。服务端为每个请求服务端的用户创建其独享的 Session,用于标识,跟踪此用户。Session 是存储在服务端的,可以存储在文件,内存,数据等等,并且有唯一的标识 Session ID。服务端创建 Session 之后,服务端通过 HTTP 协议告诉客户端,在本地 Cookie 中记录这个 Session ID。这样同个客户端以后的每一个请求将 Cookie 一起发送给服务端,服务端通过存储在 Cookie 的 Session ID 查出存储在服务端的 Session ,就能知道此次请求的是哪个用户了。

Session
Session 中文意思即会话,时效。其实就是客户端和服务端一对一交互的会话状态,是一种抽象概念。很多人认为 Session 就是以下代码获取的 Session 对象,其实这只是其中的借助 Cookie 的一种通用性较好的实现而已。Session 有很多种实现的。
HttpSession session = request.getSession();因为大部分应用程序借助 Cookie 来实现 Session 跟踪,即上述那一行代码。Cookie 是实际存在的。客户端请求服务端并且第一次创建 Session 的时候,服务端通过 HTTP 协议(HTTP响应头的 Set-Cookie)告诉客户端,需要在本地 Cookie 中记录这个 Session ID。key 的值为 JSESSIONID。

这样同个客户端以后的每一个请求会将 Cookie 一起发送给服务端,服务端通过存储在 Cookie 的 Session ID 查出存储在服务端的 Session ,就能知道此次请求的是哪个用户了。
HttpSession session = request.getSession();不过客户端浏览器是可以禁用 Cookie 的,那这种方式就会出现问题。但是我们可以使用 URL 重写的技术来实现 Session 跟踪,即在请求服务端的所有请求参数增加一个代表用户标识或者 Session ID 即可。
http://chenpi.com/list?sid=xxx前面我们说过 Session 可以存储在文件,内存,数据库等地方。会话信息具体存储在哪里其实都得根据自身业务来定,一切脱离业务场景谈技术架构的都是耍流氓, 技术本身无好坏,不过是什么业务场景适合什么技术而已,这也是架构师考虑技术选型的一方面能力。
不过 Session 机制在集群服务中需要考虑 Session 一致性问题。可以在集群服务中做 Session 同步,不过这种方法有一些缺点,例如同步麻烦,同步延迟,多机存储相同的 Session 浪费存储空间。另外一种比较常用的方法就是使用专门的 Session 服务集群来保存用户会话信息,例如 Redis 缓存服务,不仅可搭建集群模式实现高可用可拓展,而且基于内存性能速度快。
public UserContext getUserContext(HttpServletRequest request) { String userToken = getUserToken(request, COOKIE_KEY); if (!StringUtils.isEmpty(userToken)) { String userContextStr = redisUtils.getString(RedisKeyUtil.genKey(userToken)); if (!StringUtils.isEmpty(userContextStr)) { return JSON.parseObject(userContextStr, UserContext.class); } } return null;}public String getUserToken(HttpServletRequest request, String cookieName) { Cookie[] cookies = request.getCookies(); if (null != cookies) { for (Cookie cookie : cookies) { if (Objects.equals(cookie.getName(), cookieName)) { return cookie.getValue(); } } } return null;}Cookie
Cookie 是客户端技术,也是很多人实现 Session 会话的选型,服务端可以让客户端将一些信息写入本地 Cookie 中,来达到会话跟踪的目的。不过要注意浏览器本地禁用 Cookie 的情况。
说到 Cookie,就不得不说很多广告商,网站等采用我们个人隐私进行跟踪,分析我们的行为,进行个性化推荐。很多网站利用第三方 Cookie 获取用户信息,发送到服务端记录用户的行为轨迹。你肯定也遇到在其他应用讨论到防脱发,然后你打开淘宝惊奇的发现给你推荐各种防脱发洗发液。不过,目前有些浏览器已经禁用第三方 Cookie 或者进行优化处理了,例如 Safari,Mozilla 等。
我们可以手动将一些信息设置到 Cookie 中,这样客户端不仅可以使用到这些信息,在后续的请求中,服务端也能根据此信息做相应的处理。
public void saveUserContext(HttpServletResponse response, String key, String value) { // 设置cookie Cookie cookie = new Cookie(key, value); cookie.setPath("/"); // 设置有限期,负数例如-1代表Web浏览器关闭的时候删除,如果不设置就默认-1 cookie.setMaxAge(12 * 60 * 60); response.addCookie(cookie);}我们可以通过浏览器查看存储在本地的 Cookie 信息,而且其他网站也可以扫描使用我们存储的 Cookie,所以一些安全性或者保密的信息尽量不要存储在 Cookie 中,因为数据安全性比较低。正常情况下,用户登录信息等比较重要信息存储在服务端 Session 中,其他信息例如会话 ID 可以存储在 Cookie 中。
而且单个 Cookie 的大小也是有限制的,不同浏览器限制规则不一样,一般大小是几 Kb。 不同浏览器对于一个域名下的 Cookie 数量也是有限制的,一般就几十个,而且也有数量饱和时淘汰策略,所以使用要注意这些情况,尽量不要超过浏览器的限制。
边栏推荐
- You should negotiate the handling fee before opening a futures account
- How to apply for the return of futures account opening company?
- 解决MySQL JDBC数据批量插入慢的问题
- Permission configuration, component value transfer
- What is the difference between foreach and map methods in JS
- Minio分片上传解除分片大小限制 - chunk size must be greater than 5242880
- 去哪家期货公司如何开户?
- 选择正规的资质好的期货公司开户
- 一本通1329 细胞(广度优先搜索)
- 神芷迦蓝寺
猜你喜欢

Ubuntu:安装PostgreSQL

Web3流量聚合平台Starfish OS,诠释真正商业的“P2E”生态

二十五家互联网大厂软件测试笔试题总结,遇到包过。

Exit login and JSX display

You can't even do a simple function test well. What do you take to talk about salary increase with me?

解析新时代所需要的创客教育DNA

eval与assert执行一句话木马

期货开户要和客户经理详谈政策

Choose futures companies with state-owned enterprise background to open accounts

SeekTiger即将上线STI聚变Mining功能,获取OKA通证
随机推荐
深度优先搜索(dfs)简介
一本通1319——排队接水
Apache SSI 远程命令执行漏洞
CAP原则
[NPUCTF2020]ReadlezPHP 1
期货公司开户的具体事项
去哪家期货公司如何开户?
When opening futures accounts, you should discuss the policy in detail with the customer manager
Think about the role of some documents
NFT新的契机,多媒体NFT聚合平台OKALEIDO即将上线
Elment UI usage
信息学奥赛一本通1176题——谁考了第k名
In the future, face brushing payment can occupy a lot of market share
Graph-node部署及测试
Configure the route and go to the login home page to send the request
Native token generation encryption and decryption
[CISCN2019 华东南赛区]Web11 1
minio8.x版本设置policy桶策略
User registration login
==,===,Object.is