• 11、JavaWeb启程——会话跟踪技术Cookie&Session


    1、HTTP无状态

    1、问题引出

    【简介】: HTTP是无状态的,也就是没有记忆力的,也无法确定发出请求的用户身份,只负责一问一答。

    【问题】: 多个请求之间无法共享数据。

    【解决方案】:

    • 传参方式,直接在路径上携带参数,(不推荐使用,不安全)
    • Cookie客户端会话跟踪技术
    • Session服务端会话跟踪技术

    2、Cookie

    1、Cookie概述

    【简介】: Cookie 是 客户端技术,程序把每个用户的数据以 cookie 的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的 Web 资源时,就会带着各自的数据到服务器。这样,Web 资源处理的就是用户各自的数据了。

    2、Cookie原理图

    在这里插入图片描述

    3、Cookie的基本使用

    1、创建Cookie对象

    • 语法
    Cookie cookie = new Cookie(String name,String value);
    
    • 1
    • 参数
    属性方法说明
    namegetName()共享数据名称
    valuegetValue()要共享的数据

    2、响应Cookie给浏览器

    • 语法
    resp.addCookie(cookie);
    
    • 1

    3、服务端获取Cookie

    【说明】: 浏览器发请求时,自动将 Cookie 发送到服务器,服务器程序直接获取即可。数据在请求中,使用请求对象中的 getCookies() 方法获取所有的 Cookie 对象。

    • 语法
    Cookie[] cookies = requset.getCookies();
    
    • 1

    4、修改Cookie数据的方式

    • 调用Cookie对象中的SetValue方法覆盖原来的数据
    • 重新创建一个同name的Cookie对象

    【注意】: 以上两种方式都会修改Cookie的数据,但是修改的都是服务端的数据,和浏览器中存的Cookie没有关系,所以需要将新的Cookie重新响应给浏览器进行更新。

    【语法】:

    resp.addCookie(新的 Cookie 对象);
    
    • 1

    5、设置Cookie的存活时间

    【语法】:

    cookie.setMaxAge(int expiry);
    
    • 1

    【参数】:

    expiry 数值举例说明
    大于0setMaxAge(60)Cookie存活时间,单位为秒,例:60s
    等于0setMaxAge(0)立即删除当前Cookie
    小于0setMaxAge(-1)会话Cookie,浏览器关闭就销毁

    6、删除Cookie

    【语法】:

    cookie.setMaxAge(0);
    resp.addCookie(cookie);
    
    • 1
    • 2

    【注意】: 在删除cookie之后要重新发送给浏览器去更新Cookie。

    7、Cookie的域和路径

    【域和路径的作用】: 为了让浏览器可以识别 Cookie 发送给对应的服务器,以及识别哪些请求需要携带 Cookie,默认Cookie 都带了服务器的识别标识以及需要带 Cookie 的资源标识,这是出于安全考虑,为了保护Cookie 中的数据不被带到其他服务器中去。

    【域】: 域用来识别服务器,包含 IP:端口或域名:端口,可通过 Cookie 对象的 setDomain 方法设置。默认Cookie 中的域是创建 Cookie 的服务器的域名。

    【举例】: 若想要在相同的主域名下来共享 Cookies 数据,例如,百度和百度地图,百度音乐共用账号,则只需要设置 Cookie 的 domain 即可。若主域不同,是无法共享 Cookie 数据。

    cookie.setDomain(".baidu.com");
    
    • 1

    【路径】: 路径用来识别资源,可通过 Cookie 对象的 setPath 方法设置。默认为创建 Cookie 的资源的路径。

    【举例】: /cookie/login 创建 Cookie,则 path 为 /cookie,则访问 /cookie 开头的资源都会携带该Cookie。若想要在访问服务器上的任意资源都带上 Cookie,则只需要在创建 Cookie 之后设置下 path 为 / 即可。

    cookie.setPath("/");
    
    • 1

    8、使用场景

    • 存储用户标识,解决HTTP无状态问题
    • 登录时记住用户名
    • 未登录的情况下实现购物车

    9、Cookie存在的问题

    • 若是一个用户一台电脑,没有问题,但是若多个人公用一个电脑就存在不安全问题。
    • 存中文数据 (Tomcat8.5 之内) 比较麻烦(编码,解码)。
    • 一个 Cookie 只能设置一个值,值须字符串类型。
    • 一台服务器在一个客户端存储的 Cookie 大小和数量有限:
      • Cookie 大小限制在 4KB 之内;
      • 一台服务器在一个客户端最多保存 20 个 Cookie;
      • 一个浏览器最多可以保存 300 个 Cookie。

    3、Sessison

    1、Session原理图

    在这里插入图片描述

    2、Session的基本使用

    1、获取Session

    方法作用
    getSession(true)判断是否存在 Session,存在则获取,不存在则创建新 Session 对象返回
    getSession(false)判断是否存在 Session,存在则获取,不存在则返回 null (不符合需求)
    getSession()判断是否存在 Session(浏览器是否带了 sessionId),存在则获取,不存在则创建新 Session 对象返回(推荐)

    2、Session共享数据

    • HttpSessionAPI:
    方法作用
    setAttribute(String name, Object value)设置属性名和属性值
    getAttribute(String name)通过属性名去获取属性值
    removeAttribute(String name)从 Session 中移除指定属性名的属性值
    invalidate()移除整个 Session 对象,删除所有的属性和属性

    3、Session超时管理

    【全局修改】:

    <session-config>
    	<session-timeout>30session-timeout>
    session-config>
    
    • 1
    • 2
    • 3

    【局部修改】:

    // 设置超时时间,单位:秒
    session.setMaxInactiveInterval(int interval);
    
    • 1
    • 2

    4、Session使用规范

    • 命名规范:一般我们命名格式为:XX_IN_SESSION,而且这个属性名是唯一的。
    • Session存放多个有联系的数据的时候封装为对象。
    • 服务器在做 Session 数据共享时,Session 中的存储的对象类型须实现 java.io.Serializable 接口

    5、URL重写

    【问题】: Session 是基于 Cookie 的,sessionId 是存在浏览器上,用户可选择不接受 Cookie 或者禁用 Cookie,此时 Session 失效。

    【解决方案】:

    • 只要在请求路径后面拼接 jsessionid,使用 ; 来间隔。

    【servlet中重写URL】: 在请求的 URL 后面拼接 jsessionid(自动检测用户是否开启 Cookie 接收,若开启了,则不拼接jsessionid)

    response.encodeURL("/session/list");
    
    • 1

    【在jsp中重写URL】:

    • 脚本重写
    <%
    String url = response.encodeURL("/session/list");
    %>
    
    • 1
    • 2
    • 3
    • EL重写
    ${pageContext.response.encodeURL("/session/list")}
    
    • 1

    \

  • 相关阅读:
    operator=中自我赋值和异常安全问题
    【可扩展性】谷歌可扩展和弹性应用的模式
    荣幸地成为2022-2023年度中国第一个login的Oracle ACE
    LyScript 实现绕过反调试保护
    [Day 76] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
    读 | SA : The Hard Parts 之数据所有权
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java智慧社区家政服务系统80q7o
    多路并归,贪心:《信息学奥赛一本通》:池塘钓鱼
    一文说明白ECDSA spec256k1 spec256r1 EdDSA ed25519千丝万缕的关系
    【03】Spring源码-手写篇-手写AOP实现(上)
  • 原文地址:https://blog.csdn.net/m0_37911124/article/details/127712338