状态管理-cookie/session

状态管理

(1)什么是状态管理?

将浏览器与web服务器之间多次交互当作一个整体来处理,并且将多次交互所产生的数据保存下来。

注:
状态指的是多次交互所产生的数据。
管理指的是如何保存这些数据。

(2)如何进行状态管理?

a.将状态保存在浏览器端(Cookie)。

b.将状态保存在服务器端(Session)。

(3)Cookie

1)Cookie是什么?

服务器端临时存放在浏览器端的少量数据,用于保存用户的状态。

2)Cookie的工作原理?

当浏览器第一次访问服务器时,服务器会将少量数据以set-cookie消息头的形式发给浏览器,浏览器会将这些数据临时保存下来;当浏览器再次访问服务器时,会将之前存放的这些数据以cookie消息头的形式发送过来。

3)Cookie的添加(服务器端发送cookie给浏览器)。

Cookie c = new Cookie(String name,String value);

注:
name一般称之为cookie的名字,value称之为cookie的值。
cookie只能存放字符串!
response.addCookie©;

4)Cookie的读取(即读取浏览器端发送过来的Cookie)

Cookie[] request.getCookies();
注:
该方法有可能返回null。
String cookie.getName();
String cookie.getValue();

5)Cookie的生存时间

a.默认情况下,浏览器会将cookie保存在内存里面,浏览器只要一关闭,cookie会被删除。

b.可以调用cookie.setMaxAge(int seconds)方法来设置cookie的生存时间。
b1.单位是秒。
b2.值可以是>0,=0,<0。
>0: 比如 cookie.setMaxAge(60)
浏览器会把cookie保存在硬盘上,如果超过指定的时间,浏览器会删除该cookie。
<0: 默认值(即cookie会保存在内存里面)。
=0: 立即删除cookie。
比如,要删除一个名称为"username"的cookie:
Cookie c = new Cookie(“username”,"");
c.setMaxAge(0);
response.addCookie©;

6)cookie的编码问题

a.什么是cookie的编码问题?

cookie只能存放合法的ascii字符,对于中文,需要将其转换成
合法的ascii字符的形式。

b.如何处理?

在添加cookie时,使用encode方法来编码
String URLEncoder.encode(String str,String charset);
在读取cookie时,使用decode方法来解码
String URLDecoder.decode(String str,String charset);

c.建议,在添加cookie时,不管是否是中文,都统一使用encode方法
来处理。

7)cookie的路径问题

a.什么是cookie的路径问题?

浏览器在向服务器发送请求时,会比较请求地址是否符合cookie的路径要求,只有符合要求的cookie才会被发送。

b.Cookie的默认路径

cookie都有一个默认路径,默认路径等于添加该cookie的web组件的路径,比如/servlet06-lab2/biz01/addCookie.jsp添加了一个cookie,则该cookie的默认路径就是"/servlet06-lab2/biz01"。

c.哪一些cookie会被发送?

请求地址要么等于cookie的路径,要么是其子路径。
比如,cookie的路径是"/servlet06-lab2/biz01",则:
/servlet06-lab2/findCookie1.jsp no
/servlet06-lab2/biz01/findCookie2.jsp yes
/servlet06-lab2/biz01/aaa/findCookie3.jsp yes

在这里插入图片描述

d.可以修改cookie的默认路径

cookie.setPath(String path);

8)cookie的限制

a.cookie可以被用户禁止。
b.cookie不安全。
对于敏感数据,一定要加密处理。
c.cookie只能存放少量数据。
大约4k左右。
d.cookie的数量也有限制。
大约几百个。
e.cookie只能存放字符串。

2.Session(会话)

(1)session是什么?

服务器为了保存用户状态而创建的一个特殊的对象,该对象一般称之为session对象。

(2)session工作原理

当浏览器第一次访问服务器时,服务器会创建一个session对象(该对象有一个唯一的id,一般称之为sessionId),接下来服务器会将sessionId以cookie的方式发送给浏览器。当浏览器再次访问服务器时,会将sessionId发送过来,服务器就可以利用sessionId找到对应的session对象。

(3)如何获得session对象?

方式一:

HttpSession s = request.getSession(boolean flag);

注:
当flag为true时,先查看请求当中是否有sessionId,如果没有sessionId,则创建一个session对象;如果有sessionId,则依据该sessionId去查找对应的session对象,如果找到了,则返回该session对象,如果没有找到,则创建一个新的session对象。当flag为false,先查看请求当中是否有sessionId,如果没有,返回null;如果有sessionId,则依据该sessionId去查找对应的session对象,如果找到了,则返回该session对象,如果没有找到,返回null。

在这里插入图片描述

方式二:

HttpSession s = request.getSession();
等价于 request.getSesion(true)。

(4)使用session进行状态管理

a.将数据绑订到session对象上:
session.setAttribute(String name,Object obj);
b.依据绑订名获得绑订值:
Object session.getAttribute(String name);
c.解除绑订:
session.removeAttribute(String name);

(5)session超时

a.什么是session超时?

服务器会把空闲时间过长的session对象从内存当中删除。
为了节省内存空间。

注:
空闲时间一般是半个小时。

b.如何修改超时时间长度?

方式一: 修改web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>

注:
每一个web应用都有一个web.xml,另外,容器也有一个
web.xml。

方式二: session.setMaxInactiveInterval(int seconds);

注:
用于设置两次请求之间最大的间隔时间长度,如果超过这个
时间长度,服务器会将session删除。

(6)删除session

session.invalidate();

session验证

step1.登录成功之后,在session对象上绑订一些数据,比如:

session.setAttribute("username","Tom");

step2.当用户访问需要保护的资源时(即只有登录成功之后才能访问的
资源,比如success.jsp),则进行session验证。

Object obj = session.getAttribute("username");
if(obj == null){
	response.sendRedirect("login.jsp");
	return;
}

在这里插入图片描述

比较cookie与session

session的优点是安全、支持更多的数据类型、可存放的数据量更大。
但是,session会占用服务器端的内存空间,如果用户量大,会严重
影响系统性能(cookie不会占用服务器端的内存空间)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值