Java会话(session)管理
会话概述
什么是会话
简单的理解:⽤户打开浏览器,点击多个超链接,访问Web服务器上多个资源,然后关闭浏览器,整个过程称之为⼀次会话。
需要解决的问题
每个⽤户在使⽤浏览器与服务器会话的过程中,会产⽣⼀些⽤户数据,如⽤户登陆标记,WEB应⽤程序必须要为每个⽤户在⼀次或多次会话过程中保存这些数据。
两种技术
Cookie
Cookie是客户端技术,WEB应⽤程序把每个⽤户数据以Cookie的形式发送给各⾃的的浏览器,当⽤户使⽤浏览器再次访问WEB应⽤时,就会带上这些Cookie,这样,WEB应⽤可以为每个⽤户分别处理各⾃的数据了。
HttpSession
简称Session,是服务器端技术,服务器在运⾏时为每个⽤户的浏览器创建⼀个其独享的HttpSession对象。由于⽤户各⾃独享session,所以可以把各⾃的数据存放在各⾃的session域中,当⽤户去访问当前web应⽤其他web资源时,其他web资源再从⽤户各⾃的session中取出数据为其服务。
Cookie类
1、javax.servlet.http.Cookie
Cookie的属性:
name:必须的,Cookie名
value:必须的,Cookie名对应的数据
comment:可选,备注
path:默认值就是产⽣Cookie的Servlet对应的URI
有⼀个cookie它的路径是:/app/servlet/
当浏览器访问的新资源的路径是:/app/1.jsp
问?浏览器会将该cookie带给1.jsp吗?不会
当浏览器访问的新资源的路径是:/app/servlet/a/b/ServletDemo1
问?浏览器会将该cookie带给ServletDemo1吗?
会
总结:在访问⼀个资源时,带不带已有的cookie。访问的资源路径.startsWith(cookie的path),如果为true,则会带
如果把⼀个Cookie的path设置成了/app/,说明访问/app/下⾯的任何资源,都会带cookie过去。
domain:默认就是产⽣Cookie的Servlet所在的⽹站域名
maxAge:标识cookie的⽣命周期。默认是⼀次会话
要想在客户端的缓存中保存住Cookie的数据,增⼤它的存活时间。单位是秒
如果取值为0,就是要删除之。
version:可选,Cookie的版本
2、服务器向客户端写Cookie
response.addCookie(Cookie cookie);对应设置响应头的“Set-Cookie”
3、获取客户端提交过来的Cookie
Cookie[] cookies = Cookies();接着遍历cookies数组确定所需的Cookie
4、如何唯⼀确定⼀个Cookie(有同名Cookie情况)
通过domain+path+name,可以确定唯⼀⼀个Cookie
5、其他
⼀个WEB站点可以给⼀个WEB浏览器发送多个Cookie,⼀个WEB浏览器可以存储多个WEB站点提供的Cookie
浏览器⼀般只允许存放300个cookies,每个站点最多存放20个Cookie,每个Cookie的⼤⼩限制为4KB
如果创建⼀个Cookie,并发送到浏览器,默认情况是⼀个会话级别的cookie,即只存在浏览器的内存中。若需要存储在磁盘上则需要设置maxAge属性为⼤于0的数值,单位为秒。为0则是告诉浏览器删除该cookie。
删除cookie时,path必须⼀致,否则删除不成功
HttpSession类
javax.servlet.http.HttpSession HttpSession技术实际上还是利⽤Cookie技术
1、获得HttpSession对象:
HttpSession session = Session();
每⼀个HttpSession对象都有⼀个唯⼀的ID
为了标识每⼀个客户端,实际上向客户端写了⼀个特殊的Cookie:
该Cookie的name为固定的“JSESSIONID”
该Cookie的value为HttpSession对象的id
该Cookie的path为当前应⽤路径
如果⽤户带着⼀个名称叫做JSESSIONID的Cookie过来了,先按照ID到服务器内存中对应的HttpSession对象,
没到或者浏览器没有带,则创建⼀个新的HttpSession对象,亦即有了新的ID,同时写给客户端JSESSION=sessionid;
如果到了,返回该HttpSession对象,继续为⽤户服务。
2、HttpSession本⾝是⼀个域对象
void setAttribute(String name,Object obj) 设置属性
void removeAttribute(String name) 移除属性
Object getAttribute(String name) 获取属性
3、HttpSession⽣命周期
3.1 客户端向服务器第⼀次发送请求的时候,request中并⽆sessionID.
3.2 此时server端会创建⼀个session对象,并分配⼀个sessionID,serssion对象会保存在服务器端。此时session的状态处于new state状态,如果调⽤session.isNew(),则返回true
3.3 当服务器段处理完毕后,将此sessionID,以Cookie的形式传到客户段。
3.4 当客户段再次发送请求时,会将sessionID 同request参数⼀起发送,传递给服务器端。
3.5 服务器端可以根据传递过来的sessionID将这次请求(request)与保存在服务器端的session对象联系起来,此时的session已不处于new state状态,如果调⽤session.isNew(),则返回false.
3.6 循环3-5 ,直到session超时或被销毁。
4、HttpSession对象的状态转换
HttpSession对象默认超时为30分钟。
4.1 更改HttpSession的默认超时时间:
在l中配置
1 2 3<session-config>
<session-timeout>1</session-timeout><!--单位为1分钟--> </session-config>
4.2 HttpSession对象状态
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论