一、cookie的机制
cookie是由服务器端生成,发送给客户端(一般是浏览器),浏览器会将cookie的key/value保存在客户端硬盘上的一段文本(通常是加密的),下次请求同一网站时就发送该cookie给服务器(前提是浏览器设置为启用cookie)。cookie的内容主要包括:名字、值、过期时间、路径和域。路径和域一起构成cookie的作用范围。如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。
二、会话cookie和持久cookie的区别
生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。
三、cookie的发送
1.创建Cookie对象
2.设置最大时效
3.将Cookie放入到HTTP响应报头
如果你创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie:存储在浏览器的内存中,用户退出浏览器之后被删除。如果你希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
cookie的发送是通过扩展HTTP协议来实现的,需要使用HttpServletResponse的addCookie方法,将cookie插入到一个 Set-Cookie HTTP请求报头中。由于这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头,因此我们将这个方法称为是addCookie。同样要记住响应报头必须在任何文档内容发送到客户端之前设置。而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
四、cookie的读取1.要获取有浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。
2.对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止.cookie与你的主机(域)相关,而非你的servlet或JSP页面。因而,尽管你的servlet可能只发送了单个cookie,你也可能会得到许多不相关的cookie。
例如:
String cookieName = “userID”;
Cookie cookies[] = request.getCookies();
if (cookies!=null){
for(int i=0;i<cookies.length;i++){
Cookie cookie = cookies[i];
if (cookieName.equals(cookie.getName())){
doSomethingWith(cookie.getValue());
}
}
}
五、session的机制(中文含义为会话,是指有始有终的一系列动作/消息)
session机制是一种服务器端的机制。我们可以这样理解:当与服务端进行会话时,比如说登陆成功后,服务端会为用户开辟一块内存区间,用以存放用户这次会话的一些内容,比如说用户名之类的信息。那么就需要一个标识来标记这个内存区间是你的而不是别人的,这个标识就是session id(session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串),而这个内存区间你可以理解为session。服务器会将这个session id发回给你的浏览器,放入你的浏览器的cookies中(session cookie 并且这个cookie是存放在内存中,它会随着浏览器的关闭而消失)。只有你浏览器没有关闭,你每向服务器发请求,服务器就会从你发送过来的cookies中拿出这个session id,然后根据这个session id到相应的内存中取你之前存放的数据。如果你退出登陆了,服务器会清掉属于你的内存区域,所以你再登的话,就会产生一个新的session了。
也就是,当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否包含了session标识:session id,如果已经包含一个session id则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用。如果客户请求不包含session id,则为此客户创建一个session并且生成一个与此session相关联的session id,这个session id将在本次响应中返回给客户端保存。
六、保存session id的几种方式
A.保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。
B.由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。
七、session什么时候被创建
一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建。八、session何时被删除
A.程序调用HttpSession.invalidate()
B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
C.服务器进程被停止
注意:关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。
九、session与cookie的区别与联系session cookie针对某一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie是存在于客户端硬盘上的一段文本(通常是加密的),不如session cookie安全性高,因此建议使用存储在服务器端的session机制更安全些。通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的sessionid,这样我们信息共享的目的就达不到了,此时我们可以先把sessionid保存在persistent cookie中,然后在新窗口中读出来,就可以得到上一个窗口SessionID了,这样通过session cookie和persistent cookie的结合我们就实现了跨窗口的session tracking(会话跟踪)。
session是以cookie或URL重写为基础,默认使用cookie来实现。系统会创造一个名为JSESSIONID的输出cookie,我们叫做session cookie,以区别我们通常所说的cookie(persistent cookie),注意session cookie是存储于浏览器内存中的,并不是写到硬盘上的,jsessionid是服务器那边生成的,由服务器那边发送到客户端的信息。我们通常情是看不到JSESSIONID的,但是当我们把浏览器的cookie禁止后,服务器那边得不到jsessionid,这样也就没法根据jsessionid获得对应的session了。web服务器会采用URL重写的方式传递Sessionid,我们就可以在地址栏看到 sessionid=KWJHUG6JJM65HS2K6之类的字符串。
本文详细介绍了Cookie的工作机制,包括其在客户端的存储方式和生命周期。区分了会话Cookie与持久Cookie的区别,并阐述了如何设置Cookie的最大时效。此外,还讨论了Cookie的发送过程以及在HTTP响应报头中的应用。同时,文章提到了Session的创建和其与Cookie的关系,强调了关闭浏览器仅使会话Cookie失效,服务器端Session不受影响。最后,分析了在Cookie禁用或跨窗口Session跟踪时,如何利用URL重写维持会话状态。

1442

被折叠的 条评论
为什么被折叠?



