web基础:会话

article/2025/9/18 3:48:17

一、会话概述

        HttpSession对象可以保存跨同一个客户多个请求的会话状态。即与一个特定客户的整个会话期间,HttpSession会持久存储。对于会话期间客户做的所有请求,从中得到的所有信息,都可以使用HttpSession对象保存。

会话的工作方式:

 此时,假设又有一个客户访问该网站:

        上图展示了会话是如何工作的,但是,有一个问题,Http协议是无状态协议,对容器来说,每个请求都来自于一个新的客户,那么容器是怎么区分不同的客户呢

1.1 会话ID

        为了让容器区分不同的客户,客户需要一个唯一的会话ID

        当容器接收到客户的第一个请求时,容器会生成一个唯一的会话ID,并通过响应将其返回给客户。客户再在之后的每一次请求中,携带该会话ID,容器在拿到ID之后,就会找到相应的会话,并把这个请求与该会话关联。

        容器必须以某种方式将会话ID作为响应的一部分交给客户,而客户发出在请求时,必须把会话ID作为请求的一部分发回最通用的方式是通过cookie来交换会话信息

1.2 会话创建

        除了必须告诉容器想要创建或使用一个会话之外, 容器几乎会做所有工作,如生成会话ID、创建新的cookie对象、把会话ID放到cookie中,把cookie设置为响应的一部分从请求中的cookie得到会话ID、将会话ID与一个现有的会话匹配、将会话与当前请求关联等等

如下在响应中发送一个会话cookie:

HttpSession session = requset.getSession();

如下从请求中得到一个会话cookie

HttpSession session = requset.getSession();

        会发现,得到一个会话ID cookie的方法与发送一个会话ID cookie的方法是一样的。该方法进行如下操作:

         如上所示,getSession()会返回一个会话,无论是否已经有了一个会话。如果想知道该会话是不是新创建的,可以使用HttpSession.isNew()方法。

  HttpSession session = request.getSession();if (session.isNew()){//会话为新建的会话,即直接返回给用户}else{//为用户返回的会话ID,找到与该ID匹配的会话}

        若不想创建会话,而是想要一个已经存在的会话,可以使用以下操作:

//返回一个已有会话,若无与用户匹配的会话,返回null
HttpSession session = request.getSession(false);
if(session == null){//创建新会话session = request.getSession();
}else{//操作
}

1.3 URL重写

        当客户不支持cookie时,可以使用URL重写在客户和容器之间传递会话ID。

  • 在写至响应的HTML中,URL重写会把会话ID添加到其中所有URL的后面,格式:URL+;jsessionid=XXX
  • URL重写中,会话id会作为请求URL的最后“额外”信息返回给容器
  • 若客户不接受cookie,容器会自动地完成URL重写,但必须显示地对所有重写的URL进行编码,其他工作(添加会话id到URL)容器会自动地完成。
  • 对URL进行编码,需要调用response.encodeURL(String);
  • 若想在重定向中使用会话,可以用response.encodeRedirectURL(“/BeerSelect.do”);编码重定位URL;
  • 容器在使用会话时,首先会尝试使用cookie进行会话ID交换,若不支持cookie,再回采用URL重写,此时需要编码所有重写的URL;
  • 不能对静态页面完成URL重写,使用会话必须使用动态页面。

1.4 删除会话

        客户到来,开始一个会话,而客户离开后,或浏览器崩溃后,或完成一次购买交易后等等情况下需要结束会话。Http协议没有提供任何机制让服务器知道客户是不是已经离开,那么容器应该如何安全的撤销一个会话呢

        会话有三种方式可以结束,分别是超时、在会话对象上调用invalidate()方法、应用结束。

  • 超时,以下两种超时方式效果完全一样
    1. 在web.xml中设置会话超时时间。
      <!--设置会话超时-->
      <session-config><session-timeout>15</session-timeout> <!--分钟为单位-->
      </session-config>
    2. 会话对象设置时间,会话时间设为-1后,会话永远不会到期
      session.setMaxInactiveInterval(15*60); //秒数为单位
  • 会话对象调用invalidate()
  • 应用结束(崩溃或取消部署)

二、Cookie

        Cookie不仅可用于在客户端和服务器间传递会话ID还可用于在客户和服务器中传递信息Cookie实际上是客户与服务器之间交换的一小段数据(一个名/值string对)。每一个Cookie都是一个String键值对对象,Cookie对象声明:new Cookie(String, String)

        当客户想要长时间保持信息时(如用户名),客户在第一次请求时,Servlet从请求参数中获取信息,创建Cookie并发送给用户,用户保存在客户端,当用户再次发送请求时,用户会在每一个请求中将Cookie发回给服务端(自动),服务器从Cookie得到信息分清客户。

        当客户会话消失时,会话Cookie就会消失,但可以设置Cookie时间使之在客户端持久存储

2.1 cookie示例 

如下,服务端设置cookie:

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置响应类型response.setContentType("text/html");//得到表单中提交的用户名String username = request.getParameter("username");//建立一个新的Cookie,用来存储用户名Cookie cookie = new Cookie("username",username);//设置Cookie在客户端上的存活时间cookie.setMaxAge(10);//将此Cookie增加为“set-cookie”响应首部response.addCookie(cookie);RequestDispatcher view = request.getRequestDispatcher("cookieresult.jsp");view.forward(request,response);}

如下,服务器获取cookie:

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();Cookie[] cookies = request.getCookies(); //获取客户请求携带的cookieif(cookies!=null){for(int i=0;i<cookies.length;i++){Cookie cookie = cookies[i];if(cookie.getName().equals("wangy")){String userName = cookie.getName();out.println("Hello "+userName);break;}}}}

2.2 会话生命周期事件

事件监听器与监听事件
生命周期

创建会话:容器第一次创建会话,即此时用户未使用该会话访问服务器。

删除会话:容器置会话无效。

HttpSessionListener
HttpSessionEvent
属性

增加属性setAttribute()

删除属性removeAttribute()

替换属性:重新调用setAttribute()

HttpSessionAttributeListener

HttpSessionBindingEvent

迁移

会话钝化:容器在将会话迁移到另一个VM中,要在会话移动之前调用。

会话激活:容器已经将会话迁移到另一个VM,要在应用的其他部分对会话调用getAttribute()之前调用。

HttpSessionActivationListener

HttpSessionEvent

监听示例: 对象实现了HttpSessionBindingListener,会监听自己被绑定或解除绑定事件。

public class Dog implements HttpSessionBindingListener {private String breed;public Dog(String breed){this.breed = breed;}public String getBreed() {return breed;}//监听到绑定会话时@Overridepublic void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {}//监听到解除绑定会话时@Overridepublic void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {}/*** 重写toString方法* @return*/@Overridepublic String toString() {return "Dog{" +"breed='" + breed + '\'' +'}';}
}

三、结束

        本文主要介绍了会话,以及cookie。会话是保存跨同一个客户多个请求的状态,其实现手段是在响应和请求时通过cookie携带会话ID。Cookie实际上是客户与服务器之间交换的一小段数据,其不仅可用于在客户端和服务器间传递会话ID还可用于在客户和服务器中传递信息。
 


http://chatgpt.dhexx.cn/article/0QWMv9D2.shtml

相关文章

会话固定攻击(session fixation attack)及解决办法

1 Cookie 的工作过程 Cookie的传递用到了两个字段: 请求头字段Cookie和响应头字段Set-Cookie。 当用户浏览器第一次访问服务器的时候&#xff0c;服务器肯定是不知道他的身份的。所以&#xff0c;就要创建一个独特的身份识别数据&#xff0c;格式是"keyvalue"&…

2022年会话推荐综述

title: 2022年会话推荐综述 最近对于会话推荐有了新的兴趣 文章题目&#xff1a; A Survey on Session-based Recommender Systems 0. 前言 提供了一个统一的框架来对SBRSs研究进行分类 SBRS的统一问题陈述&#xff0c;其中SBRS建立在正式概念之上&#xff1a;用户、项目、…

会话保持原理

1. 什么是会话保持&#xff1f; 会话保持是负载均衡最常见的问题之一&#xff0c;也是一个相对比较复杂的问题。会话保持有时候又叫做粘滞会话(Sticky Sessions)。会话保持是指在负载均衡器上的一种机制&#xff0c;可以识别客户端与服务器之间交互过程的关连性&#xff0c;在…

linux会话session

linux会话 什么是linux session 我们常见的 Linux session 一般是指 shell session。Shell session 是终端中当前的状态&#xff0c;在终端中只能有一个 session。 当我们打开一个新的终端时&#xff0c;总会创建一个新的 shell session。这表明会话是我们和shell交互的一个过…

会话令牌写入URL

目录 一. 漏洞描述 二. 漏洞修复 一. 漏洞描述 会话令牌即Token&#xff0c;关于Token&#xff0c;传送门-》如何理解Session、Cookie与Token 。 用户在进行get请求将用户的令牌写入url&#xff0c;导致中间人攻击获取令牌进行登陆。如下 二. 漏洞修复 禁止将令牌写入url

PDU会话流程

1.PDU会话的概念 1.1概述 5G系统的一个关键功能&#xff1a;为UE提供一个到达DN的连接会话管理功能&#xff08;SMF&#xff09;职责&#xff1a; 设置UE到DN的连接对该连接的用户面进行管理 5G系统的设计目标是支持大量的5G案例&#xff1a; 支持不同的PDU类型多个可选的…

会话固定漏洞

目录 漏洞原理 漏洞检测 漏洞利用 漏洞修复 漏洞原理 Session 是应用系统对浏览器客户端身份认证的属性标识&#xff0c;在用户退出应用系统时&#xff0c;应将客户端 Session 认证属性标识清空。如果未能清空客户端 Session 标识&#xff0c;在下次登录系统时&#xff0c…

《Oracle Java EE编程自学和面试指南》09-02:HttpSession接口

深入了解IT/互联网行业及岗位&#xff0c;请参阅通用IT/互联网岗位招聘计划&#xff08;最新全岗版&#xff09;。 深入了解职业晋升及学习路线&#xff0c;请参阅最优职业晋升路线和课程学习指南&#xff08;最新全栈版&#xff09;。 内容导航&#xff1a; 前言1、HttpSessi…

【LWIP的mDNS】

一&#xff0e;mdns 1.什么是mdns&#xff1f; mDNS协议适用于局域网内没有DNS服务器时的域名解析&#xff0c;设备通过组播的方式交互DNS记录来完成域名解析&#xff0c;约定的组播地址是&#xff1a;224.0.0.251&#xff0c;端口号是5353 主要用于在同一局域网内&#xff0c;…

DNS DDNS NBNS mDNS LLMNR LLDPDU SSDP协议

DNS DNS只是提供了域名和IP地址之间的静态对应关系&#xff0c;当IP地址发生变化时&#xff0c;DNS无法动态的更新域名和IP地址之间的对应关系&#xff0c;从而导致访问失败。但是DDNS系统是将用户的动态IP地址映射到一个固定的域名解析服务上 DDNS DDNS用来动态更新DNS服务…

mDNSResponder介绍与移植

mDNSResponder是苹果的Bonjour项目的一部分。 Bonjour是法语“你好”的意思。 Bonjour软件源自正IETF零配置网络工作。零配置工作有三个要求&#xff1a; 1.分配IP地址&#xff08;即使没有分配DHCP服务器的IP地址&#xff09; 2.提供名称到地址的转换&#xff08;即使没有DNS服…

启用Ubuntu 服务器上的 mDNS

陈拓 2022/03/18-2022/03/18 在动态分配IP地址的情况下&#xff0c;在局域网中使用mDNS访问Ubuntu服务器就不需要知道IP地址了。 我的Ubuntu系统版本 先用IP地址登录Ubuntu服务器。 具体操作见《Win10命令窗口的SSH和SFTP操作》 Win10命令窗口的SSH和SFTP操作_晨之清风的博…

Bonjour手把手搭建一:mDNS(apple multicastdns.org)

mDNS(Multicast DNS)——From Apple https://support.apple.com/kb/TA20999?localezh_CN&viewlocaleen_US Multicast DNS, one of the features incorporated in Bonjour, which was introduced in Mac OS X 10.2. Bonjour的一个新特性&#xff0c;在Mac OS X10.2后引入…

SpyCast:一款功能强大的跨平台mDNS枚举工具

关于SpyCast SpyCast是一款功能强大的跨平台mDNS枚举工具&#xff0c;该工具支持在主动模式下下递归查询服务&#xff0c;也可以在被动模式下仅侦听多播数据包。因此&#xff0c;广大研究人员可以使用该工具测试mDNS协议和本地网络的安全性。 mDNS介绍 mDNS&#xff0c;即多…

esp-idf编译报错Failed to resolve component ‘mdns‘

Failed to resolve component mdns 根据提示 打开https://components.espressif.com/搜索mdns 选择复制 执行后再次进行编译

OpenWrt 安装 mDNS,并设置 mDNS 映射

OpenWrt 安装 mDNS&#xff0c;并设置 mDNS 映射 路由器&#xff1a;OpenWrt 21.02.1电脑&#xff1a;Windows 10 21H1 Windows 10 现在已经默认支持了 mdns&#xff0c;可以直接 ping 设备名称.local 查看电脑的ip。 1.下载 mDNS 安装包 opkg update opkg install umdns…

ESP mDNS 学习

文章目录 1 概述2 linux avahi3 ESP32 mDNSmDNS 数据包4 参考资料 1 概述 mDNS 是一种多播 UDP 服务&#xff0c;用来提供本地网络服务和主机发现&#xff0c;mDNS 协议发布为 rfc6762。 在没有任何传统单播 DNS 服务器的情况下&#xff0c;多播 DNS (mDNS) 提供了在本地连接…

mDNS/DNS-SD java及Avahi 实现服务发布和服务发现

一、jmDNS&#xff1a;JAVA实现&#xff08;JmDNS&#xff09; 引入pom <!-- https://mvnrepository.com/artifact/javax.jmdns/jmdns --> <dependency><groupId>javax.jmdns</groupId><artifactId>jmdns</artifactId><version>3.4.…

mDNS安装与开启

在局域网建立.local域名 参考来源 1 苹果设备自带 Bonjour无需安装 2 windows需要安装 bonjour 装了也没用 安卓也没找到可用的 目前就苹果和乌班图可互通 3 linux设备 ubuntu 安装avahi sudo apt-get install avahi-daemon sudo apt-get install avahi-uti…

安卓基于MDNS协议的局域网内服务发现

mDNS简介 mdns 即多播(组播)dns&#xff08;Multicast DNS),用于本地局域网服务发现的协议&#xff0c;在Apple 的设备上&#xff08;电脑&#xff0c;笔记本&#xff0c;iphone&#xff0c;ipad等设备&#xff09;都提供了这个服务&#xff08;Bonjour&#xff09;。 mDNS有…