Springboot应用中设置Cookie的SameSite属性

2023-05-16

转载自https://springboot.io/t/topic/2602

一、Cookie除了keyvalue以外有几个属性

  • httpOnly 是否允许js读取cookie
  • secure 是否仅仅在https的链接下,才提交cookie
  • domain cookie提交的域
  • path cookie提交的path
  • maxAge cookie存活时间
  • sameSite 同站策略,枚举值:Strict Lax None

其他的都很熟悉了,最后一个是 Chrome 51 开始,浏览器的 Cookie 新增加了一个 SameSite 属性,用来防止 CSRF 攻击和用户追踪。

关于SameSite的详细解释 可以看 Cookie 的 SameSite 属性 39

在Javaweb应用中 ,设置 Cookie一般都是用 javax.servlet.http.Cookie,但是SameSite属性出来不久,Servlet库还没更新,所以没有设置SameSite的方法.

javax.servlet.http.Cookie 中定义的的属性

可以看到,还没有SameSite的定义

//
// The value of the cookie itself.
//

private String name; // NAME= ... "$Name" style is reserved
private String value; // value of NAME

//
// Attributes encoded in the header's cookie fields.
//

private String comment; // ;Comment=VALUE ... describes cookie's use
// ;Discard ... implied by maxAge < 0
private String domain; // ;Domain=VALUE ... domain that sees cookie
private int maxAge = -1; // ;Max-Age=VALUE ... cookies auto-expire
private String path; // ;Path=VALUE ... URLs that see the cookie
private boolean secure; // ;Secure ... e.g. use SSL
private int version = 0; // ;Version=1 ... means RFC 2109++ style
private boolean isHttpOnly = false;

二、通过 ResponseCookie 给客户端设置Cookie

本质上,Cookie也只是一个header。我们可以不使用Cookie对象,而通过自定义Header的方式来给客户端设置Cookie

ResponseCookie 是Spring定义的一个Cookie构建工具类,极其简单

import java.time.Duration;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseCookie;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping
public class TestController {
	
	@GetMapping("/test")
	public Object test (HttpServletRequest request,
					HttpServletResponse response) throws Exception {
		
		ResponseCookie cookie = ResponseCookie.from("myCookie", "myCookieValue") // key & value
				.httpOnly(true)		// 禁止js读取
				.secure(false)		// 在http下也传输
				.domain("localhost")// 域名
				.path("/")			// path
				.maxAge(Duration.ofHours(1))	// 1个小时候过期
				.sameSite("Lax")	// 大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外
				.build()
				;
		
		// 设置Cookie Header
		response.setHeader(HttpHeaders.SET_COOKIE, cookie.toString());
		
		return "ok";
	}
}

响应给客户端的Cookie

所有属性都响应正确 √

三、HttpSession Cookie 的SameSite属性

HttpSession依赖一个名称叫做JSESSIONID(默认名称)的Cookie。

对于JSESSIONID Cookie 的设置,可以修改如下配置。但是,目前spring也没实现SameSite的配置项。

配置类 : org.springframework.boot.web.servlet.server.Cookie

server.servlet.session.cookie.comment
server.servlet.session.cookie.domain
server.servlet.session.cookie.http-only
server.servlet.session.cookie.max-age
server.servlet.session.cookie.name
server.servlet.session.cookie.path
server.servlet.session.cookie.secure

通过修改容器的配置,对Session Cookie设置SameSite属性

Tomcat

import org.apache.tomcat.util.http.Rfc6265CookieProcessor;
import org.apache.tomcat.util.http.SameSiteCookies;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TomcatConfiguration {

	@Bean
	public TomcatContextCustomizer sameSiteCookiesConfig() {
		return context -> {
			final Rfc6265CookieProcessor cookieProcessor = new Rfc6265CookieProcessor();
			// 设置Cookie的SameSite
			cookieProcessor.setSameSiteCookies(SameSiteCookies.LAX.getValue());
			context.setCookieProcessor(cookieProcessor);
		};
	}
}

四、Spring Session的SameSite属性

通过自定义 CookieSerializer 设置 SameSite属性

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.web.http.CookieSerializer;

import com.video.common.spring.session.DynamicCookieMaxAgeCookieSerializer;

@Configuration
public class SpringSessionConfiguration {
	
	@Bean
	public CookieSerializer cookieSerializer() {
		DynamicCookieMaxAgeCookieSerializer serializer = new DynamicCookieMaxAgeCookieSerializer();
		serializer.setCookieName("JSESSIONID");
		serializer.setDomainName("localhost");
		serializer.setCookiePath("/");
		serializer.setCookieMaxAge(3600);
		serializer.setSameSite("Lax");  // 设置SameSite属性
		serializer.setUseHttpOnlyCookie(true);
		serializer.setUseSecureCookie(false);
		return serializer;
	}
}

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

Springboot应用中设置Cookie的SameSite属性 的相关文章

  • vscode使用git

    1 找到项目路径 打开gitbash输入 git config global user name 34 your name 34 git config global user email 34 your email address 34 2
  • Logback

    logback logback 与 log4f出自同一作者 logback是作者对log4j的升级 它实现了slf4j slf4j是 simple log face for java 的缩写 我们要入门logback 搞懂几个核心类就可了
  • 取消与关闭

    取消与关闭 两方面 1 线程池的关闭 线程池的关闭 线程池给了两个方法 一个是shutdown 一个是shutdownnow 前者会把队里的任务给执行完 xff0c 且拒绝再进来的任务 而后者会将队里没有执行的任务返回 xff0c 且让正在
  • Linux 的文件的基本属性

    Linux 的文件的基本属性 1 两个指令 chown 修该所属用户与组合 chmod 修改用户的权限 首先这两个指令很重要 xff0c 我们以后会经常用到 xff0c 其次 xff0c 这两个指令也引出的两个概念 一个文件一定属于某个用户
  • Linux的用户和用户组

    Linux的用户和用户组 两个文件 我们学习Linux的用户和用户组可以从两个文件开始 1 passwd 如上图 这个配置文件 在 etc passwd路径下 每一行表示一个用户 1 1 每一行的结构 user name x uId gId
  • kalibr安装采坑过程

    前言 有两种方式进行kalibr标定 一种是编译好的kelibr cde xff0c 另一种是源码编译 xff0c 使用rosrun运行 我推荐源码安装方式 一 kalibr cde方式 想使用kalibr cde见如下过程 软件 我使用了
  • Linux 系统目录结构

    Linux 系统目录结构 虽然最近一直在使用docker来部署一些中间件或者服务 xff0c 但是还是会在宿主机中创建一些挂载 xff0c 这就涉及到我们应该把这些挂载文件放在哪里比较合适的问题 现在我们来认识下Linux的系统目录结构 先
  • 克拉拉与太阳

    克拉拉与太阳 当乔西要去读大学 xff0c 最后一次拥抱了克拉拉后离开 xff0c 我他妈真的哭了 克拉拉不应该是只是一个东西 xff0c 不应该被用完后就被抛弃 xff0c 不应该这样的 fuck the world 克拉拉最后独自在堆厂
  • 动物农村 读后感

    pig 在读完1984后 xff0c 我又马不停蹄的翻开了 动物农场 我怀恋苏联 xff0c 我觉得那是一个美丽的梦 xff0c 哪个国家所有的一切都属于人民 我想从这本书里找到红色梦想破碎的答案 农场里的动物在一天受到了老上校的思想启蒙
  • 哈士奇与藤原拓海

    哈士奇与藤原拓海 有的哈士奇是悲伤的 当我看到它的时候 xff0c 它像一摊被雨淋过的泥巴 xff0c 有气无力的趴着 它很瘦弱 xff0c 有几团毛似乎要脱落了 我蹲下来 xff0c 它只撇了我一眼 xff0c 它的眼睛是蓝色的 xff0
  • docker 镜像的复制

    docker 镜像的复制 有时候我们打的镜像需要从一台服务器传到另一台服务器 xff0c 但是奈何公司的服务器是只能连接内网的 这时候我们就需要能对docker的镜像进行复制 粘贴 整体思路就是 先在本地对镜像打包 然后通过ftp工具传到
  • FastDFS 搭建与客户端编写

    FastDFS 搭建与客户端编写 文件服务器 服务器搭建 https github com qbanxiaoli fastdfs 客户端编写 依赖 span class token tag span class token tag span
  • Linux 常用命令

    常用命令 1 yum 1 1 简介 yum 全称 xff08 Yellow dog Updater Modified 他是一个sheel前端软件包管理器 基于RPM包管理 xff0c 能够从指定的服务器自动下载RPM包并且安装 xff0c
  • 面对idea无厘头问题的两板斧

    1 啥都正常但是飘红 今天工程 所有import都飘红 但是 编译和运行都正常 解决 File gt Invalide Cache 2 工程结构不能识别 在idea中工程目录信息是控制在 idea 文件夹下面的 xff0c 有时候我们在一个
  • 开发中遇到的英语单词

    工作英语 metrics 指标resiliency 弹性 exchange 交换机 本来是交换 但是在系统中可以理解为邮局 即接受消息并发送消息的地方fuss 麻烦primitive 原始的 简陋的declarative 声明式的Relay
  • 来简单认识下简单的布隆过滤器

    布隆过滤器 1 简介 布隆过滤器是一种数据结构 主要由 一个 bit数组和一组hash函数组成 1 1优点 占用空间小 xff0c 效率高 1 2缺点 对于判断存在 是一个概率事件 而不是确定事件 2 作用 用来告诉我们 某个量 在一个量很
  • Gazebo 9 参考手册

    Gazebo参考文档 gazebo plugin参数含义
  • 手写一个布隆过滤器

    span class token keyword public span span class token keyword class span span class token class name BloomFilter span sp
  • INVALID TASK ‘.TEST.SKIP=TRUE’: YOU MUST SPECIFY A VALID LIFECYCLE PHASE […]

    问题 当我们在用如下命令行进行编译时 mvn Dmavne test skip span class token operator 61 span ture clean span class token function install s
  • 回到Zookeeper

    回到Zookeeper 1 藕花深处 平时会花时间学习Redis RocketMQ Motan Dubbo xff0c Kafka等中间件 xff0c 它们各有各的概念 xff0c 各有各的用途 我自认为自己在编程学习上并没有什么天分 xf

随机推荐

  • ChatGPT帮我实现LRU

    1 内存受限 不知道从什么时候开始 xff0c 什么东西都有了限制 xff0c 一个咖啡杯只能装下500ml水 xff0c 一块新买的内存也被标好了容量 xff0c 姑娘的心里再装不下另一个人 xff0c 我开始怀疑有什么东西是可以无限的
  • ACK 与外星文明进行交流

    一段故事 在 三体 第三部中 xff0c 蓝色空间号和万有引力号上的船员从三维空间进入四维空间 xff0c 看到了宏伟的四维建筑 xff0c 并与它们进行了交流 让我们来看一段原文 按照计划 xff0c 卓文用中频电波发送了一个问候语 这是
  • 预写日志 做一个靠谱的男人

    书接上回 我们在之前的一篇文章 ACK 与外星文明交流 中针对一个问题 两个节点之间的通信不可靠 提出了ack的解决方案 现在 我们为了消息能原子性和持久性的落盘 也面临一个问题 假如一条要写入磁盘的信息写到一半 xff0c 机器崩溃了怎么
  • 下载任意版本vmware对应的vmware tools

    参考博客 xff1a https baijiahao baidu com s id 61 1636060669707508136 amp wfr 61 spider amp for 61 pc 网址 xff1a http softwareu
  • 荣耀 MagicBook Pro 加装固态硬盘

    电脑于2019年10月1日在华为天猫官方商城抢购 xff0c 6099 机器配置 xff1a 咨询华为商城的客服 xff0c 得到的回复 xff1a 荣耀 MagicBook Pro 最大可以扩展 HDD 2TB xff0c 可以更换 SS
  • linux下usb无线网卡对比

    2021年12月23日 冬月二十 xff0c 天晴 xff0c 微风 一 使用场景 1 xff0c 由于软件开发需要用到linux系统 xff0c 嵌入式设备nvidia xavier没有无线网卡 xff0c 需要自购 2 xff0c 另外
  • 树莓派安装花生壳软件 phddns ,没有显示SN码

    树莓派型号 xff1a Pi4B 2G 树莓派系统版本 xff1a uname a Linux raspberrypi 5 10 103 v7l 43 1529 SMP Tue Mar 8 12 24 00 GMT 2022 armv7l
  • mavros订阅PX4的定高激光以及悬停油门估计数据

    借用已有的Altitude这个话题发布定高数据和基础油门估计 备注 xff1a v 1 11 3之后的PX4固件才加入了基础油门估计 在src modules mavlink mavlink messages cpp的class Mavli
  • E: Could not get lock /var/lib/dpkg/lock

    ubuntu安装软件时 xff0c 经常出现下面错误 xff1a sudo apt get install E Could not get lock var lib dpkg lock open 11 Resource temporaril
  • shell 脚本常用命令,音频提取、格式转换、切割

    实现一下功能 xff1a 1 xff0c mp4 视频文件提取 wav xff0c pcm xff1b 2 xff0c wav 切割为每段30s 的音频 xff1b 3 xff0c wav 切割后的音频转换为 pcm xff0c ffmpe
  • windows7下cmd窗口使用ssh登录服务器(云、本地)

    windows7下cmd窗口使用ssh命令 xff1a xff08 百度经验 xff09 https www baidu com link url 61 ZwN3UgM b6ZG9CHEGvnad7FMmefCQvSbp4QEMjf8DCL
  • wine 安装(ubuntu中安装windows下软件)

    wine xff1a 能够在多种 POSIX compliant 操作系统 xff08 诸如 Linux xff0c Mac OSX 及 BSD 等 xff09 上运行 Windows 应用的兼容层 https baike baidu co
  • 将自己的 ubuntu 系统制作为ISO镜像

    自己的Ubuntu做了很多设置 xff0c 比如各种软件包 xff0c 各种自定义的配置 如果想要在其他电脑上也安装一个一样的系统 xff0c 可以制作ISO镜像 ISO镜像可以用于发布系统 xff0c 也可以用来作为系统备份使用 以下是使
  • matlab:错误使用 fread 文件标识符无效。使用 fopen 生成有效的文件标识符。

    fidin xff1a 1 000000 错误使用 fread 文件标识符无效 使用 fopen 生成有效的文件标识符 出错 convert1 line 12 A 61 fread fidin inf 39 int16 39 以二进制形式读
  • 使用循环语句输出空心金字塔

    n 61 5 选择打印层数 for i 61 1 i lt 61 n i 43 43 for k 61 1 k lt 61 n i k 43 43 打印空格 echo 34 34 for j 61 1 j lt 61 2 i 1 j 43
  • 关于编程语句i++与++i的区别用法

    首先我们定义一个变量i xff0c int i 61 5 xff1b 然后我们做执行printf xff08 d xff0c i 43 43 xff09 xff1b 我们会发现输出结果是5 是为什么呢 xff0c 我们要搞清楚printf
  • eclipse出现&nbsp;Some&nbsp;character…

    原文地址 xff1a eclipse出现 Some characters cannot be mapped using 34 GBK 34 character encoding 错误 作者 xff1a 赫西尼 Window gt Profe
  • php实现二维数组转置

    arr 61 array array 1 2 3 array 4 5 6 for i 61 0 i for j 61 0 j arr1 j i 61 arr i j for k 61 0 k for l 61 0 l echo arr1 k
  • PX4在GAZEBO仿真中加载iris模型问题

    目录 1 PX4启动仿真的launch系列文件1 1 单个launch文件解读1 2 对iris模型添加相机1 3 bashrc环境变量问题 2 一些Bug2 1 我的台式机无法加载模型2 1 1 若使用 96 v1 9 2版本 96 2
  • Springboot应用中设置Cookie的SameSite属性

    转载自https springboot io t topic 2602 一 Cookie除了key和value以外有几个属性 httpOnly 是否允许js读取cookiesecure 是否仅仅在https的链接下 xff0c 才提交coo