会话跟踪技术在我当前学习,分为Session和Cookie两种会话技术。
简单来看,一次会话,就像是一次人与人之间的通话一样,只不过会话是浏览器和服务器之间的“通话”。
我们都知道,现在任何“通话”都是基于HTTP协议的,但是呢,HTTP协议是无状态的。何为无状态?简单来理解就是没有记忆能力的。浏览器一次会话中,每次新的请求对于服务器来说都是新的,那这肯定不行吧?所以说,就有了Cookie和Session的出现。Cookie和Session就是为了解决HTTP无状态的问题,让同一次会话的多次请求间可以共享数据。
关于Cookie
Cookie的数据是存储在浏览器这边的,所以说,cookie也叫做浏览器端会话技术。
具体原理:
1) 服务器创建cookie对象,把会话数据存储到cookie对象中
2) 服务器发送cookie信息到浏览器。set-cookie:name=eric
3) 浏览器得到服务器发送的cookie,然后保存在浏览器端。
4) 浏览器在下次访问服务器时,会带着cookie信息。cookie: name=eric
5) 服务器接收到浏览器带来的cookie信息
具体使用:
1,创建cookie对象,设置数据。
Cookie cookie = new Cookie("key","value");
2,发送Cookie到客户端:使用response对象
response.addCookie(cookie);
3,获取客户端携带的所有Cookie,使用request对象
Cookie[] cookies = request.getCookies()
(因为cookie可能不是一个,所以使用一个Cookie数组去接收)
4,遍历数组得到每一个cookie对象
5,得到Cookie的名字:cookie.getName();
得到对应的值:cookie.getValue()
注意事项:
①、Cookie是有存活时间的。
默认情况下,Cookie存储在浏览器中,当浏览器关闭,Cookie则被销毁了。如果想要设置存活时间,则需要调用方法setMaxAge(int seconds)
:设置Cookie存活时间
正数 | 将 Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除 |
---|---|
负数 | 默认值,Cookie在当前浏览器内存中,当浏览器关闭,则 Cookie被销毁 |
零 | 删除对应 Cookie |
②、Cookie存储中文问题
Tomcat8是可以存储中文的,但是不能存储一些Cookie不允许的符号
Tomcat7及以下是不允许存储中文。
解决方案:URL编解码
content = URLEncoder.encode(content,"UTF_8");
value = URLDecoder.decode(value,"UTF-8");
关于Session
Session是在服务端的会话技术,和Cookie是相反的,但是底层是基于Cookie的。
Session原理:下面放一张去医院 就诊复诊 的图片,这最能解释Session底层的原理。
用官方的描述如下(配合上图食用):
1,第一次访问创建Session对象,给Session对象分配一个唯一的ID,叫做JSESSIONID
2,把JSESSIONID作为Cookie的值发送给浏览器保存
3,当第二次访问的时候,浏览器带着JSESSIONID的Cookie访问服务器
4,服务器得到JSESSIONID,在服务器内存中搜索是否存放对应编号的Session对象
5,如果找到对应编号的对象,那么直接返回该对象
6,如果找不到,就创建一个新的Session对象,继续走按照流程走。
总结一句话就是:通过JSESSIONID的Cookie值在服务器找Session对象
注意事项:
默认情况下无操作,30分钟自动销毁Session,若想修改时间,可以在项目的web.xml文件中添加下列代码,去修改:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
当然也可以调用Session对象的invalidate
方法,进行手动销毁。
最后简单总结一下Session和Cookie的区别:
- Cookie存储在浏览器,Session存储在服务端
- Cookie不安全,Session安全
- Cookie最大3KB(也有说4KB的),但是Session无大小限制
- Cookie可以长期存储,但是Session默认是30分钟
- Cookie不占服务器资源,Session占用服务器资源