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 改了对应得 ...
随机推荐
- Linux-crontab的使用
一.什么是crontab?crontab 是有cron (crond) 这个系统服务来控制的,cron服务是linux的内置服务,类似于window下的计划任务,但它不会开机自动启动 二.如何使用?c ...
- 程序员减少BUG的两个小妙招!
原创:陶朱公Boy(微信公众号ID:taozhugongboy),欢迎分享,转载请保留出处. 点评: 我们说衡量一个程序员水平的高低往往有很多因素,但有一个因素至关重要即代码质量. 如果程序员写的 ...
- 《AI驱动下的开发者新生态》-2024长沙.NET技术社区活动-诚邀大家报名
回顾 2019年初,在.NET中文社区及包括苏州.广州.深圳等地区社区等大力推动.在众多企业的大力支持下,长沙地区的开发者们发起成立了长沙.NET技术社区,并组织了<2019年长沙开发者技术大会 ...
- NC15445 wyh的吃鸡
题目链接 题目 题目描述 最近吃鸡游戏非常火,你们wyh学长也在玩这款游戏,这款游戏有一个非常重要的过程,就是要跑到安全区内,否则就会中毒持续消耗血量,我们这个问题简化如下 假设地图为n*n的一个图, ...
- Ehcache 3.x 笔记
现在Ehcache版本已经到3.10了, 网上查到的大部分还是2.x版本的使用说明, 把基础用法记了一下, 以后有时间再翻译. 基础使用, 创建 CacheManager CacheManager c ...
- BentoML:如何使用 JuiceFS 加速大模型加载
BentoML 是一个开源的大语言模型(LLM) AI 应用的开发框架和部署工具,致力于为开发者提供最简单的构建大语言模型 AI 应用的能力,其开源产品已经支持全球数千家企业和组织的核心 AI 应用. ...
- java使用Timer定时器在指定时间执行程序
下面是一个利用Timer定时器在每天指定时间执行批处理程序的例子. 有关 java.util.Timer 详细知识请参考API. 值得注意的一点是Timer是单线程顺序执行多个任务的. package ...
- Go语言并发编程(2):channel 通道介绍和使用
一.简介 channel 不仅可以用于 goroutine 间进行安全通信,还可以用于同步内存访问. 而且 Go 社区强烈推荐使用 channel 通道实现 goroutine 之间的通信, 不要通过 ...
- MYSQL查询数据表中某个字段包含某个数值
当某个字段中字符串是"1,2,3,4,5,6"或者"123456"查询数据表中某个字段是否包含某个值1:模糊查询 使用like select * ...
- Qt+QtWebApp开发笔记(二):http服务器日志系统介绍、添加日志系统至Demo测试
前言 上一篇使用QtWebApp的基于Qt的轻量级http服务器实现了一个静态网页返回的Demo,网页服务器很重要的就是日志,因为在服务器类上并没有直接返回,所以,本篇先把日志加上. Demo ...