Servlet学习之路day04

会话跟踪(状态管理)

 HTTP协议 是 无状态连接的,我们客户端与服务端的每一次交流,对于服务器来说都是没有记忆的!

会话指的是:多次的请求与响应!

关于状态管理,提供了两种方式:
  1. 将存储的状态,管理在客户端:Cookie
  2. 将存储的状态,管理在服务端:Session

Cookie

技术原理

服务器在向客户端响应时,使用Cookie消息头的方式,将存储的状态响应给浏览器。

当浏览器接受Cookie后,会将所有的Cookie存储在一个文本文件中(.text)里,当浏览器再次向同一个服务器发起请求时,浏览器会自动将这些Cookie以消息头的形式 发送给服务器

如何创建一个Cookie

在Java中,Cookie是一个Java类,它是一个描述键值对的类,它的对象表示一个键值对!

可以通过创建对象的方式,得到一个Cookie,并指定Cookie的键与值。

格式:

	Cookie cookie = new Cookie(String key, String value);
如何将Cookie添加到响应头中

通过响应对象,调用addCookie添加到响应头中,一次响应可以添加多个Cookie!

格式:

	respones.addCookie(Cookie cookie);
如何从请求头中 得到Cookie数组

因为存储的Cookie可能是多个,所以得到的是一个数组!

格式:

	Cookie[] cookies = response.getCookies();

注意:

如果未存储Cookie,得到的是null !

如何调整Cookie的存活时长

格式:

	cookie.setMaxAge(int 秒);

能存储的最大值为:int类型的最大值!
——传入正数: 表示倒计时的秒数!
——传入0: 表示立即删除此Cookie
——传入负数:默认为-1,负数表示会话结束时自动删除!

Cookie存储路径问题

Cookie存在 替换 与 获取 操作:

Cookie的替换 只能由相同路径和相同域来完成!
Cookie的读取 只能由相同路径 或 子路径 和相同域可以读取!
强调:子路径设置的Cookie,父路径是无法读取到的!

设计三个不同的Servlet

 请求的的地址分别为:
 		AServlet		:	/x/a
 		BServlet		:	/x/b
 		CServlet		:	/c

案例结果:

A存储;
B : 可读,可替换。
C : 不可读,不可替换

C存储:
A,B : 可读,不可替换!

因为路径问题,我们经常使用Cookie时,会出现一些BUG

建议在项目开发的时,将所有的Cookie路径 设置为 “/”。

格式:

	cookie.setPath("/");
Cookie的优缺点 *****

优点:

  • 数据存储在浏览器中,分散了服务器的压力!

缺点:

  1. Cookie技术存储的数据类型有限制,不可存储中文。
  2. 数据存储在浏览器中,不安全,不建议存储敏感数据。
  3. 保存的数据大小 最大4kb。
  4. 依赖于用户浏览器的Cookie设置,用户可以禁止勾选Cookie。

Session

基于Cookie实现的!是一个键值对的容器!

技术原理

浏览器访问服务器时,服务器可以创建一个Session(Session是一个键值对的容器)!
每一个Session在创建时,会产生一个JSESSIONID,sessionid的值是唯一的!
服务器在响应数据时,会将Session的id 通过Cookie的方式 传递给浏览器,浏览器会存储到Cookie中!
当浏览器再次访问此服务器时,会将SessionID发送给服务器,服务器会自动寻找匹配的Session对象,当程序员使用Session的相关操作时,操作的对象就是针对于这个SESSIONID的对象!

如何获取Session

(Java中Session的类:HttpSession)

在Servlet中,通过getSession的方法,得到Session对象!

格式:

	//无参方法:
	request.getSession();		//推荐使用
	//用来获取一个Session对象,内部的实现是调用了一个参的方法,传入了一个Boolean类型的值true

	//一参的方法:
	request.getSession(boolean isNew);
	/*获取Session对象,参数的含义:
	*	- true : 根据当前浏览器的SessionId获取一个Session,
	*	如果SessionId不存在!则创建一个新的Session 使用!
	*	- false : 根据当前浏览器的SessionId获取一个Session,
	*	如果SessionId不存在,则返回null
Session常用方法
  • 设置&替换数据
	session.setAttribute(String key, Object value);
  • 获取数据
	Object value = session.getAttribute(String key);
  • 删除数据
	session.removeAttribute(String key);
  • 销毁Session
	session.invalidate();
设置Session的存活时间(会话时长)

默认会话时长为30分钟,当浏览器最后一次访问服务器 30分钟以后,没有再次连接就会销毁会话!

方式一
通过修改tomcat的conf/web.xml来完成默认tomcat会话时长的修改

	<session-config>
		<session-timeout>分钟数值</session-tiemout>
	</session-config>

方式二
通过调用session的方法,修改单个session的时长

	session.setMaxInactiveInterval(int 秒);
Session的优缺点:

优点

  1. 数据存储在服务器中,安全。
  2. session存储的数据类型是Object
  3. session存储的数据大小 理论上 无限制!

缺点:

  • 数据存储在服务器端,用户量大时,服务器压力较高! 很容易 耗尽服务器资源!

Cookie和Session的知识点 不是互斥的

我们通过在项目开发时:
对于安全不敏感的数据,使用Cookie存储,
对于安全有要求的数据,存储在Session中,
对于大数据,存储在数据库中!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值