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需要销毁:

  1. 超时自动销毁。

    1. 从用户最后一次访问网站开始,超过一定时间后,服务器自动销毁Session,以及保存在Session中的数据。

    2. Tomcat 服务器默认的Session超时时间是30分钟

    3. 可以利用web.xml设置超时时间单位是分钟,设置为0表示不销毁。

      20
  2. 调用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("呵呵!"); 
     }
    

    }

全部评论

相关推荐

头像
04-26 15:00
已编辑
算法工程师
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务