会话管理
HTTP是无状态的协议,每次客户端访问web页面时,都会打开一个单独的连接到web服务器,服务器不会自动保存客户端请求的任何记录,需要使用cookie和session来将一系列的请求和响应关联起来,维持客户端和服务器之间的会话
cookie
Cookie是服务器发送到浏览器并存储在计算机上的文本文件,用于追踪各种信息,记录在客户端,会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器,使得无状态的HTTP协议记录了状态。浏览器可以禁用cookie,可以删除cookie,
在服务器产生,作为响应头的一部分返回给客户端,浏览器收到cookie后,把cookie的键值写入到文本中,发送请求时浏览器会把cookie信息与请求发送给服务器
每个浏览器存储cookie位置不同,所以cookie不能跨浏览器
cookie原理
底层原理:WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求信息中增加Cookie请求头字段将Cookie回传给WEB服务器
操作cookie
创建cookie
1 | // 第一个参数是cookie的键,第二个参数是cookie的值 |
获取cookie
1 | Cookie[] cookies = req.getCookies(); |
设置cookie的一些方法
1 | // 描述cookie的注释 |
获取cookie属性的方法
1 | // 获取cookie的注释,如果没有为null |
删除cookie
设置生命周期 cookie.setMaxAge()方法设置,秒为单位,若为0,表示立即删除该cookie,将该cookie放到响应中返回
注意:一个servlet设置的cookie可以被同一个路径下或者子路径下的servlet读到,其他访问不到
路径是指url可以通过cookie.setPath()方法设置cookie的作用范围
cookie适用场景
- 会话状态管理(如自动登录,不需要填写用户名和密码、购物车等)
- 浏览器行为追踪(如浏览记录等)
- 个性化设置(如用户自定义设置、主题等)
浏览器对于cookie是有限制的,同一域名下的cookie数量不能超过20个
session
session代表着服务器和客户端一次会话的过程,是记录在服务器端,获取session需要把sessionId传递给服务端,通过sessionId来取到对应的session,关闭浏览器,session不会被销毁,还可以通过sessionId找到该session(但是此时浏览器发送数据时已不会携带该sessionId,导致出现session销毁的错觉),在同一个application下的servlet/jsp可以共享一个session,前提是同一个客户端窗口
操作session
创建或获取session
1 | // 若为false,如果当前没有关联的session,如返回null;若为true,如果没有则会创建 默认是true |
session的相关方法
1 | // 返回session的创建时间(单位毫秒) |
1 | // 判断当前请求的session是否合法 |
session的超时时间
可以在web.xml中配置session的超时时间
1 | <session-config> |
session的实现方式
session有两种实现方式
①通过cookie来实现 第一次请求时,响应在响应头set-Cookie中 有jsessionId,把jsessionId放到cookie中,如果浏览器支持cookie,会把jsessionId放到cookie中
默认是存储在内存中的,没有存储在磁盘上,关闭浏览器就会失效
可以进行持久化,使用cookie.setMaxAge
②通过URL重写来实现
response.encodeURL(或者encodeRedirectURL方法)两个作用
- 转码
- URL后加上jsessionID
session的持久化
由于session会占用内存资源,可以将session进行持久化放到文件或者数据库中保存,Tomcat中使用org.apache.catalina.session.PersistentManager和org.apache.catalina.session.StandardManager两个类来管理session的持久化
StandardManager
StandardManager是在web应用程序关闭时,对内存中的所有HttpSession对象进行持久化,保存在文件系统中,默认位置为tomcat下的
1 | \work\Catalina\<主机名>\<应用程序名>\SESSION.ser |
PersistentManager
PersistentManager比StandardManager更加灵活,只要某个设备提供了实现org.apache.catalina.Store接口,就可以将HttpSession对象保存到对应的设备下
配置方式为
1 | <!-- server.xml配置文件中Context标签下 --> |
cookie和session的不同
- 作用范围不同,cookie保存在客户端,session保存在服务器端
- 存储大小不同,单个cookie保存的数据不能超过4K,session可以保存更多的数据