搞了半天的HTTP-ONLY

一、问题

事情是这样的,我在测试服务器cookie时,要将键名为 onlintTag 的 value值 获取出来,一只没办法。 js一只报undefined,如下图

但是 请求头和响应体 都 显示了 cookie中 onlintTag的 value ,如下图

 二、HTTP-ONLY 设置

需要通过js 获取 onlineTag 并 测试 用户身份问题。

以下是 js

<script type="text/javascript">
//获取所有的 cookie
var cookies = document.cookie;// 分割 cookie 字符串并存储在一个对象中
var cookieArray = cookies.split('; ');
var cookieObj = {};
cookieArray.forEach(function(cookie) {var parts = cookie.split('=');cookieObj[parts[0]] = parts[1];
});// 获取特定的 cookie 值
var jsessionId = cookieObj['JSESSIONID'];
var onlineTag = cookieObj['onlineTag'];// 输出到控制台
console.log("JSESSIONID:", jsessionId);
console.log("onlineTag:", onlineTag);
</script>

在添加Cookie时,设置Cookie的HttpOnly属性是确保Cookie只能通过HTTP或HTTPS协议访问,而不能通过JavaScript等客户端脚本访问的一种方法。在大多数编程语言和框架中,都提供了相应的选项或方法来设置Cookie的HttpOnly属性。

JAVA SERVLET代码如下

Cookie cookie = new Cookie("cookieName", "cookieValue");
cookie.setHttpOnly(true);
response.addCookie(cookie);

设置Cookie时,通过相应的方法或选项将HttpOnly属性设置为true或者httponly为true,这样就能确保Cookie在客户端无法通过JavaScript等手段访问。

2.1不能把 JSESSIONID的 httponly 设置为 false

常规的 Java Web 应用程序中,通常不建议将 JSESSIONID 的 HTTP-only 属性设置为 false。这是因为将 JSESSIONID 的 HTTP-only 属性设置为 false 可能会引入安全风险。

JSESSIONID 是用于标识用户会话的重要信息,它是通过 cookie 在客户端和服务器之间传递的。将 JSESSIONID 的 HTTP-only 属性设置为 true 会防止客户端 JavaScript 访问此 cookie,从而降低了跨站脚本攻击(XSS)的风险。

如果将 JSESSIONID 的 HTTP-only 属性设置为 false,客户端 JavaScript 就可以访问此 cookie,这可能会增加您的应用程序受到 XSS 攻击的风险。因此,在大多数情况下,建议保持 JSESSIONID 的 HTTP-only 属性设置为 true。

如果您确实需要在特定情况下允许客户端 JavaScript 访问 JSESSIONID,您可能需要通过其他方式来处理,例如使用特定的 cookie 来处理客户端需要访问的数据,而不是直接使用 JSESSIONID。这样可以在某种程度上降低安全风险。

2.2 JSESSIONID生命周期、作用域

假设你是一个网上购物网站的用户,你打开了浏览器并登录到该网站。当你成功登录后,服务器会向你的浏览器发送一个包含 JSESSIONID 的 Cookie。这个 JSESSIONID 是服务器生成的用于唯一标识你的会话的标识符。

  1. 作用域(Scope): 当服务器发送 JSESSIONID 给客户端时,会将其包含在 Set-Cookie 头部中,并指定了 Cookie 的作用域。通常情况下,JSESSIONID 的作用域是限定在当前域名下的,即只在当前网站的所有页面中有效。这意味着只有在同一个网站内的页面之间共享会话状态,不同网站之间的会话状态是相互隔离的。

  2. 生命周期(Lifecycle): JSESSIONID 的生命周期通常与用户的会话相关联。一旦你关闭了浏览器(或者会话超时),该 JSESSIONID 就会失效。这意味着当你重新打开浏览器并访问该网站时,你将获得一个新的 JSESSIONID,并且需要重新登录。JSESSIONID 的生命周期取决于服务器端的配置,通常在用户一段时间内没有活动时会自动过期,或者通过注销等操作来手动结束会话。

例如,当你在购物网站上添加商品到购物车并登录后,服务器会使用 JSESSIONID 来跟踪你的会话状态。在你浏览其他页面、进行结账操作或者关闭浏览器后,该 JSESSIONID 将被丢弃,因此你的购物车状态不会被保留,除非你再次登录并获得新的 JSESSIONID。

tips:即便不登录,也会有 jsessionid分配

三、URL重写 sessionId 

URL 重写是一种会话跟踪技术,用于在客户端与服务器之间传递会话标识符(通常是一个唯一的标识符),以便在多个页面或请求之间保持用户的会话状态。当服务器不支持 cookie 或者客户端禁用了 cookie 时,URL 重写是一种备选方案。

URL 重写的工作原理是在每个链接或表单提交的 URL 后面添加一个会话标识符参数。例如,如果原始 URL 是 https://example.com/page,那么在进行 URL 重写后,可能会变成 https://example.com/page?sessionID=123456,其中 sessionID 是会话标识符的参数名,123456 是实际的会话标识符值。

<tracking-mode>COOKIE</tracking-mode> 配置是告诉服务器使用 cookie 来进行会话跟踪。这意味着服务器会在客户端的浏览器中设置一个名为 JSESSIONID(或类似的)的 cookie,用于标识用户的会话。当用户发送请求时,浏览器会自动将这个 cookie 包含在请求头中,从而帮助服务器识别用户的会话。

如果禁用 URL 重写,服务器将仅依赖于 cookie 进行会话跟踪。这意味着如果客户端禁用了 cookie,那么会话跟踪可能会失败。因此,一般情况下,会同时使用 cookie 和 URL 重写来确保会话的持久性和可靠性。

3.1正确的配置

<session-config><cookie-config><http-only>false</http-only></cookie-config><!-- 添加下面这行用于禁用URL重写 --><tracking-mode>COOKIE</tracking-mode>
</session-config>

四、cookie 的配置

4.1cookie的setDomain() 作用域和setMaxAge生命周期

4.1.1作用域

大多数Web服务器端编程语言和框架中,都提供了设置Cookie属性的方法。在Java Servlet中,你可以使用HttpServletResponse对象的addCookie()方法来添加Cookie,并使用Cookie对象的setDomain()方法来指定Cookie的作用域。以下是一个示例:

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;// 创建一个新的Cookie对象
Cookie cookie = new Cookie("JSESSIONID", session.getId());// 设置Cookie的作用域为当前域名下的所有子域名
cookie.setDomain(".example.com");// 设置Cookie的路径,通常是根路径
cookie.setPath("/");// 添加Cookie到响应中,使其发送给客户端
response.addCookie(cookie);

当没有域名而只有 IP 地址时,也可以将 IP 地址用作 Cookie 的作用域。你可以使用 IP 地址来指定 Cookie 的作用域,但需要注意以下几点:

  1. IP 地址格式: 在设置 Cookie 的作用域时,IP 地址应该使用完整的 IPv4 或 IPv6 地址格式,例如 192.168.1.12001:0db8:85a3:0000:0000:8a2e:0370:7334

  2. IP 地址稳定性: 如果服务器的 IP 地址是固定的,且不会发生变化,那么可以安全地将 IP 地址用作 Cookie 的作用域。但如果服务器的 IP 地址是动态分配的或会发生变化的,则不建议将 IP 地址用作 Cookie 的作用域,因为一旦 IP 地址发生变化,可能会导致 Cookie 失效或产生不良影响。

  3. IPv4 和 IPv6: 考虑到 IPv4 和 IPv6 地址的差异,需要根据实际情况选择正确的 IP 地址格式。

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;// 创建一个新的 Cookie 对象
Cookie cookie = new Cookie("JSESSIONID", session.getId());// 设置 Cookie 的作用域为当前 IP 地址
cookie.setDomain("192.168.1.1");// 设置 Cookie 的路径,通常是根路径
cookie.setPath("/");// 添加 Cookie 到响应中,使其发送给客户端
response.addCookie(cookie);

以下是使用 IP 地址作为 Cookie 作用域的示例代码:

4.1.2 tomcat 的wabapp多项目和root单项目情况

单项目则直接cookie.setPath("/");

如果Tomcat中包含多个项目,而你设置了Cookie的路径为根路径 /,则这个Cookie将在整个Tomcat服务器上下文中都可见,而不仅仅是在单个项目内。

举例来说,假设你有两个项目:project1 和 project2,它们的URL分别为:

http://localhost:8080/project1
http://localhost:8080/project2


如果在 project1 中设置了路径为根路径 / 的Cookie,那么这个Cookie将对整个Tomcat服务器上下文中的所有项目都可见,包括 project1 和 project2。这意味着,当用户访问 project2 中的页面时,浏览器会将该Cookie一起发送给服务器。

假设你想将Cookie的路径设置为某个项目的根路径,比如 project1,你需要将Cookie的路径设置为 "/project1"

cookie.setPath("/project1"); 通常情况下 多项目部署 采用默认 不 设置 setPath情况 

因此,设置Cookie的路径为根路径 / 可以使得Cookie在Tomcat服务器的所有项目中都可见和共享。

五、总结

false情况

js能够获取onlinetag

true情况

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/834779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

菲菲的作业

一、输出打印姓名、学号&#xff08;以Python为例&#xff09; Python 1name "张三" 2student_id "20200001" 3print("姓名&#xff1a;", name) 4print("学号&#xff1a;", student_id) 二、提取身份证号码中的出生年份和月份&…

代码复现|DataLoader类num_workers参数引发的进程问题

一、问题描述 记录一下&#xff1a;复现&#xff08;Windows平台下&#xff0c;机器学习算法&#xff09;代码过程中遇到的多进程问题&#xff0c;报错截图如下。 根据排查定位到代码出错位置349行。&#xff08;背景介绍&#xff1a;logprog封装了dataloader类&#xff0c;本质…

基于 stable diffusion 制作上世纪90年代的游戏美术风格

1. 项目背景 目前游戏项目中出现美术产能不足的瓶颈&#xff0c;如果使用 midjourney 之类的第三方生成式人工智能产品生成美术素材的话&#xff0c;一方面需要将我们的美术资产投喂给第三方企业进行风格训练&#xff0c;有安全性上的风险&#xff0c;另一方面&#xff0c;第三…

F1C200S 添加韦根驱动笔记(设备树修改)

参考资料&#xff1a;linux开发笔记&#xff08;buildroot 增加自己的开发板支持文件&#xff09;-CSDN博客 首先需要有F1C200S开发板的原理图和buildroot 如果没有可以在我的资源里面下载。 参考上面的文章修改这个目录下的设备树即可。 /home/test/lc/buildroot/board/wi…

Android 开机启动模式源码分析

在机器关机情况下&#xff0c;长按Power键启动机器&#xff0c;如果这时机器低电&#xff0c;会提示低电&#xff0c;机器不会正常启动&#xff1a; 而代码如下&#xff1a; 如果不是低电&#xff0c;正常情况是可以启动的。 在关机情况下&#xff0c;插入USB&#xff0c;机…

【Python深度学习(第二版)(3)】初识神经网络之深度学习hello world

文章目录 一. 训练Keras中的MNIST数据集二. 工作流程1. 构建神经网络2. 准备图像数据3. 训练模型4. 利用模型进行预测5. (新数据上)评估模型精度 本节将首先给出一个神经网络示例&#xff0c;引出如下概念。了解完本节后&#xff0c;可以对神经网络在代码上的实现有一个整体的了…

python数据分析——pandas DataFrame基础知识2

参考资料&#xff1a;活用pandas库 1、分组方式 我们可以把分组计算看作“分割-应用-组合”&#xff08;split-apply-combine&#xff09;的过程。首先把数据分割成若干部分&#xff0c;然后把选择的函数&#xff08;或计算&#xff09;应用于各部分&#xff0c;最后把所有独立…

如何安全高效地进行分公司文件下发?

确保分公司文件下发过程中的保密性和安全性&#xff0c;是企业信息安全管理的重要组成部分。以下是一些关键步骤和最佳实践&#xff1a; 权限管理&#xff1a;确保只有授权的人员可以访问文件。使用权限管理系统来控制谁可以查看、编辑或下载文件。 加密传输&#xff1a;在文…

Linux|进程地址空间

Linux|内存地址空间 现象基本概念理解如何理解地址空间什么是划分区域&#xff1f;地址空间的理解为什么要有地址空间&#xff1f;如何进一步理解页表和写时拷贝如何理解虚拟地址 Linux真正的进程调度方案 现象 #include <stdio.h> #include <string.h> #include …

Go 使用 MongoDB

MongoDB 安装(Docker)安装 MongoDB Go 驱动使用 Go Driver 连接到 MongoDB在 Go 里面使用 BSON 对象CRUD 操作 插入文档更新文档查询文档删除文档 下一步 MongoDB 安装(Docker) 先装个 mongo&#xff0c;为了省事就用 docker 了。 docker 的 daemon.json 加一个国内的源地址…

Milvus基本概念及其应用场景

Milvus是一款云原生向量数据库&#xff0c;具备高可用、高性能、易拓展的特点&#xff0c;主要用于海量向量数据的实时召回。以下是关于Milvus的基本概念解释&#xff1a; 向量数据库&#xff1a;Milvus是一个向量数据库&#xff0c;用于存储、索引和管理通过深度神经网络和机…

用Java爬虫解决问题:探索网络数据的奥秘

网络爬虫是一种用于自动获取互联网信息的程序&#xff0c;常用于搜索引擎、数据挖掘等领域。本文将介绍如何使用Java编写网络爬虫来解决问题&#xff0c;并提供具体的代码实现及测试&#xff0c;帮助读者掌握爬虫技术并应用于实际项目中。 1. 爬虫原理 爬虫通过模拟人类浏览器…

C++容器——set

set容器 是一个关联容器&#xff0c;按一定的顺序存储一组唯一的元素。 set容器中的元素会根据元素的值自动进行排序&#xff0c;并且不允许包含重复的元素&#xff0c;基于二叉树实现的。 特点&#xff1a; 唯一性&#xff1a; set容器中的元素是唯一的&#xff0c;即容器中…

Java 区块链应用 | 割韭菜之假如K线涨跌可随意变动修改的实现

大家好&#xff0c;我是程序员大猩猩。 我一直在想&#xff0c;币圈这个行情时涨时跌&#xff0c;不断的割韭菜&#xff0c;不是由市场决定的&#xff01;而是由交易所直接输入一个数值后点击确定按钮而变化的&#xff0c;那么是不是很恐怖的行为。 为了验证这么一个想法&…

【代码随想录算法训练Day2】LeetCode 977.有序数组的平方、LeetCode 209.长度最小的子数组、LeetCode 59.螺旋矩阵II

Day2 数组、双指针 LeetCode 977.有序数组的平方【排序/双指针】 要将数组的每个元素平方后在按非递减的顺序&#xff0c;最简单的方法就是先将每个数平方&#xff0c;再将结果数组排序。 解法1&#xff1a;排序 class Solution { public:vector<int> sortedSquares(…

Java实现Excel导入和校验

文章目录 效果实现1,添加依赖2,实体类Member.javaMemberVO.java3,校验、监听器ValidationTool.javaExcelReadListener.java4,请求接口参考博文效果 输入:导入测试.xlsx postman调用实例: postman输出结果: 日志输出: 实现 1,添加依赖 easyexcel要去掉poi-ooxm…

maven打包SpringBoot项目报错Perhaps you are running on a JRE rather than a JDK?

maven打包SpringBoot项目报错信息如下 [ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?提示很明显&#xff0c;他需要JDK&#xff0c;你只有JRE 解决方法 通过yum搜索jdk可以看到以下两个应用 $ yum search j…

LabVIEW电机测试系统

LabVIEW电机测试系统 开发了一款基于LabVIEW的有限转角力矩电机测试系统&#xff0c;该系统针对现代高性能驱动系统中的关键组成部分——有限转角力矩电机的测试需求&#xff0c;提供了一种全面的测试解决方案。通过集成化的LabVIEW程序开发和高速数据采集硬件的应用&#xff…

SpringBoot:事务和AOP

事务 一组操作的集合,不可分割的工作单位,会被一起提交或撤销 要么同时成功,要么同时失败 实物操作 begin/start transaction 开启事务 commit 提交事务 rollback 回滚事务 eg:当我们需要保证数据的一致性,例如在删除时,删除了部门,却没有删除部门的员工,就会出现数据的…

开源模型应用落地-模型记忆增强-概念篇(一)

一、前言 语言模型的记忆是基于其训练数据。具体而言,对于较长的文本,模型可能会遗忘较早的信息,因为它的记忆是有限的,并且更容易受到最近出现的内容的影响。模型无法跨越其固定的上下文窗口,而是根据当前上下文生成回应。 提升模型记忆能力有多种方法,比如改进模型的结…