springboot 低于 2.6 版本设置 SameSite=None,springboot 1.x set SameSite=none in embedded tomcat
speingboot 使用自带的 tomcat 运行,设置 SameSite。
springboot 过低的版本没有 SameSite 的属性设置,升级到 1.5.22 版本后,虽然 Rfc6265CookieProcessor 有 setSameSiteCookies 方法,但是方法逻辑有 BUG,当不是 None 时才可以设置成功:
SameSiteCookies sameSiteCookiesValue = this.getSameSiteCookies();
if (!sameSiteCookiesValue.equals(SameSiteCookies.NONE)) {
header.append("; SameSite=");
header.append(sameSiteCookiesValue.getValue());
}
但 SameSite 只是一串文本,因此,根据新版本的 tomcat 改写旧版本的 Rfc6265CookieProcessor 可以实现目的。
在 EmbeddedServletContainerFactory 中设置 TomcatContextCustomizers:
// 从配置文件读取值:custom.session.cookie.same-site=None
@Value("${custom.session.cookie.same-site:}")
private String sameSite;
@Bean
public EmbeddedServletContainerFactory webServerFactory() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); // 设置 tomcat 上下文
factory.setTomcatContextCustomizers(Collections.singletonList(sameSiteCookiesConfig()));
return factory;
} /**
* 自定义 tomcat 上下文,设置 SameSite
*
* @return tomcat 上下文
*/
public TomcatContextCustomizer sameSiteCookiesConfig() {
return context -> {
final Rfc6265CookieProcessor cookieProcessor = new Rfc6265CookieProcessor() {
@Override
public String generateHeader(Cookie cookie) {
String sameSiteAppend = null;
if (StringUtils.hasText(sameSite)) {
sameSiteAppend = "; SameSite=" + SameSiteCookies.fromString(sameSite).getValue();
}
return super.generateHeader(cookie) + sameSiteAppend;
}
};
context.setCookieProcessor(cookieProcessor);
};
} /**
* SameSite 枚举
*/
enum SameSiteCookies {
UNSET("Unset"),
NONE("None"),
LAX("Lax"),
STRICT("Strict");
private final String value;
SameSiteCookies(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
public static SameSiteCookies fromString(String value) {
SameSiteCookies[] values = values();
StringBuilder builder = new StringBuilder("[");
for (SameSiteCookies sameSiteCookies : values) {
if (sameSiteCookies.value.equals(value)) {
return sameSiteCookies;
}
builder.append(sameSiteCookies.getValue()).append(", ");
}
String substring = builder.substring(0, builder.length() - 2) + "]";
throw new IllegalStateException("invalid sameSite cookies: [" + value + "], valid sameSite value is "
+ substring);
}
}
Set-Cookie 似乎仅在首次访问时会响应(有时间去查一下),因此,页面 F12 DEBUG 时需要查看第一个请求才能看到 Set-Cookie 请求头信息。
springboot 低于 2.6 版本设置 SameSite=None,springboot 1.x set SameSite=none in embedded tomcat的更多相关文章
- 【转】Android Studio-1.2版本设置教程
如果重新安装Android Studio的话要重新配置风格选项啥的,这篇是个很好的教程,原文链接:http://blog.csdn.net/skykingf/article/details/45485 ...
- iis7下.Net框架版本设置
转载:http://blog.163.com/fan_yishan/blog/static/47692213201391651229542/ Win7下IIS网站的.Net框架版本设置 步骤/方法 1 ...
- VS2008 如何将Release版本设置可以调试的DEBUG版本
VS2008 如何将Release版本设置可以调试的DEBUG版本 只需设置三个部分: 项目->属性->C/C++->General->Debug Information Fo ...
- C# 当前 .NET SDK 不支持将 .NET Core 2.1 设置为目标。请将 .NET Core 2.0 或更低版本设置为目标,或使用支持 .NET Core 2.1 的 .NET SDK 版本。
报错信息: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 NETSDK1045 当前 .NET SDK 不支持将 .NET Core 2.2 设置为目标.请将 .NET Core 2.1 或 ...
- mysql-5.7免安装版本设置
mysql-5.7.22 免安装版本设置(Windows7) 一.在Mysql官网下载Mysql-5.7.22的ZIP文件 下载链接为:https://dev.mysql.com/downloads ...
- (30)导入时如何定制spring-boot依赖项的版本【转载】【从零开始学Spring Boot】
此文章转载地址:http://www.tuicool.com/articles/RJJvMj3 请注重作者的版权. spring-boot通过maven的依赖管理为我们写好了很多依赖项及其版本,我们可 ...
- Alipay SDK验签PHP低于5.5版本错误
低于PHP5.5版本不支持OPENSSL_ALGO_SHA256函数,要想使用RSA2加密,把OPENSSL_ALGO_SHA256函数替换为:sha256WithRSAEncryption 解密方法 ...
- [Linux] TMUX Python版本设置
TMUX Python版本设置 本地mac的终端已经设置python版本为python3.7, 结果进入tmux时,一直时python2.7. # 本地.bash_profile alias pyth ...
- springboot Elasticsearch 实体创建索引设置Date 类型字段失败
springboot Elasticsearch 实体创建索引设置Date 类型字段失败,需添加以下注解 @Field(type = FieldType.Date, format = DateForm ...
- SpringCloud组件:搭建Eureka服务注册中心,搭建的时候一定要确保springboot和springCloud的版本对应
搭建的时候一定要确保springboot和springCloud的版本对应,不然会报下面的错 查看版本对应得地址:https://start.spring.io/actuator/info 改了对应得 ...
随机推荐
- Python数组合并和数组分割(数组拆分)
数组的合并和拆分 ## 将数组按照固定长度进行拆分,返回一个二维数组 def list_split(source_list, n): return [source_list[i:i+n] for i ...
- Hive数据导入与导出
数据导入 ● 本地文件导入 -- 本地文件导入(local) LOAD DATA local INPATH '/home/hadoop/sourceA.txt' INTO TABLE testA PA ...
- Google全球分布式数据库:Spanner
2012年的OSDI上google发布了Spanner数据库.个人认为Spanner对于版本控制,事务外部一致性的处理,使用TrueTime + Timestamp进行全球备份同步的实现都比较值得一看 ...
- java ArrayList排序不区分大小写
最近在做代码勇士codewars的题目,顺便记录一下自己的解决方案. 1.排序类 1.1 不使用预定义比较器 package com.dylan.practice; import java.util. ...
- Kafka集群搭建与SpringBoot项目集成
本篇文章的目的是帮助Kafka初学者快速搭建一个Kafka集群,以及怎么在SpringBoot项目中使用Kafka. kafka集群环境包地址:https://pan.baidu.com/s/1Mar ...
- Java的SPI机制实践
Java SPI机制概述 先给出结论:"Java的SPI是一种服务发现机制,用于约定接口和动态发现实现类,体现了分层解耦的思想". Java的SPI机制常用于框架扩展或组件替换,最 ...
- RAID 10磁盘阵列实践
RAID概述 RAID技术通过把多个硬盘设备组合成一个容量更大.安全性更好的磁盘阵列,利用分散读写技术来提升磁盘阵列整体的性能,同时把多个重要数据的副本同步到不同的物理硬盘设备上,从而起到了非常好的数 ...
- 常用SQL语句备查
查询表中某一列是否有重复值 SELECT bizType, COUNT(bizType) FROM Res GROUP BY bizType HAVING COUNT(bizType) > 1 ...
- python开发接口时,使用jsonschema模块对数据进行校验
import jsonschema schema = { "type": "object", # 先声明每个键都是对象 "properties&quo ...
- 数据结构(三):舞伴配对问题(C++,队列)
好家伙, 题目如下: 1.舞伴配对问题:假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队.跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴. 2.若两队初始人数不相同,则较长的那一队中未配 ...