会话技术:Cookie、Session
文章目录
一、会话
指客户端浏览器与服务器之间的通信,其基于***Http***协议如有一方连接断开,则本次会话结束。在一次会话中包含若干次请求和响应,可以在一次会话的范围内的多次请求间,共享数据
使用最广泛的会话技术:Cookie、Session:
数据存储位置 | 数据大小 | 数据安全 | |
---|---|---|---|
Cookie | 客户端 | 有限制 | 不安全 |
Session | 服务器 | 没有限制 | 相对安全 |
二、Cookie
2.1 概述
客户端会话技术,基于Http协议的请求头与响应头。
存储数据时,服务器向客户端浏览器发送set-cookie响应头(为键值对)提取数据时,本次会话客户端浏览器向服务器的请求头加上cookie。
通常,浏览器对单个cookie的大小限制在4kb,每个域名下不多于20个cookie。
主要被用来存储少量不重要、不敏感的信息或在不登录的情况下,完成服务器对客户端浏览器的身份识别,保存对网页的设置等。
2.2 发送、获取
Cookie << new Cookie(String name, String value)
创建Cookie对象,绑定数据
void Response :: addCookie(Cookie cookie) 通过响应发送Cookie对象
可以通过多次调用Cookie :: addCookie()方法创建多个cookie对象
获取Cookie对象:
Cookie[] << Request :: getCookies()
得到数据
String << Cookie :: getName()
String << Cookie :: getValue()
2.3 设置存储时间
默认情况下,浏览器关闭时Cookie数据被销毁;可以通过
void Cookie :: setMaxAge(int second)
方法设置存储时间
int型参数:
- 正数:浏览器将Cookie文件写入硬盘中,持久化存储,时间到后文件失效
- 0:浏览器删除存储的Cookie信息
- 负数:默认值,关闭浏览器后Cookie文件销毁
2.4 中文存储
Tomcat8之前cookie不能存储中文,之后支持存储中文数据但还是不支持特殊字符,如空格。
可以通过采用任意编码形式编码后存储。
URL编码:每个字节使用:%16进制数 表示(如%3E)
GBK形式使用3个字节表示一个汉字,UTF-8形式使用4个字节表示一个汉字
String << URLEncoder :: encode(String s,String enc)
String << URLDecoder :: decode(String s,String enc)
String s: 目标字符串,String enc: 编解码字符
2.5 共享数据
默认设置下不能共享数据,但可以通过Cookie类的方法实现同一服务器的多个WEB项目间、同一域名的不同服务器间共享数据。
同一服务器的多个WEB项目间共享数据:
void << Cookie :: setPath(String path)
默认下path为项目当前虚拟目录,修改path为“/” 即可共享
同一域名的不同服务器间共享数据:
void << Cookie :: setDomain(String path)
设置一级域名相同即可
cookie.setDomain(". baidu.com"),那么[tieba.baidu.com]和[news.baidu.com]中的cookie可以共享数据
三、Session
3.1 概述
服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的HttpSession对象中;
Session的实现基与Cookie,首次获取HttpSession对象时,服务器响应时设置一个键为JSESSIONID、值为随机生成的一个Cookie响应头
注:每次关闭浏览器后,再重新请求会开启一个新的Session对象
3.2 获取、使用
获取HttpSession对象
HttpSession << Request ::getSession()
使用HttpSession对象(域对象特性)
void << HttpSession :: setAttribute(String name, Object value)
Object << HttpSession :: getAttribute(String name)
void << HttpSession :: removeAttribute(String name)
3.3 客户端Session存活数间
默认设置下,浏览器关闭时,客户端Session内存即被释放,可以自定义Cookie设置Session在客户端浏览器的存活时间
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
3.4 服务器端Session销毁
默认设置下,浏览器关闭时,客户端session内存即被释放,但服务器仍然保存该session,30分钟内没有再次接收到请求会将其销毁。通过修改服务器配置属性可以更改Session失效时间
全局修改:
tomcat/conf/web.xml中修改 < session-timeout>标签包裹的值
单个项目修改:
在项目的*.xml配置文件中,配置
<session-config>
<session-timeout>30</session-timeout>
</session-config>
调用 void << HttpSession :: invalidate()
方法,手动销毁该Session
3.5 服务器端Session保存
tomcat自动完成Session的序列化与反序列化;
在服务器正常关闭之前,会将HttpSession对象序列化化到硬盘上,并在在work目录下生成[.ser]文件;
在服务器启动时,将[.ser]文件转化为内存中的HttpSession对象,并将work目录下.[.ser]文件删除。
注:使用IDEA部署项目支持还自动操作,每次用idea重启tomcat的时候,会自动删除catalina_base中work目录