web06 Http状态管理

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对象中供用户使用,这个过程称为激活.





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值