一、会话技术概述
● 会话是指客户端和服务器之间的多次请求和响应
● 为了实现一些功能,浏览器和服务器可能会产生多次的请求和响应,从浏览器访问服务器开始,到访问服务器结束,这期间产生的多次请求和响应加在一起就称为浏览器和服务器之间的一次会话
● 为了保存会话过程中产生的数据,我们可以通过会话技术(Cookie和Session)来实现
二、Cookie
● Cookie是一种会话技术,可以将会话过程中的数据保存在用户的浏览器中,从而使浏览器和服务器之间更好的进行数据交互
● Cookie是一个类,有一些属性和方法,用于设置Cookie
● 发送一个Cookie使用HttpServletResponse的 void addCookie(Cookie cookie) 方法,通过这个方法可以将Cookie添加到响应头中然后响应给浏览器
● 浏览器最多接收20个来自同一个网站的Cookie,并且浏览器只允许存放300个Cookie,每个Cookie的大小限制在4k以内
● 浏览器通过将Cookie添加到请求头中发送到服务器端,可以通过HttpServletRequest的 Cookie[]getCookie() 方法获取到一个Cookie数组,这些Cookie可能有相同的名称但是路径不同
● 构造方法 public Cookie(String name,String value) ,name属性一旦创建将不能更改,但是value可以更改
Cookie常用属性:
属性 | 作用 | 是否重要 |
name | Cookie名称 | 必须属性 |
value | Cookie的值(不支持中文) | 必须属性 |
path | Cookie的路径 | 重要 |
domain | Cookie的域 | 重要 |
maxAge | Cookie存活时间 | 重要 |
version | Cookie版本号 | 不重要 |
comment | Cookie描述 | 不重要 |
Cookie方法:
● Cookie常用方法是对Cookie相关属性的get或者set,但是需要注意name属性没有set方法
● setMaxAge(int expirt)和getMaxAge()方法解析
1. 这两个方法用于设置和返回Cookie在浏览器上保持的有效秒数,其中设置的值有如下规则
2. 正整数表示在没有超过指定秒数之前这个Cookie会一直存在
3. 负整数表示当浏览器关闭时Cookie信息会被清除
4. 0表示浏览器会立即删除这个Cookie信息
5. 默认是-1
● setPath(String uri)和getPath()方法解析:
1. 这两个方法是针对path属性的设置和获取
2. 如果创建的Cookie对象没有设置path属性的值,那么默认该Cookie只对当前请求路径所属的目录以及子目录有效
3. 如果想让某个Cookie对象对站点的所有目录下的访问路径的都有效,那么可以设置为"/"
4. 设置path的格式是contextPath+自定义路径
● setDomain(String pattern)和getDomain():
1. 这两个方法是针对domain属性的设置和获取,domain属性用于指定Cookie所在的域
2. 默认为服务器主机地址,当浏览器想要访问该服务器的资源时会将该Cookie信息发送给服务器
3. 如果想让不同的域之间都可以访问到某个Cookie,那么Cookie的domain应该是这些域的相同后缀,而且必须以.开头
三、Session
● Session也是会话技术的一种,与Cookie不同的是,在客户端保存的是一个标识,而会话产生的数据保存在服务器端
● 当浏览器第一次请求服务器时,服务器会创建一个Session对象,该对象有唯一的一个标识,然后服务器将这个标识以Cookie的方式发送给浏览器
● 当浏览器再一次请求服务器时会将这个标识发送过来,服务器根据这个标识就可以找到对应的Session对象了
● Session也是域对象之一,可以实现数据共享
● 通过创建一个HttpSession对象来实现Session,HttpSession是一个接口,我们不直接创建这个对象而是服务器负责创建,我们使用的时候获取即可
● 获取方式:通过HttpServletRequest对象获取,有两个方法
HttpSession getSession() ,获取HttpSession对象
HttpSession getSession(boolean create) ,获取HttpSession对象,未获取到是否创建
HttpSession常用方法:
方法 | 说明 |
String getID() | 返回与当前HttpSession对象关联的会话标识号 |
long getCreationTime() | 返回Session创建时间 |
long getLastAccessedTime() | 返回客户端最后一次发送与Session相关请求的时间 |
void setMaxInactiveInterval(int interval) | 用于设置当前Session对象可空闲的最长时间,单位为秒 |
boolean isNew() | 判断当前HttpSession对象是否是新建的 |
void invalidate() | 强制使Session对象无效 |
boolean isNew() | 判断当前HttpSession对象是否是新建的 |
void invalidate() | 强制使Session对象无效 |
String getAttribute() | 用于从当前HttpSession对象中返回指定名称的属性值 |
void removeAttribute(String name) | 用于从当前HttpSession对象中删除指定名称的属性值 |
Session生命周期:
Session生效
1、Session在用户第一次访问服务器时创建
2、只有访问JSP、Servlet等程序时才会创建Sessin
3、只访问HTML、IMAGE等静态资源时不会创建Session
Session失效
1、Web服务器使用“超时限制”判断客户端是否还在继续访问。在一定时间内,如果某个客户端没有请求访问,那么Web服务器认为该客户端已经结束请求,并且与该客户端会话所对应的HttpSession对象会变成垃圾对象,等待垃圾收集器将其从内存中清除。如果超时后再次向服务器发出请求访问,那么Web服务器会创建一个新的HttpSession对象,并分配一个新的标识
2、使用 invalidate() 方法,可以强制使得Session失效
设置失效时间:使用 setInactiveInterval(int interval) 方法可以设置Session最长的空
闲时间,当超过这个时间客户端没有请求访问则Session失效。