Cookie和Session

来源:互联网 发布:ppt软件学习 编辑:程序博客网 时间:2024/06/06 12:30

1. 会话技术

1.1. 会话技术

1.1.1. 会话概述

会话可简单理解为:用户开一个浏览器,访问多个资源,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

1.1.2. 会话中的问题

每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。

如用户登录过后,应该保存一个用户状态,在会话结束前表明用户一直是登录状态。并且不同的用户之间的登录状态应该互不影响。

我们之前已经学过request域和SerlvetContext域,我们分别分析一下。

Request域太小了,在多次请求中,每次请求响应都是新的Request对象,之前存入的request域中的域属性,在请求结束后随着request域的销毁而消失了。

ServletContext域太大了,所有用户都在操作这个域,必然会发生混乱。

此时我们需要会话相关的技术,保存会话产生的数据。

2. Session技术 

2.1. Session技术

2.1.1. Session概述

Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

如图-1所示:

                

-1

2.1.2. session是一个域对象

生命周期:

当程序第一次调用到request.getSession()代码时,服务器明确的直到了需要用到session,此时创建session.

如果session超过30分钟(可以在web.xml中配置的)没人使用,服务器认为这个session超时了,销毁session.

明确的调用session.invalidate(),session立即销毁.

服务器被非正常关闭或web应用被移除出容器,此时随着web应用的销毁session销毁.如果是正常关闭,session会被钝化.当下次服务器正常启动时,没有超时的session还会被活化回来.

作用范围:

整个会话范围内可见

主要作用:

在会话范围内共享数据

3. Cookie技术

3.1. Cookie技术

3.1.1. Cookie概述

Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。如图-9所示:

 

-9

cookie是会话相关的技术,可以保存会话产生的数据,客户端技术,将数据保存在客户端,基于set-Cookie响应头和Cookie请求头工作的.

3.1.2. Cookie常用方法

Cookie cookie = new Cookie(String name,String value);

--javax.servlet.http.Cookie类用于创建一个Cookie

 

setValuegetValue方法

--设置和获取cookie的值


getName方法

--cookie需要在创建时就指定好名字,这个名字一旦指定就不能修改了,如果需要修改只能重新创建一个cookie

 

setMaxAgegetMaxAge方法  

--一个cookie被发送到浏览器时,如果没有设置过MaxAge,这个cookie将会被保存在浏览器的内存中,会一直存在到浏览器关闭内存销毁为止,这样的cookie叫做会话级别的Cookie

--我们也可以使用setMaxAge方法设置cookie的存活时间,这样一来,浏览器收到这个Cookie信息时会将cookie信息以文件的形式保存在浏览器的临时文件夹中,保存到指定的时间到来位置,在这个期间即使多次开关浏览器,cookie信息一直都在.

 

setPathgetPath方法

--设置浏览器在访问哪个地址及其子地址时,带着cookie信息过来.如果没设置过,那么默认的path是当前发送cookieServlet所在的路径

 

setDomaingetDomain方法 

--设置浏览器在访问哪个域名时,带着当前的cookie,默认值当前发送cookie的域名,注意,现代的浏览器只要发现cookie设置过maxage,则认为这个cookie是第三方cookie,会拒绝接受

 

 

3.1.3. 发送cookie

response.addCookie(cookie);

--response接口也中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。 

3.1.4. 获取cookie

request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie

Cookie [] cs = request.getCookies();

3.1.5. 删除cookie

浏览器会通过名字+path+domaint来区分cookie,如果浏览器发现两个cookie名字 path domain 都相同,则会认为是相同的cookie,就会发送cookie的覆盖。

所以如果想要删除一个cookie,可以发送一个和要删除的cookie名字 path (domain) 都相同的cookie,然后将这个cookiemaxAge设置为0,这样一来,这个cookie会把要删除的cookie覆盖掉,覆盖后立即超时,直接被浏览器删除,看起来就像是删除了要删除的cookie

3.1.6. Cookie细节

一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。

一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie

浏览器一般只允许存放300Cookie,每个站点最多存放20Cookie,每个Cookie的大小限制为4KB

如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie

注意,删除cookie时,path必须一致,否则不会删除(浏览器通过cookiename+path来标识一个cookie)

4. session的原理

4.1. Session原理

4.1.1. Session原理

服务器是如何区别出当前请求是要对应到哪个Sessoin的呢?其实Session是基于一个特殊的名为JSESSIONIDcookie工作的。如图-20所示:


-20

4.2. 利用Session原理实现即使多浏览器共用Session

4.2.1. 代码实现

利用sesison的原理,我们可以自己写出一个JSESSIONID cookie,设置maxAge,从而实现即使关闭浏览器仍能找到之前的session

 

-21

4.3. 禁用cookie时使用session

4.3.1. 禁用cookie时使用session

当客户端禁用了cookie,造成session无法访问,此时我们可以使用URL重写来解决这个问题

URL重写要求将站点中的所有超链接都进行改造,在超链接后用一个特殊的参数JSESSIONID保存当前浏览器对应session的编号,这样一来,当用户点击超链接反问服务器时,服务器可以从URL后的参数中分析出JSESSIONID,从而找到对应的sesison使用.

URL重写之前,要先创建出session,才能进行重写操作

response.encodeURL(String url);

//--如果是普通的地址用这个方法

response.encodeRedirectURL(String url);

//--如果地址是用来进行重定向的,用这个方法

以上两个方法可以实现URL重写,这两个方法非常的智能,只要发现浏览器发送了任何Cookie过来,就认为当前客户端没有禁用Cookie,就不会在进行URL重写

 

0 0
原创粉丝点击