Cookie和Session
状态管理
1.什么是状态管理?
将浏览器与web服务器之间的多次交互当作一个整体来处理,并且将多次交互
所涉及的数据保存下来。
注:
状态:多次交互所涉及的数据。比如购买的商品信息。
管理:将这些数据保存下来。
2.如何进行状态管理?
方式一:将状态保存在浏览器端(Cookie)。
方式二:将状态保存在服务器端(Session)。
3.Cookie
(1)什么是Cookie?
服务器临时存放在浏览器端的少量数据,用于保存用户的状态。
当浏览器第一次访问服务器时,服务器会将少量数据以set-cookie消息头
的形式发送给浏览器,浏览器会将这些数据临时保存下来。
当浏览器再次访问服务器时,会将这些数据以cookie消息头的形式发送给
服务器。
(2)如何添加Cookie?
Cookie c = new Cookie(String name,String value);
response.addCookie(c);
注:
name:Cookie名,每一个cookie都必须有一个名字,要求唯一。
value:Cookie值。
(3)如何读取浏览器端发送过来的Cookie?
Cookie[] request.getCookies();
注:
该方法有可能返回null。
String cookie.getName();
String cookie.getValue();
(4)Cookie的生存时间
Cookie.setMaxAge(int seconds);
单位是秒。
值可以>0: 浏览器会将cookie保存在硬盘上(一般是一个小的文件),
超过指定时间,cookie会被删除(失效)。
值可以<0: (缺省值),即浏览器会将cookie保存在内存里面,浏览器如果
关闭,则cookie会被删除。
值可以=0: 删除cookie。
比如,要删除一个名称为"username"的cookie
Cookie c = new Cookie("username","");
c.setMaxAge(0);
response.addCookie(c);
(5)Cookie的编码问题
a.什么是Cookie的编码问题?
Cookie里面只能存放合法的ascii字符,对于非ascii字符,比如中文,
要将中文转换成合法的ascii字符的形式。
b.如何处理?
String URLEncoder.encode(String str,String charset);
String URLDecoder.decode(String str,String charset);
c.建议:
添加cookie时,最好统一编码处理。
(6)Cookie的路径问题
a.什么是Cookie的路径问题?
浏览器向服务器发请求时,会查看请求地址是否符合Cookie的路径要求,
只有符合条件的cookie才会被发送。
b.Cookie的默认路径
等于添加該Cookie的web组件的路径。
比如说 "/servlet09/biz01/addCookie.jsp"添加了一个cookie,
则该cookie的默认路径就是"/servlet09/biz01"。
c.匹配规则
请求地址要么等于cookie的路径,要么是其子路径。只有符合
这个条件的cookie才会被发送。
比如说,cookie路径是"/servlet09/biz01",
请求地址是 "/servlet09/findCookie1.jsp", no!
请求地址是 "/servlet09/biz01/findCookie2.jsp", yes!
请求地址是"/servlet09/biz01/sub/findCookie3.jsp", yes!
d.修改Cookie的路径
cookie.setPath(String path);
(7)Cookie的限制
a.Cookie可以被用户禁止。
注:可以提示用户不要将cookie禁止。
可以通过navigator.cookieEnabled来获得浏览器是否禁止了cookie。
b.Cookie只能存放少量的数据。
大约4k左右。
c.Cookie数量也有限制。
几百个左右。
d.Cookie只能存放字符串。
e.Cookie不安全。
敏感数据尽量不要直接以cookie的方式保存。
如果一定要用,要加密处理。
4.Session(会话)
(1)什么是Session?
服务器为了保存用户状态而创建的一个特殊的对象。
当浏览器第一次访问服务器时,服务器创建一个session对象(该
对象有一个唯一的id,一般称之为sessionId),服务器会将sessionId
以cookie的方式发送给浏览器。
当浏览器再次访问服务器时,会将sessionId发送过来,服务器依据
sessionId就可以找到对应的session对象。
(2)如何获得session对象?
方式一 HttpSession s = request.getSession(boolean flag);
注:
HttpSession是一个接口。
当flag为true时:
先查看请求当中是否有sessionId,如果没有,
则创建一个session对象。如果有,则依据sessionId
查找对应的session对象,如果找到了,则返回该
对象,如果找不到,创建一个新的session对象。
当flag为false时:
先查找请求当中是否有sessionId,如果没有,
返回null。如果有,则依据sessionId查找对应的session
对象,如果找到了,则返回该对象,如果找不到,返回
null。
方式二 HttpSession s = request.getSession();
等价于 request.getSession(true);
(3)常用方法
绑订数据:
session.setAttribute(String name,Object obj);
依据绑订名获得绑订值:
Object session.getAttribute(String name);
注:如果绑订名对应的值不存在,返回null。
解除绑订:
session.removeAttribute(String name);
(4)Session 的销毁
为了避免Session中存储的数据过大,Session需要销毁:
-
超时自动销毁。
-
从用户最后一次访问网站开始,超过一定时间后,服务器自动销毁Session,以及保存在Session中的数据。
-
Tomcat 服务器默认的Session超时时间是30分钟
-
可以利用web.xml设置超时时间单位是分钟,设置为0表示不销毁。
20
-
-
调用API方法,主动销毁Session
- session.invalidate()
案例:销毁Servlet
public class DeleteServlet extends HttpServlet {
private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); session.invalidate(); response.setContentType( "text/html; charset=utf-8"); response.getWriter().println("呵呵!"); }
}
- session.invalidate()