会话技术
概念:会话是客户端与服务器之间的一个通信过程,一次会话中可以包含多次请求和响应
一次完整的会话:客户端第一次请求服务器时建立会话,直到任何一方断开为止
作用:在一次会话中的多次请求之间共享数据
分类:
客户端会话技术:Cookie
服务器会话技术:Session
一,Cookie
1.1 概念和基本用法
Cookie是客户端会话技术,它将数据存在客户端(浏览器)中
Cookie的相关方法:
创建,构造函数:
Cookie c = new Cookie(String name,String value); // 将两个参数形成的键值对绑定到当前Cookie对象中将Cookie数据发送给客户端
resp.addCookie(Cookie c); /* 服务器将Cookie对象中的两个参数形成键值对, 在响应头中发送给客户端,以Set-Cookie:name=value的形式发送 */获取客户端中的Cookie
req.getCookies(); /* 从请求头中获取Cookie对象组成的数组,在请求头中以Cookie:name=value的形式出现 */
1.2 Cookie的原理
Cookie的原理:
在客户端第一次访问服务器时,服务器会将Cookie对象中的键值对,以
Set-Cookie:name=value
的形式通过响应头发送给客户端在会话没有结束的情况下,客户端访问服务器中当前项目下的任何资源时,都会自动的在请求头中以
Cookie:name=value
的形式将Cookie提交给服务器
1.3 Cookie的细节问题
1.3.1 Cookie在客户端中可以保存多久
默认情况:Cookie是会话级别的,浏览器关闭后,Cookie被释放
持久化级别的:可以通过
cookie.setMaxAge(int seconds)
来手动设置Cookie的销毁时间
正数:设置了多久,Cookie在客户端中就能保存多久,无论客户端是否关闭了
负数:默认值,浏览器关闭后,Cookie被销毁
0:设置持久化的时间为0
1.3.2 是否可以一次发送多个Cookie
可以,如果Cookie的键相同,那么原来的值会被覆盖
1.3.3 Cookie中是否可以存储中文
不可以,
在存储到Cookie对象前需要对存储的内容进行编码:
String s = "张三"; s = URLEncoder.encode(s,"utf-8"); Cookie c = new Cookie("name",s); resp.addCookie(c);在获取Cookie对象后需要对编码后的内容进行解码:
Cookie[] cookies = req.getCookies(); if(cookies != null){ for(Cookie cookie : cookies){ if(cookie.getName().equals("name")){ String value = cookie.getValue(); value = URLDecoder.decode(value,"utf-8"); System.out.println(value); } } }
1.3.4 Cookie携带的范围
Cookie携带的范围,也就是在访问哪些资源时会携带者Cookie
默认情况下,访问当前项目下的任何资源时都会携带着Cookie
可以手动设置Cookie的携带路径:
resp.setPath(String path)
1.4 Cookie的特点
Cookie将数据存储到客户端中
Cookie不安全,Cookie可能被销毁(关闭浏览器、到达最大时间、手动清除)
不同的浏览器对单个Cookie 的大小有限制,并且不同浏览器对同一项目中Cookie的数量也有限制
二,Session
2.1 概念和基本用法
Session是服务器会话技术,它将数据存储到服务器中,能够在一次会话中的多次请求之间共享数据
HttpSession是一个接口,它也是域对象:
Session的相关方法:
获取Session
req.getSession(); // getSession()在被调用时,会先判断服务器中是否已经有Session对象,如果没有,则创建;如果有,则获取因为Session也是一个域对象,所以它有域对象的通用方法
setAttribute(String name,Object obj); getAttribute(String name); removeAttribute(String name);
2.2 Session的原理
Session的实现是依赖于Cookie的
当调用req.getSession()时,服务器会看客户端的请求头中是否携带存有指定JSESSIONID的Cookie,如果有,则在服务器中获取该JSESSIONID所对应的Session对象,如果没有,则创建一个新的Session对象,并将这个Session对象的id值通过
JSESSIONID=session的id值
形式的Cookie发送客户端当客户端关闭后,无法再从Session中获取存储的数据,因为存有JSESSINID的Cookie默认是会话级别的,随着客户端的关闭而结束会话被释放;如果想要在关闭客户端后再次访问时还能获取原先Session对象中的值,必须对该Session的存有JSESSIONID的Cookie进行持久化
2.3 Session的细节问题
客户端关闭,服务器不关,再次打开客户端访问session,是否还能从session中获取数据
默认情况下不能,因为session是依赖cookie的,要通过保存在cookie中JSESSIONID值才能从服务器中找到对应的session对象,而cookie默认是会话级别的,关闭浏览器就被销毁了,因此再次访问服务器请求头中不能携带之前session的id
可以对session进行持久化,本质是对存有JSESSIONID和sessionid值的cookie进行持久化
Cookie c = new Cookie("JSESSIONID",session.getId()); c.setMaxAge(600); resp.addCookie(c);session何时被销毁
在tomcat\conf的web.xml中,对session的销毁进行了默认的配置:
<session-config> <session-timeout>30</session-timeout> </session-config>注:如果在当前项目中,没有手动配置
session-config
,就使用默认的配置,如果手动配置了失效时间,就根据当前项目的失效时间来销毁session立即删除session
session.invalidate();
2.4 Session的特点
Session存储在服务器中
Session对象是一个域对象,可以存储任意类型