Http状态管理
服务器把客户端的多次请求当做一个整体看待,就是把客户端前几次请求中的一些数据保存下来.
而这也正是http短连接的缺点.
1>Cookie
把数据保存在客户端.(跨请求了不能用转发)
案例:使用Cookie机制 在客户端发送的两次请求之间传递Cookie数据.
Cookie机制的运行原理:
1>第一次访问addCookie请求,在Servlet中向客户端添加 Cookie调用resp.addCookie("key","value"); 作用是web容器会在响应数据包中添加消息头
set-Cookie:key=value
2>浏览器接收该响应数据包后会解析该数据包发现set-Cookie消息头后把该Cookie信息保存到内存中.(默认)
3>浏览器再次发送findCookie请求时,会自动检索该携带的cookie信息在请求包中设置相应的cookie消息头.
4,服务器接收到请求数据包,对该数据包进行解析,把浏览器传来的cookie信息封装到reqest对象中,供程序员使用.
从而使用Cookie机制实现数据传递.
Cookie的编码问题
cookie的value不允许存放中文.(请求行和消息头中不能含有中文)
需要做一些转换才能传递:
添加cookie的时候,对中文进行编码.在获取cookie之后,对相应的数据进行编码.
所涉及的API
URLEncoder.encode("张三","utf-8不写按照默认编码")
URLDecoder.decode("%12%34","utf-8");
Cookie的生存时间:
默认情况下,cookie保存在浏览器内存中,会话结束时,cookie失效.
我们也可以设置cookie生存时间:
API:cookie.setMaxAge(int seconds);
若设置了cookie的生存时间,客户端就会把该cookie信息保存在硬盘上.直到时间结束,cookie才会失效(关闭浏览器不会失效).
Set-Cookie消息头:name="zs";expires=xxxxxxx
2>Session
把数据保存在服务器.
second>0:设置生存时间,cookie保存在硬盘上的时间
second=0:删除cookie信息
second<0:默认回话结束时进行销毁.
Cookie的path
path:的作用:
浏览器通过cookie的path路径来确定,当浏览器访问某个站点是,是否该携带该cookie一同封装请求数据包一同发送.
Cookie: path/web06/
http://localhost:8080/web06/login可以携带
http://localhost:8080/web06/user/login可以携带
http://localhost:8080/web07/login不可以携带但程序可以动态控制path
Cookie: path/web06/user/
http://localhost:8080/web06/login不可以携带
Cookie的限制:
保存cookie的数据量:
客户端有限制
cookie的安全新:
浏览器可以对cookie进行修改,所以比较铭感的信息不应该存入cookie
浏览器设置:
用户可以通过浏览器禁用cookie.
2>Session
把数据保存在服务器;
session机制的运行流程:
1>客户端发送请求,服务器端代码:
req.getSession()获取session对象.
getSession():
查看请求数据包中是否有一个JSESSION的COOKIe,如果有就会在session域中创建一个id与session对象映射关系,然后把刚刚创建的session对象作为方法的返回值返回,如果有该Cookie,则通过该cookie去session域寻找是否有匹配的映射关系(有或没有),若找的到则返回相应的session对象,若找不到则重新创建一对,把新创建的对象作为方法返回值返回.(web容器会自从向客户端添加一个jsessionid 的cookie)
session对象常用API
session.getId
session.setAttribute
session.getAttribute
session.removeAttribute
session.invalidate()销毁session对象
获取HttpSession对象的方法
request.getSession()
request.getSession(boolean)
boolean:
true:与request.getSession()相同
false:若在session域中找不到旧的session对象,则返回null.(服务器内存优化...)
在jsp中有内置对象session可以直接使用.
request
out
response
session
config
pageContext
Application
Servlet
<%%>直接使用的内置对象.(service方法会把这些局部变量初始化.)
web容器对session的优化:
1>session的生命周期:
默认情况下(tomcat),一个session若在容器中30分钟都没有客户端访问过,则直接把该session对象销毁掉.
我们可以通过代码设置session生命周期:
session.setMaxInactiveInterval(int second)
我们可以通过web.xml的配置,来访问当前应用中session对象的失效时间:
<session-config>
<session-timeout>num</session-time>
</session-config>
num:单位分钟.
session对象的钝化与激活
在sesion对象销毁之前web容器会自动判断哪些session不常用,会把session对象中的数据序列化输出到硬盘文件中.这个过程称为钝化.
如果session中的对象没有实现序列化接口,web容器就无法实现钝化操作,会出序列化异常
serializable
激活:若客户端又重新启用session对象,tomcat就会把硬盘中的数据读取到session对象中供用户使用,这个过程称为激活.