Skip to content

Cookie会话技术

一次会话中包含多次请求和响应

一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止

功能

在一次会话的范围内的多次请求间,共享数据

方式

客户端会话技术

Java
1.创建Cookie对象,绑定数据
    new Cookie(String name,String value)
2.发送Cookie对象
    response.addCookie(Cookie cookie)
3.获取Cookie,拿到数据
    Cookie[] request.getCookie()

实现原理

Java
基于set_cookie和请求头cookie实现

细节

1.可以一次发送多个cookie

创建多个Cookie对象,使用response调用调用多次addCookie方法

2.设置保存时间

默认值:当浏览器关闭后,Cookie数据被销毁
持久化:
	setMaxAge(int seconds)
	1.正数:将Cookie数据写到硬盘的文件中,持久化存储,cookie存活时间
	2.负数:默认值
	3.零:删除cookie信息

3.存储中文

在tomcat8 之前cookie不支持中文存储
	需要使用URL编码
	URLEncoder.encode(转码字符串,"utf-8")
	
	获取值,同样需要解码
	URLDecoder.decode("解码字符串","utf-8")
	//注意:特殊字符最好使用URL编码
tomcat8 之后支持中文存储

4.获取范围

默认情况是只能共享在同一个项目下的cookie

可以设置范围来进行不同项目下的共享
setPath(String path)
设置为"/"

5.cookie值

尽量不要使用空格等特殊字符

Session

服务端会话技术

在一次会话的多次请求将共享数据,将数据保存在服务器端的对象中 HttpSession

使用

java
获取HttpSession对象
HttpSession session = request.getSession()

//有点类似与共享数据
使用对象
void setAttribute(String name, Object obj) //存储数据 name:存储数据的名字 obj:存储对象
Object getAttribute(String name) //根据存储数据的名字来获取存储数据
void removeAttribute(String name) //通过名字来移除存储数据

原理

Session的实现是依赖于Cookie的

其他

1.当客户端关闭后,服务器不关闭,2次获取session是否是同一个

java
默认情况下: 不是
如果需要,则可以创建一个Cookie 键为JSESSIONID 值就是之前的值,调用get方法,获取值,设置存活时间
Cookie c =  new Cookie("JSESSIONID",session.getId())

2.客户端不关闭,服务器关闭后,2此获取的session是同一个吗?

java
不是同一个对象,但是为了确保数据不丢失,tomcat自动设置
	1.session钝化
		在服务器正常关闭之前,将session对象系列化到硬盘上
		(类似序列化)
	2.session活化
		在服务器启动后,将session文件转化成内存中的session对象
		(类似反序列化)
	//注意 idea 无法实现活化功能,因为idea会在项目部署的时候,替换掉原来的文件,因此session文件被删除了

3.session销毁时间

Java
1.服务器关闭
2.session对象调用invalidate()方法时
3.session默认失效时间30分钟(可以去配置文件里修改)

4.session的特点

1.session用于存储一次会话的多次请求的数据,存在服务器端
2.session可以存储任意类型,任意大小的数据

区别

1.session存储数据在服务器端,cookie在客户端

2.session没有数据大小的限制,cookie有

3.session数据安全,cookie相对不安全