状态管理方案:
Cookie--------针对的网站,存在客户端。
Session-------针对的是用户,存在服务器端。
URL重写
表单隐藏字段
状态管理概述:
HTTP协议使用的是无状态的连接
对容器而言,每一个请求都来自于一个新的客户
这里我们有四种方法来解决这个状态:
a:表单隐藏字段
b:Cookie
c: Session
d: URL重写
我们就来一一介绍这四种方案:
A:状态管理解决方案-表单隐藏字段
表单隐藏字段:
1:对用户在网站上的访问进行会话跟踪。
2:为服务器端程序提供预定义的输入。
3:存储动态产生的页面上下文信息。
隐藏字段存在一个主要的缺点,即只有每当每个页面都是动态生成的时候才有效。
B:表单是在生成动态时才有效,那么我们就使用HTTP Cookie来固定的保存在某个地方,需要是读取。
使用HTTP Cookie可以很好的维护和保留用户的状态信息,但是Cookie涉及到一些敏感的隐私问题,一些用户会禁用Cookie,这时我们需要另一个方法来解决
C:URL重写
D:Servlet提供了出色的解决方案,HttpSessionAPI,这种高级接口建立在Cookie和URL重写之上。
把客户的状态信息保存在服务器端
Session对象就是服务器为客户端创建并维护的用于存放客户状态数据的对象
一:Cookie
1:Cookie原理:
服务器在响应请求时将一些数据以“键-值”对的形式通过响应信息保存在客户端,当浏览器再次访问相同的应用时,会将原先的Cookie通过请求信息带到服务器端。
Cookie cookie = new Cookie("cool", "tiger!");
response.addCookie(cookie);
2:在Serlvet中管理Cookie
Servlet中提供了如下一系列操作Cookie的API
–Cookie(name, value):构造方法用于创建一个或多个Cookie
–setMaxAge(int lifetime):设置Cookie的过期时间(以秒为单位)。默认值为负值(Cookie将在浏览器关闭时过期)
–getMaxAge():获取Cookie的过期时间。
–getName():获取Cookie的名字
–setValue(String value):指定Cookie的值。
–getValue():获取Cookie的值
-.......
3:在Servlet中使用Cookie
要将Cookie发送到客户端,Servlet应该按照下列的操作步骤执行:
–创建一个或多个Cookie,使用构造方法指定Cookie的名字和值
–使用setXXX方法为Cookie设置属性值
–使用HttpServletResponse对象的addCookie()方法将Cookie插入到响应头中
要读取客户端传入的Cookie,Servlet执行下列操作步骤:
–使用HttpServletRequest对象的getCookie方法返回一个Cookie对象数组
–Servlet遍历该数组(调用getName()方法),直到找到与名称相匹配的Cookie值
二:Session
1:Session原理
-服务器可以为客户端创建并维护一个Session对象,用于存放数据。
-在创建Session对象的同时,服务器将会为该 Session对象产生一个唯一编号,这个编号称之为SessionID
-服务器以Cookie的方式将SessionID存放在客户端。
-当浏览器再次访问该服务器时,会将SessionID作为Cookie信息带到服务器,服务器可以通过该SessionID检索到以前的Session对象,并对其进行访问
2:Session工作流程
3:Session会话跟踪机制
用户发送请求
HttpSession session = request.getSession(); //getSession(false)方法使用已经存在的会话,而不必创建新会话
服务器的响应
再次发送请求
4:HttpSessoin接口
HttpSession接口常用的一些方法
–setAttribute(java.lang.String, java.lang.Object):在Session对象中用一个名字绑定一个对象。
–getAttribute(java.lang.String):通过名字获取Session对象中保存的对象。
–removeAttribute(java.lang.String):在Session中删除与一个名字对应的对象。
–getCreationTime():返回第一次创建会话的时间。
–getLastAccessedTime():返回容器最后一次得到该会话ID的请求时间。
–setMaxInactiveInterval(int interval):对于会话指定客户请求的最大间隔时间,以秒为单位。-1表示永不过期
–getMaxInactiveInterval(int interval):返回客户请求的最大间隔时间。
–invalidate():会话结束,当前存在在会话中的所有会话属性也会解除绑定。
–getId():此方法返回每个session唯一的标识
-......
5:会话超时管理
销毁会话可以采用如下三种简单的方式 //浏览器关闭时并不意味着Session对象被删除
–设置会话超时。
–在Session对象上调用invalidate()方法。
–应用结束(崩溃或取消部署)
在web.xml文件中配置 //以分钟为单位
6:Session持久化管理
有时候我们希望我们在关闭浏览器后,客户端cookie和服务器端session能不过期,那么下次访问的时候就不用再输入用户名和密码了,可以有很多种方法来延长session机制的有效时间。
首先session的持久化分客户端cookie和服务器端session(注意这里sessionid使用cookie存储,如果sessionid不用cookie的话,就无所谓持久化,每次关闭浏览器再次访问都要重新输入)。
客户端:
1、用session_set_cookie_params(),可以有很多参数,这里就只介绍第一个参数lifetime。只需要在session_start()之前调用该函数,并把lifetime的值设置长一点就行了(默认为0,即关闭浏览器则客户端清除cookie),那么下一次浏览器开启并访问的时候,如果cookie不过期那么就将sessionid带在请求头里发送到服务器。这样客户端的sessionid持久化就可以了。
2、在session_start之后用setcookie(session_name(),session_id(),时间,作用域)来设置cookie的生存周期,这里时间可以自己设置。区别:对于session_set_cookie_params(), 如果客户端带过来sessionid,那么该函数就不会执行,它会受session控制,如果客户端没有sessionid带过来,那么说明客户端已经过期,此时session_start会重新生成sessionid,cookie的生命周期由该函数控制。但对于setcookie,它是完全独立的,如果客户端带sessionid过来,那么该函数会为cookie更新设置生命周期,如果不带那么会为服务器端新生成的sessionid在客户端的cookie设置生命周期。所以该函数会持续的为客户端cookie更新生命周期,例如如果客户端第一次访问,设置cookie周期为2天,那么只要客户端浏览器浏览给服务器的时间间隔不大于两天,那么该cookie就永不过期。
服务器端:
服务器端可以设置session.gc_maxlifetime 项,php.ini中,默认session的生命周期是24分钟,大于24分钟那么服务器的垃圾回收机制可能会把他删除(前提是垃圾回收机制启动,gc的启动也是有概率的默认是每一次session_start会有1/1000的概率启动,可以根据情况自己设置)。这里如果把它设置成无限大,那么就会永久的不过期(这样做没有意义,会导致session文件大部分都是垃圾)。
注意:在有些情况下,多个网站在一个服务器上,那么就会导致每一个网站的session声明周期不同,但gc不会区别该session文件属于谁的,所以设置大也没用。解决办法就是自定义session文件的存储位置,那么别的网站启动gc的时候不会扫描到你的目录上来(可以参看session的垃圾回收机制一文)。
针对服务器端,如果是文件存储方式可以考虑上边的方法,但非常的不灵活,而且容易产生很多的session文件垃圾,所以可以自定义存储方式,采用数据库存储,那么就会很灵活而且可以让它不会产生session文件垃圾。
三:URL重写
Session对象的正常使用要依赖于Cookie
URL地址重写能够取得置于Cookie中的会话,并把会话ID附加到访问应用的各个URL最后
URL重写方法:
response.encodeURL()
response.encodeRedirectURL(“/lovobook/sucess.html” )
URL重写是容器自动完成的,但需要我们对URL进行编码才有效
总结:
1 HTTP协议使用的是无状态的连接,连接只针对一个请求/响应
2 状态管理方案:表单隐藏字段、Cookie、Session、URL重写
3 Cookie是Web服务器发送到客户端浏览器并保存的简短文本信息
4 Session对象就是服务器为客户端创建并维护的用于存放客户状态数据的对象
5 用户会禁用Cookie。这时我们可以使用URL地址重写来解决
6 通过HttpServletResponse的addCookie方法将该Cookie信息添加到响应信息中
7 Session对象是某个Servlet调用HttpServletRequest.getSession()这样的语句时才被创建
8 Session对象是保存在服务器端,浏览器关闭时并不意味着Session对象被删除
9 Session只认SessionID不认人
10 应当尽量使用维护时间短的域对象
11 在向客户返回第一个响应时,会同时尝试设置Cookie和URL重写两种做法