状态管理、cookie、session

本文深入探讨了HTTP协议的无状态特性及其对状态管理的需求,并详细介绍了使用Cookie和Session来解决状态管理问题的方法。重点阐述了Cookie的创建、查询、编码、生存时间、路径设置及限制,以及Session的概念、获取、使用、超时和案例应用。文章旨在帮助开发者掌握状态管理的关键技术,以提升Web应用的用户体验。
1、什么是状态管理?
http协议是一个无状态协议,当浏览器的请求
到达服务器时,服务器并不记录是谁访问它,
处理请求之后,返回结果给浏览器。当下一次浏览器
再次访问服务器,服务器并不清楚该浏览器曾经访问
过它。
有一些web应用,需要将浏览器与服务器之间的
多次访问当成一个整体来处理。比如:购物系统。
当浏览器发送一个购买请求,购物系统会记录这次请求
的相关数据,当浏览器再次发送购买请求时,会
将之前记录的数据进行相应的修改。
因为http协议是无状态协议,对于这样一些需要
状态管理的应用无能为力,需要额外的编程。也就是说,
要将浏览器与服务器之间多次访问的相关数据记录下
来,就叫状态管理。
2、cookie
1)什么是cookie?
浏览器向服务器发送请求时,服务器会将少量的
数据返回给浏览器(该数据以set-cookie消息头的
形式返回给浏览器),浏览器会将这些数据存放到
硬盘或者内存上。当浏览器下次再次访问服务器时,
会将之前存放的数据发送给服务器(以cookie消息头
的形式发送给服务器)。通过这种方式,就可以记录
浏览器与服务器之间交互的数据,也就是状态。
2)如何创建cookie?
Cookie cookie = new Cookie(String name,
String value);
response.addCookie(cookie);
3)查询cookie
Cookie[] cookies = request.getCookies();
如果没有cookie,则返回null。
String getName(); //返回cookie的名字
String getValue(); //返回cookie的值。
4)cookie的编码问题
cookie的值只能是ascii,如果要保存中文,需要
将中文转换成对应的ascii形式。
保存之前,先编码:
URLEncoder.encode(String str,
String encode);
比如:
String URLEncoder.encode("小美","utf-8");
查询之后,先解码:
URLDecoder.decode(String str,
String encode);
5)cookie的生存时间
setMaxAge(int seconds);
seconds > 0 : cookie实际保存的时间,如果
用户关闭浏览器,浏览器会将cookie保存到
硬盘上。
seconds = 0: 删除cookie。
怎样删除:
比如要删除一个名叫"c1"的cookie。
Cookie c = new Cookie("c1","");
c.setMaxAge(0);
response.addCookie(c);
secodes < 0: 默认值,浏览器会将cookie
保存到内存里。
6)cookie的路径问题
所谓路径问题,指的是,浏览器在访问
服务器时,会先比较要访问的组件的路径与
cookie的路径,只有匹配的cookie才会发送。
cookie的路径的默认值:
与保存cookie的组件的路径是一样的。
比如:
使用/appname/jsp1/addCookie1.jsp保存
cookie,则对应的cookie的路径也是
/appname/jsp1。
cookie的路径其实就是一个顶层目录,要访问
的组件的路径必须是该目录的子目录,或者
就是该目录,浏览器才会将该cookie发送给
服务器。
可以通过 setPath(String path)来设置cookie
的路径。
比如:
//访问同一个应用内部,都会发送该cookie
cookie.setPath("/appname");

//访问同一个服务器中的所有应用,都
//会发送该cookie
cookie.setPath("/");
练习:
写一个Add_FindCookieServlet,该Servlet运行
时先查询有没有名叫"cart"的cookie,如果有,则
显示cookie的值,如果没有,则创建该cookie。
(cookie的值随便填写一个就行了)。
7),cookie的限制
a,浏览器可以禁止cookie。
b,保存的数据量有限(大约4k)
c,保存的数据类型只能是字符串。
d,保存的值需要考虑编码问题。
e,因为cookie保存在客户端(也就是浏览器
所在的那台机器),值可以被查看。所以,不
要使用cookie记录敏感信息。
3、session
1)什么是session?
浏览器访问服务器时,服务器会创建一个
对象(该对象也称为session对象,该对象
有一个唯一的id号与其对应)。然后,服务器
会将id号发送给浏览器(默认情况下,使用cookie
机制发送)。当浏览器再次访问服务器时,会将
id号发送过来。服务器可以依据id号找到对应的
session对象。通过这个session对象,来保存
状态。
2)如何获得session对象。
方式一:
HttpSession s = request.getSession(boolean flag);
当flag = true时:
服务器会检查请求当中是否包含session id,
如果没有,则创建session对象。
如果有,则服务器会依据该id查找对应的session
对象是否存在:
如果存在,不创建了。
如果不存在,则创建一个新的session对象。
当flag = false时:
服务器会检查请求当中是否包含session id,
如果没有,不创建,返回null。
如果有,则服务器会依据该id查找对应的session
对象是否存在:
如果存在,不创建了。
如果不存在,返回null。
方式二:
HttpSession request.getSession();
与request.getSession(true)完全一样。
3)session的使用
//返回session id
String session.getId();
//绑订
session.setAttribute(String name,Object obj);
obj最好实现Serializable接口,原因是:
a,服务器有可能会将session的状态写入到硬盘或者
数据库,目的是减少session对内存资源的占用。
服务器会使用序列化协议来实现写入操作。
b,在集群环境下,需要进行session的同步,也就是,
当某台服务器上的某个session的状态发生改变,
需要将这种改变同步到其它服务器上的对应的
session。也会使用到序列化技术。


//通过绑订名,获得绑订值。该方法有可能返回null
Object session.getAttribute(String name);
//解除绑订
session.removeAttribute(String name);
4)session超时
服务器会将超过指定时间的session对象从内存中
删除。
//设置最大不活动时间,超过该时间,服务器
//会删除该session对象。
session.setMaxInactiveInterval(int seconds);
服务器也有一个默认的超时限制(比如tomcat,
30分钟),可以修改这个默认的时间:
方式一:改整个服务器的配置
tomcat可以改tomcat_home/conf/web.xml文件,
<session-config>
<session-timeout>30</session-timeout>
</session-config>
方式二:只改某个应用的web.xml
5)案例:
a,session验证
对于需要受保护的资源(比如页面,或者
servlet),添加验证,只有验证通过的请求,
才允许访问。
如何验证:
step1 在登录成功之后,向session
绑订用于验证的数据。比如绑订用户
对象。
step2 对于受保护的资源,在调用之前,
先执行session.getAttribute();如果能取
到之前绑订的验证数据,说明已经登录,
可以访问,否则,重定向到登录页面。

//立即销毁session对象。
session.invalidate():
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值