首页 > 其他分享 >会话管理--Cookie和Session

会话管理--Cookie和Session

时间:2024-10-17 19:19:57浏览次数:3  
标签:session -- Session cookie Cookie HttpSession 客户端

一.会话管理

1.概述

它是指管理和跟踪用户与系统之间交互过程的技术手段。每次当用户登录到某个网站或应用后,直到用户退出或者超时这段时间内,所发生的一系列交互就被认为是一个会话(Session)。会话管理的主要目的是确保在用户进行多步骤操作时,能够持续保持用户的登录状态,并且保证数据的安全性和完整性。

我们常用的Http协议是一种无状态的协议。什么是无状态呢?就是指每个请求都是独立的,服务器处理请求时不会保留任何上下文信息。也就是说,从技术上讲,每次客户端发送请求到服务器时,服务器都不会记住之前与该客户端之间的任何交互历史。每次请求都必须包含所有必要的信息,以便服务器能够理解并正确处理请求。而会话管理有要求我们能够保持用户的登录状态,那么显然光靠Http协议是不够的,这时就要通过Cookie和Session技术了。

2.通过Cookie和Session实现会话管理

要想在客户端发出请求时,服务端能够识别该客户端,以保持数据的连续性和完整性。显然首先服务端得存储和对应客户端相关的信息,而存储该信息的便是Session对象。要想要想服务端能够匹配不同的客户端对应的session,则还需要一把密钥,通过该密钥使得服务端能够准确识别并且找到对应的Session对象,而该密钥则是存放于客户端的Cookie对象之中,以键值对JSESSIONID=***的形式。***就相当于密钥值,是一串数字,唯一对应一个Session对象。

二.Cookie

1.概述

cookie是一种客户端会话技术,cookie由服务端产生,它是服务器存放在浏览器的一小份数据,浏览器以后每次访问该服务器的时候都会将这小份数据携带到服务器去。

服务端创建cookie,将cookie放入响应对象中,服务端容器(如Tomcat)将cookie转化为set-cookie响应头,响应给客户端,客户端在收到cookie的响应头时,在下次请求该服务的资源时,会以cookie请求头的形式携带之前收到的Cookie,由于cookie是存储于客户端的数据(如记录用户名或是保存视频播放进度等),由于这些信息比较容易暴露,一般不存储一些敏感或者影响安全的数据。

2.在Servlet中设置和读取Cookie

设置

@WebServlet("/setCookie")
public class SetCookieServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建一个cookie对象,以键值对的形式存放数据
        Cookie cookie = new Cookie("name", "value");
		//添加该cookie对象
        response.addCookie(cookie);
        response.getWriter().println("Cookie has been set");
    }
}

读取

//直接遍历所有的cookie对象
Cookie[] cookies = request.getCookies();
//注意,若没有cookie对象,不是返回一个长度为0的数组,而是返回null!!!
if (cookies != null) {
    for (Cookie cookie : cookies) {
        //获得key和value
        String name=cookie.getName();
        String value = cookie.getValue();
        System.out.println(name+"="+value);
        return;
    }
}

//根据key获得value
String value=cookie.getAttribute(name);

3.Cookie的时效性

cookie显然是不可能一直存在的,默认情况下Cookie的有效期是一次会话范围内,我们可以通过cookiesetMaxAge()方法让Cookie持久化保存到浏览器上

  • 会话级Cookie
    • 服务器端并没有明确指定Cookie的存在时间
    • 在客户端,Cookie数据存在于内存中
    • 客户端关闭,内存中的Cookie数据就会被释放
  • 持久化Cookie
    • 服务器端明确设置了Cookie的存在时间
    • 在客户端,Cookie数据会被保存到硬盘上
    • Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受客户端关闭的影响
    • 持久化Cookie到达了预设的时间会被释放

注意:setMaxAge(int expiry)参数单位是,表示cookie的持久化时间,如果设置参数为0,表示将客户端中保存的该cookie删除。

4.Cookie的提交路径

访问服务端时不能每次都需要把所有Cookie带上。访问不同的资源时,可以携带不同的cookie,我们可以通过cookie的setPath(String path) 对cookie的路径进行设置(path为客户端访问的url),只有访问该url时才携带该cookie。

三.Session

HttpSession 是 Java Servlet API 中的一个接口,用于在 Web 应用中管理用户会话。它提供了在服务器端存储和检索会话数据的方法。HttpSessionSession 在 Java Servlet 环境中的具体实现。

1. HttpSession概述

HttpSession是一种保留更多信息在服务端的一种技术,服务器会为每一个客户端开辟一块内存空间,即session对象. 客户端在发送请求时,都可以使用自己的session. 这样服务端就可以通过session来记录某个客户端的状态了

服务端在为客户端创建session时,会同时将session对象的id,即JSESSIONIDcookie的形式放入响应对象后端创建完session后,客户端会收到一个特殊的cookie,叫做JSESSIONID,客户端下一次请求时携带JSESSIONID,后端收到后,根据它就能找到对应的session对象.

2. HttpSession的使用

getSession() 方法是 Java Servlet API 中 HttpServletRequest 接口提供的一个方法,用于获取或创建一个 HttpSession 对象

@WebServlet("/createSession")
public class CreateSessionServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取或创建 Session
        HttpSession session = request.getSession();

        // 设置 Session 属性
        session.setAttribute("username", "JohnDoe");

    }
}

getSession()原理

  1. 检查请求中是否携带JSESSIONID
  2. 若携带,则根据JSESSIONID的值去找对应的Session,找到则返回HttpSession对象,找不到则创建新的 HttpSession井将JSESSIONID以cookie的形式放入HttpServletResponse最后返回;
  3. 若未携带,则创建新的 HttpSession井将JSESSIONID以cookie的形式放入HttpServletResponse最后返回。

3 HttpSession时效性

当用户量很大之后,Session对象相应的也要创建很多。如果一味创建不释放,那显然是不可能的。

  • 默认的session最大闲置时间为30分钟,在配置文件中已经定义了
<session-config>
	<session-timeout>30</session-timeout>
</session-config>            
  • 也可以通过HttpSession的API 对最大闲置时间进行设定
// 设置最大闲置时间
session.setMaxInactiveInterval(60);

// 直接让session失效
session.invalidate();

标签:session,--,Session,cookie,Cookie,HttpSession,客户端
From: https://blog.csdn.net/2301_80295548/article/details/143026526

相关文章

  • 学习编程是自学好,还是报班好?看完这篇你就明白了!
    编程已经成为现代社会一项重要的技能,无论是为了提升职业竞争力还是为了满足个人兴趣,越来越多的人想要学习编程。然而,面对学习编程的不同选择,很多人会问:“学习编程是自学好,还是报班好?”这其实是因人而异的,因为每种方式都有各自的优点和不足。本文将详细分析自学和报班两种方式......
  • 知名服务-Samba服务漏东(CVE-2017-7494)
    Samba服务漏动原理说明CVE-2017-7494是一个Samba服务中的严重远程代码执行漏动,影响了Samba3.5.0至4.6.4/4.5.10/4.4.14之间未打补丁的版本。该漏动允许远程公鸡者在受影响的Samba服务器上执行任意代码,只要他们能够向SMB服务写入文件。公鸡者可以通过向Samba服务器上传一个特制的共......
  • Bilidown v1.2.4 B站在线视频下载解析工具中文单文件版
    Bilidown是一款专为B站视频下载而设计的工具,一款简洁好用的B站视频下载工具,支持由UP主上传的单集,多集以及相关封面,弹幕,字幕,音乐,刮削等等,支持任意粒度批量组合,登录后最高支持到1080P,大会员可获取所有画质及音质。Bilidown具有强大的功能和简便的操作界面。Bilidown可以下载B站上......
  • 初学编程应该看书还是看视频?找到最适合你的学习方式
    对于编程初学者来说,选择合适的学习资源是非常重要的。当面临“看书还是看视频”的问题时,很多人都会感到困惑,因为这两种学习方式各有优缺点。无论你是选择书籍还是视频,关键是找到适合自己的学习方式。本文将对这两种学习方法进行详细比较,帮助你做出最适合自己的选择。1.通过......
  • Advanced Renamer v4.05.0 文件批量重命名工具绿色版
    AdvancedRenamer是一款界面简洁友好功能强大的轻量型批量重命名工具,用户无需专业知识就能掌握运用的高级批量修改文件名软件,AdvancedRenamer拥有比较强大的修改文件名功能,能够快速方便地对文件或文件夹进行修改名称,你可以在它的命名方案列表中添加方案,有新名称、新写法、移......
  • 安全测试的漏洞类型
    目录一、安全测试的定义二、安全测试的分类1、静态扫描2、内存扫描3、动态安全测试三、安全测试主要关注哪些方面的漏洞漏洞一:SQL注入漏洞二:XSS 漏洞三:暴力破解漏洞四:文件包含文件上传漏洞漏洞五:越权漏洞漏洞六:信息泄露四、预防XSS预防暴力破解预防文件上传......
  • SpringBoot健康检查机制讲解与实现
    目录前言什么是SpringBoot健康检查如何实现SpringBoot健康检查通过官方模块SpringBootActuator什么是SpringBootActuator快速入门SpringBootActuator引入依赖添加.yml文件配置运行项目访问健康检查地址重要端点解析/health端点注意/loggers端点/info......
  • C++核心编程、面向对象
    目录一、内存分区模型1、运行程序前代码区全局区总结:2、运行程序后栈区堆区 3、new关键字基本使用开辟数组二、引用1、基本使用2、引用的注意事项3、引用做函数参数4、引用做函数返回值5、引用的本质6、常量引用三、函数提高1、函数的默认参数2、函数......
  • 常用Python数据分析开源库:Numpy、Pandas、Matplotlib、Seaborn、Sklearn介绍
    文章目录1.常用Python数据分析开源库介绍1.1Numpy1.2Pandas1.3Matplotlib1.4Seaborn1.5Sklearn1.常用Python数据分析开源库介绍1.1NumpyNumpy(NumericalPython)是Python数据分析必不可少的第三方库,Numpy的出现一定程度上解决了Python运算性能不佳的问题,同......
  • MySql基础:基本查询
    目录1.INSERT(插入)1.1全列插入1.2指定列插入 1.3插入更新  1.4插入替换2.SELECT查询2.1SELECT列2.1.1全列查询2.1.2指定列查询2.1.3查询字段为表达式2.1.4为查询结果指定别名2.1.5查询结果去重 2.2WHERE查询 2.2.1比较运算查询2.2.1.1  >,......