状态管理

状态管理


为什么状态管理

http协议是“无状态”协议。
特定的场景(多次购买产品、多次请求中需要使用用户的账号信息、验证码、保存登录用户的账号信息、自动登陆),用于是否登陆的权限验证。

什么是状态管理

将客户端与服务器之间的多次交互当做一个整体来看待,并将多次交互所涉及的数据即状态保存下来。
采用servlet手段,实现服务器保存客户状态。

客户端管理技术:Cookie

创建并发送Cookie

String userName = request.getParameter("userName");
// 创建Cookie
Cookie cookie = new Cookie("userName", userName);
// 设定Cookie的存活时间
cookie.setMaxAge(24*60*60);
// 将Cookie写入到客户端的浏览器
response.addCookie(cookie);

读取Cookie

Cookie[] cookies = request.getCookie();
String userName = null;
if (cookies != null) {
    for (Cookie cookie : cookies) {
        if (cookie.getName().equals("userName")) {
            // 获取cookie的值
            userName = cookie.getValue();
        }
    }
}

Cookie的性质

客户端(浏览器)向服务器发出一个请求,服务器会将一小段符号串以set-cookie消息头的方式发送给客户端,浏览器会存储这一小段信息。当浏览器再次向服务器发出请求时,浏览器会自动发送这一小段文本信息。

Cookie是生命周期

默认情况下,cookie存在浏览器的内存中,所以关闭浏览器,cookie会消失。
设置生命周期:setMaxAge(int seconds) (单位:秒)
second > 0 :在硬盘上保存的最大时间
second = 0 :立即销毁
second < 0 :等价于默认情况(保存于浏览器的内存中)

编码问题

//编码      URLEncoder.encode()
Cookie cookie = new Cookie("name",URLEncoder.encode("张三", "UTF-8"));

//解码      URLDecoder.decode()
String value = URLDecoder.decode(cookie.getValue(), "UTF-8")

路径问题

请求一个web组件生产一个Cookie时,默认的就会把这个组件的路径作为Cookie的路径存起来
只有当访问的路径是这个Cookie的路径或其子路径时,浏览器才会发送Cookie

修改Cookie的默认路径:cookie.setPath(path)

Cookie的限制

  1. Cookie只能存储字符串,大小不能超过4KB。
  2. 各浏览器厂商对Cookie的个数有限制。
  3. Cookie有可能占用过多的网络资源。
  4. Cookie存储于客户端,如明文存储,不安全。

Session:会话

什么是Session

Session是实现状态管理的一种手段,保存多次交互数据的时是存在服务器端的,在客户端与服务器端传递的只是Session的编号。

Session的原理

客户端第一次访问Server,server会为不同的客户端创建一个Session对象。在提供响应时将session对象唯一的编号以set-cookie消息头的方式发给客户端,客户端将收到的id保存在内存中。再次发生请求时,内存中的id自动的发送给服务器端,服务器端根据id找Session对象。

创建Session对象

HttpSession session = request.getSession(bool);

bool = true 先根据传来的sid找Session对象,找到则返回,找不到则创建一个新的Session对象。如请求中无sid,那么直接创建一个Session对象,所以一定能得到一个Session对象
bool = false 根据sid找,找到了返回,找不到返回null。

HttpSession session = request.getSession();
// 等价于request.getSession(true);

使用Session绑定数据

session.setAttribute(String name , Object value);
Object session.getAttribute(String name);
session.removeAttribute(String name);

Session验证

一些资源只有用户登录后才能访问

Session的超时问题

容器会将一些闲置很久的Session进行回收,闲置(空闲)时间就是Session的生命周期。
默认的超时时间:30分钟
声明式设置:tomcat/conf/web.xml设置
使用代码设置:setMaxInterval(seconds)

删除Session

session.inValidate()

使用该方法可以实现登出操作,登出就是讲曾经记录过登录信息的session对象销毁掉,用户无权再访问那些受保护的资源了

禁用Cookie的后果

基于Cookie来存储的sid就会失效,Session无法使用。
解决禁用Cookie后Session依然能够使用,使用URL重写。
URL重写:改变地址栏中的内容,以新的形式访问服务器并且还能携带一个sid。

//response.encodeRedirectURL()  重定向时用于对地址进行处理
response.sendRedirct(response.encodeRedirectURL("目标地址"))

//response.encodeURL()          超链接、表单提交

如禁止Cookie,会在地址栏中加入sid,以分号隔开。如Cookie未被禁用,则不显示。

Session的应用场景

登陆功能:Session.setAttribute()
登出功能:Session.invalate()
受保护资源:Session.getAttribute() 判断这个取值结果来间接知道是否经历过登陆功能。

验证码

  1. 为什么使用验证码?防止恶意攻击,不停注册,不停的登陆来占用服务器资源。
  2. 验证码原理:只有发请求时,才将随机产生的字符组合绘制到图片上,返回。
  3. 如何绘制验证码?绘制一张从白纸到内容法过程。
    (1)有一张空白的图片(指定大小区域)
    (2)针对这张纸获取画笔
    (3)设置画笔颜色
    (4)绘制背景
    (5)更改颜色
    (6)绘制内容
    (7)绘制内容完成后,保存图片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值