• Java——状态管理


    一、什么是状态管理

    因为web应用程序是基于Http请求的,而Http协议

    一个短连接的协议,一次请求一次响应之后,浏览器

    和服务器之间就断开了连接,同一个用户下一次请求需要

    重新建立连接,无法跟踪用户的状态信息,我们需要

    跟踪同一个用户的多次请求,就对这些请求进行状态管理,

    将他们当做是一个整体来看待

    状态:多次交互过程中产生的数据

    管理:对数据进行管理

    状态管理方式:

    cookie:浏览器客户端状态管理,将状态数据保存在浏览器上

    session:服务器端状态管理,将状态数据保存在服务器内存中

    二、Cookie状态管理

    1、Cookie的执行原理

    1>浏览器在第一次向服务器发送请求之后,

    服务器可以创建一个cookie对象,然后通过

    响应数据包的响应消息头带回给浏览器

    Set-Cookie:name=lisi

    2>浏览器接收并解析响应数据包,取出响应消息头

    中的cookie信息,存储在浏览器端

    3>在后续浏览器每次向服务器发送请求时,

    会在请求数据包中以请求消息头方式将

    cookie信息带给服务器

    Cookie:name=lisi

    4>服务器在接收到cookie之后,取出存储在

    cookie中数据进行继续处理,从而完成

    状态管理

    2、cookie的相关API方法

    1>创建cookie对象

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

    2>添加cookie到响应数据包中

    response.addCookie(c);

    3>获取浏览器传过来的所有cookie

    Cookie[] cookies = request.getCookies();

    4>获取cookie的name和value

    String name = cookie.getName();

    String value = cookie.getValue();

    5>修改cookie的value值

    cookie.setValue("value");

    3、cookie的中文处理

    cookie的name和value不能直接存储中文,

    需要对中文进行编码

    编码:URLEncoder.encode(中文内容,编码方式)

    解码:URLDecoder.decode(获取内容,编码方式)

    4、cookie的过期时间

    默认情况下,cookie是存储浏览器内存中的,

    只要浏览器不关闭,cookie就一直存在,

    浏览器关闭之后,cookie就被删除了,

    服务器可以通过setMaxAge()方法来修改

    cookie默认的过期时间,单位是秒

    取值:

    >0:将cookie保存在浏览器的磁盘文件中,跟浏览器是否关闭无关,只有超过时间才会删除,

    cookie就会一直存在,浏览器关闭,cookie被删除(默认值)

    =0:立即删除浏览器上的cookie不存储,无论浏览器是否关闭

    5、cookie的优缺点

    1>cookie是将信息保留在浏览端,

    可以被用户修改和删除导致不安全,

    也可以被用户禁止

    2>浏览器端保存的cookie数量是有限制(4k)

    3>cookie的值只能ASCII字符串

    三、Session状态管理

    1、Session的执行原理

    1>前端浏览器在第一次向服务器发送请求后,

    服务器可以创建一个session对象,并给这个

    session对象分配一个32位的唯一id,也就是

    JSESSIONID,并将相关信息存入到session对象中

    2>在服务器第一次给前端浏览器返回响应时,

    会在响应数据包中以Set-Cookie的响应头

    将JSESSIONID带回给浏览器

    3>浏览器接收并解析响应数据包,取出响应消息头

    中的JSESSIONID,以cookie的方式存储在浏览器端

    4>在后续浏览器每次向服务器发送请求时,

    都会在请求数据包中以Cookie请求消息头的方式

    将JSESSIONID带回服务器

    5>服务器接收并解析请求数据包,取出请求消息头中

    的JSESSIONID,并根据JSESSIONID找到之前创建的

    session对象,取出相关信息,从而完成状态管理

    2、session相关的API

    1>创建或查找session

    HttpSession session = request.getSession();

    2>往sesion中存储数据

    session.setAttribute(String name,Object value);

    3>从session中根据key获取value

    Object value = session.getAttribute(String name);

    4>从session中根据key移除键值对

    session.removeAttribute(String name);

    域对象:

    1>HttpServletRequest

    只在一次请求间传递共享数据

    2>HttpSession

    同一个用户的多次请求间传递共享数据

    3>ServletContext

    同一个web应用程序下传递共享数据

    存储数据建议:尽量往小的域空间中存储数据,避免数据覆盖

    转发:通过request传递数据

    重定向:通过session传递数据

    3、session的超时时间

    默认情况下,服务器端的session对象超时时间为30分钟

    修改session默认的生成时间:

    1>通过tomcat下web.xml配置文件来进行修改,

    单位是分钟,修改为0或负数表示永远不失效,

    一般不建议修改这里,他是针对容器中

    所有应用程序的所有session来进行设置的

    2>session.setMaxInactiveInterval(int seconds);

    设置某个session的生存时间,单位为秒

    如果设置0或负数,表示session永远不会失效

    3>session.invalidate();

    立即销毁session对象

    4>Tomcat容器关闭或重启后,所有应用中的所有session对象

    都会被销毁

    4、session的优缺点

    1>session是将数据保存在服务器端,更加安全

    2>session可以保存的数据类型更多,数据量更大

    3>创建的session过多,数据量过大,会增加服务器内存压力

    5、session的使用场景

    1>登录验证

    2>权限验证

    3>验证码

    1)验证码作用

    防止机器人恶意攻击破坏系统

    2)验证码原理

    服务器端生成一串数据,然后以人能够

    识别,但是机器人不能识别的方式发给

    用户,用户接收到验证码之后,再将验证码

    发送给服务器,服务器接收用户发送的验证码

    和之前生成的验证码作比对

    3)常见验证码

    图片,邮箱,短信,滑动块,点文字,语音...

    1、完成登录验证, 用户未登录不能执行员工的增删查改功能

    2、登录成功在在右上角和左下角显示登录用户名称

    3、退出

    4、注册验证

    1>账号必须是2-6位英文

    2>密码2-6位纯数字

    3>重复密码验证

    4>验证码

    5>判断账号是否重复

    5、在emp表中添加一列,表示他所关联的用户

    不同用户登录后,查看到的不同员工信息

    6、分页查询

    页码 页容 param1 param2

    1 3 0 3

    2 3 3 3

    3 3 6 3

    select * from emp limit 0,3;

    select * from emp limit 3,3;

    select * from emp limit 6,3;

    页码:page

    页容:pageSize

    param1:(page-1)*pageSize

    param2:pageSize

    分页公式:

    当前页:select * from emp limit (page-1)*pageSize,pageSize;

    总记录数:select count(*) from emp; total

    总页数pageCount :total%pageSize==0?total/pageSize:total/pageSize+1

     

  • 相关阅读:
    【LeetCode】Day127-四数之和 & 组合总和
    自适应辛普森法积分算法推导
    Codeforces Round #818 (Div. 2)
    Git基本操作(超详细)
    stack&queue&priority_queue
    L1-035 情人节 c++解法
    使用Node.js手撸一个建静态Web服务器,内部CV指南
    云效-流水线(基本教程)
    Spring In Action 5 学习笔记 chapter4 Spring Security部分关键点
    dfs找欧拉回路模板
  • 原文地址:https://blog.csdn.net/m0_72254454/article/details/126770354