1.状态管理
(1)什么是状态管理?
将浏览器与web服务器之间多次交互当做一个整体来处理,并且将
多次交互所涉及的数据(即状态)保存下来。
(2)如何进行状态管理?
方式一: 将状态保存在浏览器端(使用cookie)。
方式二: 将状态保存在服务器端(使用session)。
2.Cookie
(1)什么是Cookie?
服务器临时存放在浏览器端的少量数据,用于存放用户的状态。
注:
当浏览器第一次访问服务器时,服务器会将少量数据以
set-cookie消息头的形式发送给浏览器,浏览器会将这些
数据保存下来。
当浏览器再次访问服务器,会将这些数据以cookie消息头的
形式发送给服务器。
(2)如何添加Cookie?
Cookie c = new Cookie(String name,String value);
response.addCookie(c);
注:
cookie只能存放字符串。
cookie都有一个名字,值是一个字符串。
(3)如何读取Cookie?
Cookie[] request.getCookies();
注:
该方法有可能返回值为null。
String cookie.getName();
String cookie.getValue();
(4)Cookie的生存时间
默认情况下,浏览器会将Cookie存放到内存里面,浏览器关闭,则
Cookie会被删除。
cookie.setMaxAge(int seconds);
注:
单位是秒。
比如保存一个月 30 * 24 * 60 * 60
seconds > 0时:
浏览器会将cookie保存在硬盘上(一般是一个小的文件),
超过指定时间,浏览器会将cookie删除。
seconds < 0时:
缺省值(浏览器会将Cookie存放到内存里面)。
seconds = 0时:
浏览器会删除该cookie。
比如,要删除一个名称为username的cookie:
Cookie c = new Cookie("username","");
c.setMaxAge(0);
response.addCookie(c);
(5)Cookie的编码问题
Cookie只能存放合法的ascii字符,如果要存放中文,需要将中文转换成
对应的ascii字符的形式(即编码)。
String URLEncoder.encode(String str,String charset);
String URLDecoder.decode(String str,String charset);
建议,在添加Cookie时,统一编码处理。
(6)Cookie的路径问题
a.什么是Cookie的路径问题?
浏览器在向服务器发请求时,会比较请求地址是否符合Cookie的
路径,只有符合条件的cookie才会发送给服务器。
b.Cookie的默认路径
等于添加该Cookie的web组件的路径。比如,/day06/biz01/addCookie.jsp,则该jsp添加的cookie,则该cookie的路径就是
"/day06/biz01"。
c.匹配规则
请求地址要么等于cookie的路径,要么是其子路径,符合该要求的
cookie会被发送。
比如,cookie的路径是"/day06/biz01",则
"/day06/findCookie1.jsp" no
"/day06/biz01/findCookie2.jsp" yes
"/day06/biz01/sub/findCookie3.jsp" yes
d.修改Cookie的路径
cookie.setPath(String path);
(7)Cookie的限制
a.Cookie可以被用户禁止。
b.Cookie不安全。
cookie是一种客户端的状态管理技术,数据都保存在浏览器端,
所以,对于敏感数据,一定要加密处理。
c.Cookie只能保存少量数据。
大约是4k左右。
d.Cookie的数量也有限制。
大约是几百个。
e.Cookie只能存放字符串。
3.Session (会话)
(1)什么是Session?
服务器端为了保存用户的状态而创建的一个特殊的对象。
注:
当浏览器第一次访问服务器时,服务器创建一个特殊的对象
(该对象一般称之为session对象,session对象有一个唯一的
id,一般称之为sessionId)。服务器会将sessionId以cookie
的方式发送给浏览器。
当浏览器再次访问服务器时,会将sessionId会送过来,服务器
可以依据sessionId找到对应的session对象。
(2)如何获得Session对象?
1)方式一
HttpSession session = request.getSession(boolean flag)
注:
HttpSession是一个接口。
当flag为true时:
先查看请求当中是否有sessionId,如果没有,则创建一个
session对象。如果有,则依据sessionId查找对应的session
对象,找到了则返回该对象,找不到,则创建一个新的session对象。
当flag为false时:
先查看请求当中是否有sessionId,如果没有,返回null。
如果有,则依据sessionId查找对应的session
对象,找到了则返回该对象,找不到,返回null。
2)方式二
HttpSession session = request.getSession();
注:
等价于request.getSession(true);
(3)常用方法
//绑订数据
session.setAttribute(String name,Object obj);
//依据绑订名,获得绑订值,如果绑订值不存在,返回null
Object session.getAttribute(String name);
//解除绑订
session.removeAttribute(String name);
(4)session超时
什么是session超时?
服务器会将空闲时间过长的session对象删除掉。
目的是为了节省内存空间。
注:
大部分服务器默认的超时时间限制是30分钟。
如何修改超时时间?
方式一 修改服务器的配置文件(web.xml)
<session-config>
<session-timeout>30</session-timeout>
</session-config>
方式二 session.setMaxInactiveInterval(int seconds);
注:
该方法用于设置两次请求之间的最大间隔时间,如果超过这个时间,session对象会被销毁。
(5)删除session
session.invalidate()
(6)session验证
step1. 登录成功以后,在session对象上绑订一些数据。比如:
session.setAttribute("user",user);
step2. 当用户访问需要保护的资源时(即只有登录之后的用户才能访问的
资源),进行session验证:
Object obj = session.getAttribute("user");
if(obj == null){
//没有登录,重定向到登录页面
response.sendRedirect("login.jsp");
}
(7)比较session与cookie
session支持更丰富的数据类型(cookie只能存放字符串)、更安全、
可以存放更多的数据(cookie只能存放少量的数据)。
但是,session是将状态保存在服务器端,有可能会占用过多的内存。