状态管理:Cookie与Session

1.状态管理

(1)什么是状态管理?

将浏览器与web服务器之间多次交互当做一个整体来处理,并且将
多次交互所涉及的数据(即状态)保存下来。

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

方式一: 将状态保存在浏览器端(使用cookie)。

方式二: 将状态保存在服务器端(使用session)。

2.Cookie

(1)什么是Cookie?

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

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

cookie

(2)如何添加Cookie?

	Cookie c = new Cookie(String name,String value);
	response.addCookie(c);
	注:
		cookie只能存放字符串。
		cookie都有一个名字,值是一个字符串。

(3)如何读取Cookie?

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

(4)Cookie的生存时间

默认情况下,浏览器会将Cookie存放到内存里面,浏览器关闭,则
Cookie会被删除。

cookie.setMaxAge(int seconds);
注:
	单位是秒。
			比如保存一个月  30 * 24 * 60 * 60
	seconds > 0时:
		浏览器会将cookie保存在硬盘上(一般是一个小的文件),
		超过指定时间,浏览器会将cookie删除。
	seconds < 0时:
		缺省值(浏览器会将Cookie存放到内存里面)。
	seconds = 0时:
		浏览器会删除该cookie。
			比如,要删除一个名称为username的cookie:
			Cookie c = new Cookie("username","");
			c.setMaxAge(0);
			response.addCookie(c);

(5)Cookie的编码问题

Cookie只能存放合法的ascii字符,如果要存放中文,需要将中文转换成
对应的ascii字符的形式(即编码)。

String URLEncoder.encode(String str,String charset);
String URLDecoder.decode(String str,String charset);

建议,在添加Cookie时,统一编码处理。

(6)Cookie的路径问题

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

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

b.Cookie的默认路径

等于添加该Cookie的web组件的路径。比如,/day06/biz01/addCookie.jsp,则该jsp添加的cookie,则该cookie的路径就是
"/day06/biz01"。

c.匹配规则

请求地址要么等于cookie的路径,要么是其子路径,符合该要求的
cookie会被发送。
比如,cookie的路径是"/day06/biz01",则
	"/day06/findCookie1.jsp"   no
	"/day06/biz01/findCookie2.jsp"	 yes
	"/day06/biz01/sub/findCookie3.jsp" yes

d.修改Cookie的路径

cookie.setPath(String path);

path

(7)Cookie的限制

a.Cookie可以被用户禁止。

b.Cookie不安全。

cookie是一种客户端的状态管理技术,数据都保存在浏览器端,
所以,对于敏感数据,一定要加密处理。

c.Cookie只能保存少量数据。

大约是4k左右。

d.Cookie的数量也有限制。

大约是几百个。

e.Cookie只能存放字符串。

3.Session (会话)

(1)什么是Session?

服务器端为了保存用户的状态而创建的一个特殊的对象。

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

(2)如何获得Session对象?

1)方式一

HttpSession session = request.getSession(boolean flag)

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

2)方式二

HttpSession session = request.getSession();

注:
	等价于request.getSession(true);	 

session

(3)常用方法

//绑订数据
session.setAttribute(String name,Object obj);
//依据绑订名,获得绑订值,如果绑订值不存在,返回null
Object session.getAttribute(String name);
//解除绑订
session.removeAttribute(String name);

count

(4)session超时

什么是session超时?

服务器会将空闲时间过长的session对象删除掉。
目的是为了节省内存空间。
注:
	大部分服务器默认的超时时间限制是30分钟。

如何修改超时时间?

方式一 修改服务器的配置文件(web.xml)
	
	<session-config>
        <session-timeout>30</session-timeout>
    </session-config>

方式二 session.setMaxInactiveInterval(int seconds);
	注:
	该方法用于设置两次请求之间的最大间隔时间,如果超过这个时间,session对象会被销毁。

(5)删除session

session.invalidate()

(6)session验证

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

session.setAttribute("user",user);

step2. 当用户访问需要保护的资源时(即只有登录之后的用户才能访问的
资源),进行session验证:

Object obj = session.getAttribute("user");
if(obj == null){
	//没有登录,重定向到登录页面
	response.sendRedirect("login.jsp");
}

check

(7)比较session与cookie

session支持更丰富的数据类型(cookie只能存放字符串)、更安全、
可以存放更多的数据(cookie只能存放少量的数据)。
但是,session是将状态保存在服务器端,有可能会占用过多的内存。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值