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