禁止 Cookie 使用 Session,采用 URL 重写,具体解决方案

2023-10-27

先叙述一下 session 的实现原理吧!

session 服务器为每个客户端访问开辟的一块内存区域,可以存放一些客户端的一些操作信息

正常情况下在用户通过客户端访问服务器这个过程中 session 一直存活,直到客户端关闭,服务器中的 session 被销毁

非正常情况下,服务器调用 session.invalidate() 方法进行手动销毁

session 依赖于 cookie !!!

没有 cookie 是无法通过 request.getSession() 获取对应的客户端的 session 的

具体实现原理

客户端第一次访问服务器,服务器返回

 在服务器返回的响应头中,可以看到 Set-Cookie 字段,这个字段中,JSESSION=94E09A118319882388C08A27A42696DB

94E09A118319882388C08A27A42696DB 为服务器保存的 session 对应的 ID

当客户端再访问该网站的其他链接 ?

服务器的响应头则不会再有 Set-Cookie 字段了?

但是再看客户端的请求头 ?

 会自动的将 JSESSIONID 这个 Cookie 带上 ?,服务器根据该字段对应的值就可以拿到该客户端保存在服务器的 session 对象

此时可以通过 request.getSession() 获得对应的 session 对象

然而这都是基于客户端没有禁止 Cookie 的情况下,当客户端禁止了 Cookie ,当访问服务器的其他链接,将不会携带 Cookie 了,此时又该怎么办呢?(*^_^*)

解决办法之一:将 jsessionid 这个保存在客户端的值拼接在对应的 url 上,这样服务器可以通过解析 url 将 jsessionid 对应的值取出来,然后通过这个 sessionId 去获取保存在服务器中的 session 实例对象

通过 HttpServletResponse response,response.encodeURL() 方法进行将对应的 jsessionid 拼进去

现在说一下 response.encodeURL() 该函数的作用吧

首先判断客户端是否禁止了 Cookie ,如果没有禁止,则返回 request.getRequestURI() 这个的值不会拼接上 jsessionid

如果判断客户端禁止了 Cookie, 则会在 request.getContextPath()+"/hello/index" 后拼接上 jsessionid=xxx ?

当再访问服务器时,链接上拼上了 jsessionid 值 ?

 

客户端禁止了 Cookie ,所以请求头中 Cookie 值并没有带上 ?

然后就可以通过服务器解析对应的 url 获取 jsessionid 获取对应的 sessionId, 然后根据 sessionId 查询服务器对应的 session 实例对象 ?

 

基本的原理已经讲的差不多了,现在给出一个基于 SpringBoot 的一个解决方案,获取 session 的

MySessionContext 代码

package mr.s.javaee.context;

import javax.servlet.http.HttpSession;
import java.util.HashMap;

public class MySessionContext {

    private static MySessionContext instance;
    private HashMap<String,HttpSession> sessionMap;

    private MySessionContext() {
        sessionMap = new HashMap<String,HttpSession>();
    }

    public static MySessionContext getInstance() {
        if (instance == null) {
            instance = new MySessionContext();
        }
        return instance;
    }

    public synchronized void addSession(HttpSession session) {
        if (session != null) {
            sessionMap.put(session.getId(), session);
        }
    }

    public synchronized void delSession(HttpSession session) {
        if (session != null) {
            sessionMap.remove(session.getId());
        }
    }

    public synchronized HttpSession getSession(String sessionID) {
        if (sessionID == null) {
            return null;
        }
        return sessionMap.get(sessionID);
    }
}

SessionListener 代码

package mr.s.javaee.listener;

import mr.s.javaee.context.MySessionContext;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@WebListener
public class SessionListener implements HttpSessionListener {

    private MySessionContext myc = MySessionContext.getInstance();

    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        HttpSession session = httpSessionEvent.getSession();
        myc.addSession(session);
    }

    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        HttpSession session = httpSessionEvent.getSession();
        myc.delSession(session);
    }
}

最后需要修改一下,启动类!加上 @ServletComponentScan 注解 ?

具体获得 session 的核心代码

String uri = request.getRequestURI();
String sessionId = uri.split("jsessionid=")[1];
System.out.println(sessionId);
MySessionContext myc= MySessionContext.getInstance();
HttpSession session = myc.getSession(sessionId);
String name = session.getAttribute("name").toString();

本篇到此结束了,谢谢浏览

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

禁止 Cookie 使用 Session,采用 URL 重写,具体解决方案 的相关文章

  • 获取被调用的 javascript 文件的查询字符串

    是否可以在调用的 javascript 文件上使用 javascript 获取查询参数 如下所示 in html in file js console log this location query 这是否可能以某种方式实现 或者我必须使用
  • Bash 的源命令无法处理从互联网上卷曲的文件

    我正在尝试使用curl从互联网获取脚本文件 如下所示 source lt curl url echo done 我看到的是 完成 得到了回响before卷曲甚至开始下载文件 这是实际的命令和输出 bash 3 2 source lt cur
  • 未注入带有 JPA2 的 Apache Ignite 2.7 IgniteRepository

    使用在 Web 上建立的 guildes 我使用 Spring Data JPA 2 应用程序制作了简单的 Spring Boot 2 仅在 2 7 版本中才向 Apache Ignite 添加了 Spring Boot JPA 2 支持
  • Flutter Web URL 路由不适用于真实域

    我正在尝试使用一个网址来获取参数并将该参数分配给网络文件内的变量 例如 我的域名是 example com 在这个网站中我需要用户的 ID 我想制作 example com id 123 并获取 123 id 并给出变量 123 值 在 f
  • 为什么 html 页面没有在 thymeleaf 中显示?

    我在用着spring boot和thymeleaf查看引擎 问题是控制器没有显示正确的 html 页面 并且总是显示Whitelabel Error Page 控制器 package com example controller impor
  • 使用 Spring Embedded Kafka 测试 @KafkaListener

    我正在尝试为我正在使用 Spring Boot 2 x 开发的 Kafka 侦听器编写单元测试 作为一个单元测试 我不想启动一个完整的 Kafka 服务器作为 Zookeeper 的实例 所以 我决定使用 Spring Embedded K
  • Jquery Ajax 调用返回 403 状态

    我有一个 jquery Ajax 调用来实现会话的 keepalive 这个 keepAlive 方法将每 20 分钟调用一次 function keepAlive ajax type POST url KeepAliveDummy asp
  • 会话销毁后如何使 viewscoped beans/viewmap 生存(使用客户端保存)?

    我在用着Myfaces 2 2 具有客户端状态保存功能 我看到 ViewScoped beans 和存储在 viewmap 中的数据在用户会话销毁后丢失 我开始知道 不确定这是否正确 这是预期的行为 但是在会话销毁后避免查看过期异常的方法是
  • 如何从图库中检索图像的 Picasa ID/URL

    我有一个活动 从设备的图库中检索图像并将其上传到服务 现在 出于优化目的 我希望避免上传 Picasa 上的图像 而只存储其 ID 或 URL 以供以后检索 所以我的问题是 如何检索该信息 我的意图代码粘贴在下面并检索图像的 URI Int
  • 登录后,Codeigniter 会话数据在其他页面不可用

    因此 我设置了一个登录页面来验证用户的凭据 然后设置 codeigniter 会话数据 email 和 is logged in 以及其他一些项目 登录后第一页 数据即可访问 在该页面之后 我无法再访问会话数据 事实上 如果我尝试重新加载第
  • Apache 重写 - 获取 PHP 中的原始 URL

    我在 nginx 或 Apache 中重写了这个地址 http domain com hello 到像这样的脚本 http domain com test php ref hell 如何在 PHP 中访问这个重写的 URL 因为 如果我使用
  • POST 请求“访问此资源需要完全身份验证”

    是否有人在尝试使用 POST 请求 oauth token 进行身份验证时遇到错误 访问此资源需要完全身份验证 卷曲命令 curl localhost 85 oauth token d grant type password d clien
  • 在 Spring Context 加载实际的 Spring Bean 之前是否模拟了模拟 bean (@MockBean)?

    让我们以下面的例子为例 Autowired MockBean private Foo foobar Spring Context 是否加载类Foo首先 然后应用模拟 或者是 Mockbean以某种方式被检测到 Spring 创建并应用模拟而
  • 如何向 URL 添加查询参数?

    在 Tritium Moovweb SDK 中向 URL 添加查询参数的最佳实践是什么 寻找一些在您不知道 URL 是否包含 的情况下有效的方法 和其他查询参数已经 下面是 Tritium 的一个简短片段 应该可以帮助您完成 Moovweb
  • 使用 Swagger UI 进行基本身份验证

    我正在尝试通过 Swagger UI 开发一个基于 spring boot 的 REST API 服务以及 API 文档 我想通过 swagger UI 启用基本身份验证 以便用户只有在使用 swagger UI 上的 授权 按钮进行身份验
  • 节点遗留 url.parse 已弃用,用什么代替?

    require url parse someurl com page 已被仅弃用 并且我们严格的 linter 对此不满意 我尝试用互联网建议的内容替换我们的代码中的它new URL someurl com page 在大多数情况下都有效
  • Zend 框架会话丢失

    我有一个注册表单 当用户注册时 它会将他重定向到他的页面 在 Firefox 和 Chrome 中一切正常 但在 Internet Explorer 中则正常 看起来保存用户信息后 会话就关闭了 并且不会将用户重定向到他的页面 我该如何解决
  • Tomcat 7 - 在哪里设置“系统属性”?

    自从升级到 Tomcat 7 以来 我的 Web 应用程序出现了问题 我的会话将继续null在我登录并尝试执行任何操作 提交请求 后 我读到设置以下内容可能会有所帮助 org apache tomcat util http ServerCo
  • ExpressJS & Websocket & 会话共享

    我正在尝试制作一个基于 Node js 的聊天应用程序 我想强制 websocket 服务器 ws 库 使用 ExpressJS 会话系统 不幸的是 我被困住了 用于获取会话数据的 MemoryStore 哈希值与 cookie 中的会话
  • 如何访问 Jinja2 模板(应用程序引擎上的 Bottle 框架)中的会话数据?

    我正在运行微框架Bottle http bottle paws de page docs在谷歌应用程序引擎上 我在用着Jinja2 http jinja pocoo org 2 对于我的模板 我正在使用Beaker http pypi py

随机推荐

  • 一文搞懂OC门、OD门及其作用

    我们先给出OC门 OD门的定义 然后从原理出发 介绍OC门 OD门的作用 1 什么是OC门 OD门 OC门 Open Collector Gate 集电极开路门 如图1所示 当N1导通时 输出低电平 当N1截止时 输出高阻态 电路的一种输出
  • 火狐安装网页视频下载插件(Video DownloadHelper)

    Video DownloadHelper是一款以最简单的方式下载网页视频的chrome插件 基本上火狐浏览器能够加载出视频流并正常播放的视频该插件都能够抓取 可以说该插件对于网页视频下载还是十分快捷并且使用场景广泛的 本地安装后的版本 Vi
  • 字节数组的妙用

    在计算机高级语言中 字节属于最小单位 例如在Java中 int占用4个字节 long占用8个字节等 基本上所有基本类型 包括String 都可以转换成字节 那么这到底有何作用 本篇博客主要是记录了我使用字节数组的经验 希望可以给大家提供一些
  • volatile详解(任何人都能懂的那种)

    volatile 看了好多篇博客终于明白这个关键字到底是干嘛的 让我综合所有的博客写一篇大家都能理解它的博客 要点赞呦 volatile是一个类型修饰符 作用是作为指令关键字 一般都是和const对应 确保本条指令不会被编译器的优化而忽略
  • 怎么将将 Python 的安装目录添加到了系统的环境变量路径中

    要在 Windows 系统中将 Python 的安装目录添加到环境变量路径中 请按照以下步骤操作 1 打开 控制面板 2 选择 系统和安全 3 选择 系统 4 在 系统属性 中 选择 高级系统设置 5 在 高级 选项卡中 选择 环境变量 6
  • 【微信小程序】微信小程序支付功能实现

    1 前言 微信小程序支付 开启新一代便捷支付新时代 随着互联网技术的不断发展 微信小程序支付已经成为了人们日常生活中不可或缺的一部分 微信小程序是一种无需下载安装即可使用的应用 用户可以通过微信扫描或搜索关键词来打开并使用 而微信小程序支付
  • javascript面试题--持续更新

    前端HTML篇 前端CSS篇 Vue篇 TypeScript篇 React篇 微信小程序篇 前端面试题汇总大全 含答案超详细 HTML JS CSS汇总篇 持续更新 前端面试题汇总大全二 含答案超详细 Vue TypeScript Reac
  • pytorch量化库使用(2)

    FX Graph Mode量化模式 训练后量化有多种量化类型 仅权重 动态和静态 配置通过qconfig mapping prepare fx函数的参数 完成 FXPTQ API 示例 import torch from torch ao
  • 高可用系统的设计与维护

    author skate time 2011 02 11 高可用系统的设计与维护 对于一个高可用的系统评价 主要体现在架构 功能 性能 安全 维护 兼容性等方面 如何设计维护这样一个高可用系统的 1 一个提供7 24服务的网站架构系统 要避
  • mysql主从 读写_mysql主从-读写分离

    一个完整的MySQL读写分离环境包括以下几个部分 应用程序client database proxy database集群 在本次实战中 应用程序client基于c3p0连接后端的database proxy database proxy负
  • 最新RAD Studio 11.3亚历山大版本上市

    By Marco Cantu February 27 2023 Embarcadero很高兴地宣布RAD Studio 11 Alexandria Release 3的发布 也被称为RAD Studio 11 3 同时发布的还有Delphi
  • k8s集群PHP环境使用

    一 环境介绍 k8s版本 1 15 2 存储 阿里云NAS 测试代码 wordpress 二 下载wordpress和创建好数据库等 1 下载wordpress wget https cn wordpress org latest zh C
  • 异步的AsyncHttpClient使用详解

    背景 前面的一篇文章 同步的HttpClient使用详解 中 提到了服务端通进行网络请求的方式 也讲述了在并发量大的情况下使用HttpClient的连接池来提高性能 此方法虽然很有效果 但是当访问量极大或网络不好的情况下也会出现某些网络请求
  • HyperLPR车牌识别技术算法之车牌粗定位与训练

    关于HyperLPR HyperLPR是一个使用深度学习针对对中文车牌识别的实现 与较为流行的开源的EasyPR相比 它的检测速度和鲁棒性和多场景的适应性都要好于目前开源的EasyPR HyperLPR可以识别多种中文车牌包括白牌 新能源车
  • js分享功能

    需求 页面需要添加分享到 微博 QQ空间 等功能 具体 div class jz blog a class jiathis button qzone QQ空间 a a class jiathis button tsina 新浪微博 a a
  • Cocos Creator性能调优优化集锦

    前言 一 为什么要做性能优化 性能 是一种优秀的能力 唤醒快 运行持久 稳定 这种能力在游戏上能让你的用户感觉很爽 表征表现为加载快 手机不发热 运行流畅 不卡顿 所以 性能优化的终极目标是 让你的用户感觉很爽 当然这种爽你不能以牺牲自己为
  • Docker快速部署Hadoop环境

    Docker安装部署Hadoop环境 通过三个容器来模拟三个节点 最后只保留Master节点实现搭建 安装环境 Ubuntu 22 04 1 LTS 和Docker 23 0 1 安装过程 拉取镜像 docker pull registry
  • 计算机视觉初步认识

    计算机视觉是使用计算机及相关设备对生物视觉的一种模拟 它的主要任务就是通过对采集的图片或视频进行处理以获得相应场景的三维信息 就像人类和许多其他类生物每天所做的那样 从计算机视觉领域可以衍生出大量有用的应用程序 下面是计算机视觉应用程序的一
  • FreeRTOS记录(八、用软件定时器?还是硬件定时器?)

    FreeRTOS软件定时器 相对前面的内容来说 软件定时器还是比较简单的 我们简单测试一下 因为是简单介绍 所以原理和源码的分析不会那么详细 具体可以根据文中API查看源码 使用起来记住创建 启动 回调函数核心步骤即可 增加测试Demo 再
  • 禁止 Cookie 使用 Session,采用 URL 重写,具体解决方案

    先叙述一下 session 的实现原理吧 session 服务器为每个客户端访问开辟的一块内存区域 可以存放一些客户端的一些操作信息 正常情况下在用户通过客户端访问服务器这个过程中 session 一直存活 直到客户端关闭 服务器中的 se