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
setValue与getValue方法
--设置和获取cookie的值
getName方法
--cookie需要在创建时就指定好名字,这个名字一旦指定就不能修改了,如果需要修改只能重新创建一个cookie
setMaxAge与getMaxAge方法
--一个cookie被发送到浏览器时,如果没有设置过MaxAge,这个cookie将会被保存在浏览器的内存中,会一直存在到浏览器关闭内存销毁为止,这样的cookie叫做会话级别的Cookie
--我们也可以使用setMaxAge方法设置cookie的存活时间,这样一来,浏览器收到这个Cookie信息时会将cookie信息以文件的形式保存在浏览器的临时文件夹中,保存到指定的时间到来位置,在这个期间即使多次开关浏览器,cookie信息一直都在.
setPath与getPath方法
--设置浏览器在访问哪个地址及其子地址时,带着cookie信息过来.如果没设置过,那么默认的path是当前发送cookie的Servlet所在的路径
setDomain与getDomain方法
--设置浏览器在访问哪个域名时,带着当前的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,然后将这个cookie的maxAge设置为0,这样一来,这个cookie会把要删除的cookie覆盖掉,覆盖后立即超时,直接被浏览器删除,看起来就像是删除了要删除的cookie
3.1.6. Cookie细节
一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
注意,删除cookie时,path必须一致,否则不会删除(浏览器通过cookie的name+path来标识一个cookie)
4. session的原理
4.1. Session原理
4.1.1. Session原理
服务器是如何区别出当前请求是要对应到哪个Sessoin的呢?其实Session是基于一个特殊的名为JSESSIONID的cookie工作的。如图-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重写