会话技术
Http是一个无状态的协议,多次请求之间是互相独立的。
为了解决多次请求之间 由于无状态协议导致的无法数据共享的问题,引入了会话技术。
会话:从客户端连接到服务器开始,直到客户端和服务器断开连接为止,这样的一个过程称之为一次会话。
在一次会话中,可能有多次请求和响应。在一次会话中,可以通过会话技术共享数据。
Cookie--客户端会话技术
-
Cookie的数据存储在客户端
-
Cookie的数据都是键值对 name-value。类型都是字符串
-
Cookie有数量和大小限制的。
-
Cookie设置的时候是通过响应头携带到浏览器的。
-
当浏览器向服务器发起请求时,会把符合要求的所有cookie自动携带到服务器上,通过请求头携带。
cookie的属性
name:cookie的名字
value:cookie的值
path:cookie的有效路径
可以设置的。如果不设置,有默认值。
默认值:访问某个资源,该资源设置了cookie,会把该资源的URI,截取到最后一个/的字符串,作为默认path。
有效路径的作用:在客户端发起请求时,如果请求的路径符合有效路径的匹配规则,则在请求时携带该cookie,否则不携带。
一般情况下,我们会把cookie的有效路径设置为虚拟目录,保证在整个项目中共享该cookie
cookie.setPath(req.getContextPath());
domain:cookie的有效域名
可以设置的。如果不设置,有默认值。
默认值就是访问某个资源,该资源设置了cookie,会把该资源的域名作为有效域名。
有效域名的作用:在客户端发起请求时,如果请求的域名符合有效域名的匹配规则,则在请求时携带该cookie,否则不携带。
一般情况下无需设置。但是如果是集团性的服务器集群,需要设置为集团的一级域名。
例如:cookie.setDomain(".baidu.com")
maxAge:最大存活时间,默认值为-1
负数:默认值,代表当前cookie是一个会话级别的cookie,随着会话的结束而销毁。此时数据存储在浏览器内存中的而不是本地文件。
正数:有效时间,代表当前cookie是一个持久化cookie,会保存在浏览器对应的一个硬盘文件上。知道有效时间过期之后才会自动销毁。
0:用于删除持久化cookie。要满足一些前提条件。
cookie的name要和被删除的一致。
cookie的value没有任何要求。
cookie的path要和被删除的一致。
cookie的domain要和被删除的一致。
cookie的maxAge要设置为0,代表直接过期删除掉。
Cookie操作相关的api
设置cookie
响应对象中,通过addCookie(Cookie c)方法添加cookie到浏览器。
获取cookie
请求对象中,通过Cookie[] getCookies()方法获取当前请求中携带的所有Cookie对象。
Cookie存储中文
Cookie本身是由http的头进行数据传输的,所以不支持中文,如果要存储中文数据,必须把中文转为非中文形式。
推荐使用URLEncode的方式进行操作,此操作不是自动的,需要手动进行编解码。
URLEncoder.encode(String str,String encoding)// 把中文字符串以指定的字符集转为非中文表示形式 URLDecoder.decode(String str,String encoding)// 把从cookie中拿到的编码后的字符串还原为中文形式
Session--服务器端会话技术
HttpSession
数据存储在服务器上,存储在服务器内存中。
session底层是基于cookie实现的
session本身也是一个域对象,可以存储任意类型的数据。
作用范围就是一次会话。
理论上没有大小限制,实际受服务器内存大小的限制。
已经学习过的三个域: request域 < session域 < application域
api:
getId()// 获取session的id,也就是唯一标识 invalidate()// 销毁当前session,自杀方法
创建:在一次会话中,第一次调用request.getSession()方法时,会由服务器创建一个session对象,然后把id通过cookie返回给浏览器。
创建session时,cookie默认的maxAge为-1。
销毁:
-
当浏览器关闭时,携带sessionid的cookie销毁了。但是服务器内存中的session对象并不会实时销毁,只不过没有id找不到了。等session超时之后,服务器会把它销毁掉。默认超时时间为30分钟。
可以在web.xml中配置session的默认过期时间,单位是分钟
<session-config> <session-timeout>30</session-timeout> </session-config>
-
当服务器正常关闭时,session会被序列化到硬盘上;服务器再次启动时,会自动把序列化的session再反序列化到内存中。序列化的过程我们称为钝化。反序列化的过程叫做活化。但是要注意:钝化和活化过程中,session中的对象如果也要跟着进行序列化和反序列化,它必须实现序列化接口。钝化的操作在服务器压力比较大的时候也会自动进行。
-
当服务器非正常关闭时,此时session会直接被销毁。
-
手动调用session的invalidate方法,此时session会直接被销毁掉。