1、背景
1、HTTP
是一种”无状态“(stateless
)的协议
每次客户端访问网页时,客户端都会打开与Web
服务器的单独连接。
并且服务器不会自动保留之前客户端请求的任何记录。
2、很多场景中,都有一下需求
服务器能够识别出多个请求是否来自同一个客户端
来自同一个客户端的多个请求之间共享数据
3、以上需求可以使用会话跟踪技术来完成。在Java
中,实现会话跟踪的常用方案是
Cookie
、Session
2、Cookie
1、Cookie
是直接存储在浏览器本地一小串数据
使用document.cookie
访问Cookie
修改Cookie
时,只会修改其中对应key
的Cookie
name=value
必须被编码(encodeURIComponent
)
一个Cookie
最大4kb
,每个网站最多有20+
个左右的Cookie
(具体由浏览器决定)
2、Windows
中Chrome
浏览器的Cookie
存放的位置:C:\Users\用户名\AppData\Local|Google\Chrome\User Data\Default\Cookies
使用SQLite
数据库进行存储
3、Cookie
的有效期
如果没有设置Cookie
的过期时间,则当浏览器关闭时,Cookie
就失效了
expires
:必须完全采用GMT
时区的格式,可以使用date.toUTCString
来获取
例如:expires=Tue, 19 Jan 2038 03:11:11 GMT
document.cookie = 'name=jack; expires='+ new Date().toUTCString();
max-age
:过期时间距离当前时间的秒数,例如:max-age=60
document.cookie = 'name=jack; max-age=60';
服务端接收Cookie
Cookie[] cookies = request.getCookies();
if (cookies == null) return;
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + "_" +cookie.getValue());
}
4、Cookie
的作用域
domain
和path
标识定义了Cookie
的作用域,即Cookie
应该发送给哪些URL
domain
:标志指定了哪些主机可以接受Cookie
如果不指定,默认为当前文档的主机(不包含子域名);如果指定了domain
,则一般包含子域名中(如:bbs.520it.com
)
localhost:6666/a/test2
Cookie cookie = new Cookie("name", "mj");
response.addCookie(cookie);
localhost:8080/a
localhost:8080/b
localhost:8888/a
localhost:8888/b
// 不设置path,则默认path=/content_path,默认请求主机:
// localhost:8080/a、localhost:8080/a
path
:标识指定了主机下的哪些路径可以接受Cookie
,子路径也会被匹配
例如:设置path=/docs
, 则以下地址都会匹配
/docs
/docs/one/
/docs/one/img
5、服务器设置Cookie
Cookie
通常是由Web
服务器使用响应头Set-Cookie
设置的
关于max-age
在JavaScript
中:如果设置为0或者负数,会立即删除Cookie
在Java
中:如果设置为0,是立即删除Cookie
;如果设置为负数,按照默认情况查处理
Cookie cookie = new Cookie("name", "mj");
response.addCookie(cookie);
3、session
1、getSession
内部的原理
检查客户端是否有发送一个叫做JSESSIONID
的Cookie
如果没有
创建一个新的Session
对象,并且这个Session
对象会有一个id
这个Session
对象会保留在服务器的内存中
在响应的时候,会添加一个Cookie
(JSESSIONID=Session
对象的id
)给客户端
如果有
返回id
为JSESSIONID
的Session
对象
2、JSESSIONID
默认情况下、当用户关闭浏览器时,Cookie
中存储的JSESSIONID
就会被销毁
可以通过以下代码延长JSESSIONID
在客户端的寿命
Cookie cookie = new Cookie("JSESSIONID", request.getSession().getId());
cookie.setMaxAge(3600);
response.addCookie(cookie);
3、Session
的有效期
Session
的有效期默认是30
分钟
可以在web.xml
中配置失效时间(单位是分钟)
<session-config>
<session-timeout>30</session-timeout>
</session-config>
网友评论