Java Web 深入分析(9) Session 和 Cookie
前言:
- session 和cookie都是为了保持服务器和客户端之间交互状态。如果一天的PV有几亿,而一个cookie占200个字节但是也会占用很多带宽?所以大访问量就引用session,但是几百台服务器集群之间 有无法实现共享session。
理解Cookie

- 简单来说就是用户通过HTTP去访问服务器,然后服务器会返回一些key/value的数据给用户端,同时给这些数据加上一些限制条件,当用户再次访问服务器时,只要条件满足时就会被重新返回给服务器。W3C设计cookie最初是为了应对HTTP这种无状态协议去区分不同用户的,现在cookie也可以被用作服务器数据缓存判断的依据。
- cookie属性项 ,目前分为了version0 和version1两个版本,常用的有max-age ,domain,expires,path等等,在Javaweb的servlet规范中,我们常用的set-cookie:user-name='hakulamatata';max-Age="1000"。
- 客户端和服务端交互时,不需要每次都传递这么多次cookie ,这么做无疑是增加数据传输量。所以当客户端第一次连接到服务端,服务器会生成一个每个客户端唯一的ID,这个ID就是客户端保存着的 NAME =JSESIONID 的cookie,每次交互就把这个cookie id发过去 便于服务器识别。
- 使用cookie的限制,虽然HTTP协议对于cookie的数量和占用空间大小是没有限制的,但是现代基本浏览器(主要指支持html5的浏览器) 对于数量限制基本都是每个域名不超过50个 ,占用空间而言 基本除了谷歌是 80000个字节,其他都是4095个字节。
- cookie安全问题:容易想到既然cookie保存在客户端,就难免被他人利用篡改或者进行其他我们预料之外的操作,相比而言存放在服务端的 session就安全些,所以一些敏感信息 更适于存放在session里。
- cookie压缩问题。如果大型网站PV上亿的那种,带宽和流量而言,压缩cookie很有必要,而根据cookie的规范 ,cookie只能是ASCII码为34-126的可见字符,所以我们必须使用Base64进行编解码,然后再利用gzip和deflate等压缩算法进行压缩,节省流量带宽成本。
理解session
- 前面讲过,web交互过程中不可能每次都把cookie都传回服务端,而是用一个 jesesionid的id 的cookie,这是session 的一种方式,还有基于 url 这两个都是默认支持的,最后还有一个是SSL的,这个不是默认支持的。当web.xml 配置了 session就会 以配置的 为sessionid,没配置就是以默认的jesesionid 为准,而url 则是以url传回的K-V键值对为依据构建 sessionid,而最后一种特殊情况就是 javax.servlet.request.ssl_session属性值设置 sessionid。
Session 如何工作

- 有了sessionid对象就可以去创建httpsesion对象了,第一次通过 request.getsession()方法,如果没有就创建新的,然后放到sessionmanager里面去管理,过期的就关闭,服务器关闭时就持久化到磁盘,只要有这个HTTPsession对象客户就可以获取这个对象,也就实现HTTP协议本身无状态,到技术实现其有状态的过程。
扩展问题
表单重复提交:就是在用户请求前,在表单隐藏域中添加一个根据某个种子生成的随机数,也就是 token ,然后存放在session中,当用户提交表单时,在和这个存放在session中的对比,如果不同就是重复提交,如图

多端session统一:主要涉及多端共享session,其次就是如图过程。

Java Web 深入分析(9) Session 和 Cookie的更多相关文章
- Java Web Application使Session永不失效(利用cookie隐藏登录)
在做 Web Application 时,因为 Web Project 有 session 自动失效的问题,所以如何让用户登录一次系统就能长时间运行三个月,就是个问题. 后来,看到 session 失 ...
- Java Web(三) 会话机制,Cookie和Session详解
很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...
- Java Web(三) 会话机制,Cookie和Session详解(转载)
https://www.cnblogs.com/whgk/p/6422391.html 很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因 ...
- java web 学习十一(使用cookie进行会话管理)
一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾 ...
- [原创]java WEB学习笔记30:Cookie Demo 之显示最近浏览的记录
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- A candidate solution for Java Web Application - current session
Motivation Do it once, resue for ever. Audience myself, Java Web developers Scope 应用案例 图书借阅系统 阶段1需求: ...
- web 开发常见问题--Session 与 Cookie 却别
总结: 1.首先,session与cookie都是保存数据的,存在的原因很大程度上是为了解决HTTP协议的无状态特性 2.都是保存数据,却别在于cookie保存在客户端,由浏览器管理,session保 ...
- Java Web 深入分析(6) Tomcat
tomcat是什么:汤姆猫?Javaweb服务器? Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache ...
- JSON WEB TOKEN - 告别session和cookie - java demo
JWT简介 JWT认证流程: 用户登录成功,生成token,返回一个对象(包含token,用户名) 每次请求都带上这个对象(通过js存储在电脑) jwt过滤器会校验token解密之后的name是否和用 ...
随机推荐
- SWT界面刷新
参考文章: https://segmentfault.com/q/1010000002956350 在UI线程sleep等待,是不会刷新界面的. outPrint.setText("其他 ...
- VUE知识点小记
.if里面不能用import方式导入,只能用require方式引入 判断长度大于0 getIssues (vue, data) { let label = '' ) { label = `+label ...
- java说明文档制作
A:对工具类加入文档注释 B:通过javadoc命令生成说明书 * @author(提取作者内容) * @version(提取版本内容) * javadoc -d 指定的文件目录 -author -v ...
- SIT测试 和 UAT测试
在企业级软件的测试过程中,经常会划分为三个阶段——单元测试,SIT和UAT,如果开发人员足够,通常还会在SIT之前引入代码审查机制(Code Review)来保证软件符合客户需求且流程正确.下面简单介 ...
- Qt编写控件属性设计器4-加载属性
一.前言 控件能加载拖曳拉伸了,这些都是基本的前提工作,接下来的重点就是要动态加载选中控件的属性了,Qt的属性机制那是异常的强大,只能用强大到爆来形容,Qt中编写自定义控件,如果属性都用Q_PROPE ...
- Linux -- GCC Built-in functions for atomic memory access
下列内建函数旨在兼容Intel Itanium Processor-specific Application Binary Interface, section 7.4. 因此,这些函数区别于普通的G ...
- python中的列表推导式——轻量级循环
列表推导式(list comprehension)是利用其他列表创建新列表(类似于数学术语中的集合推导式)的一种方法.它的工作方式类似于for循环,也很简单. 列表推导式书写形式: [表达式 for ...
- LeetCode_66. Plus One
66. Plus One Easy Given a non-empty array of digits representing a non-negative integer, plus one to ...
- (2) Java SQL框架(java.sql.*)中常用接口详解
Driver接口:定义了一个驱动程序接口,每一个数据库的JDBC driver都应该实现这个接口,用于访问对应的数据库.比如MySQL的driver为com.mysql.jdbc.Driver.Jav ...
- 【Leetcode_easy】1122. Relative Sort Array
problem 1122. Relative Sort Array 参考 1. Leetcode_easy_1122. Relative Sort Array; 2. helloacm; 完