升级到 Tomcat 8 后 Cookie 可能出现的问题

From: http://www.lichenliang.top/tomcat-8-invalid-character-cookie-value.html

问题场景

之前运行在 Tomcat 7 中的 Web 项目,当把 Tomcat 从 7 升级到 8.x 及更高版本后,用户登录失败,后台报异常:

java.lang.IllegalArgumentException: An invalid character [xx] was present in the Cookie valueat org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateCookieValue(Rfc6265CookieProcessor.java:162)at org.apache.tomcat.util.http.Rfc6265CookieProcessor.generateHeader(Rfc6265CookieProcessor.java:111)...

规范变化

Tomcat 8.x( or later)版本进了很多改进,其中的 Cookie 处理也升级到 RFC6265 规范,这可能导致在 Tomcat 8 以前版本中运行无问题的Web项目在 Tomcat 8 中报下面错误:

java.lang.IllegalArgumentException: An invalid character [34] was present in the Cookie value

上面的 [34] 中的 34 是指 ASCII 码(十进制)对应的字符 “(双引号)。那么在不明确知道 RFC6265 规范中 Cookie 值可用的字符时,可能在 Cookie 值使用其他字符也会出现上面的问题。

那么下面就来看看到底哪些字符时不可用的。

查看源码

private void validateCookieValue(String value) {int start = 0;int end = value.length();if (end > 1 && value.charAt(0) == '"' && value.charAt(end - 1) == '"') {start = 1;end--;}char[] chars = value.toCharArray();for (int i = start; i < end; i++) {char c = chars[i];if (c < 0x21 || c == 0x22 || c == 0x2c || c == 0x3b || c == 0x5c || c == 0x7f) {throw new IllegalArgumentException(sm.getString("rfc6265CookieProcessor.invalidCharInValue", Integer.toString(c)));}}
}

Rfc6265CookieProcessor.validateCookieValue 源码地址

通过上面这段源码分析出 RFC6265 规范中 Cookie 值不可用的字符串,见下表:

十进制十六进制缩写/字符解释
340x22双引号
440x2C,逗号
590x3B;分号
920x5C\反斜杠
1270x7fDEL (delete)删除(控制字符)
< 33< 0x21控制字符/通信专用字符/空格

问题原因

Tomcat 8 更换默认的 CookieProcessor 实现为 Rfc6265CookieProcessor ,之前的实现为 LegacyCookieProcessor 。前者是基于 RFC6265 ,而后者基于 RFC6265、RFC2109、RFC2616 。

解决方式

独立的 Tomcat

修改配置文件 context.xml ,指定 CookieProcessor 为 org.apache.tomcat.util.http.LegacyCookieProcessor,具体配置如下:

<Context><CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" />
</Context>

SpringBoot 内嵌 Tomcat 的解决方式

在 springboot 启动类中增加内嵌 Tomcat 的配置 Bean,如下代码:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {public static void main(String[] args) {SpringApplication.run(Application.class, args);}// Tomcat Cookie 处理配置 Bean@Beanpublic WebServerFactoryCustomizer<TomcatServletWebServerFactory> cookieProcessorCustomizer() {return (factory) -> factory.addContextCustomizers((context) -> context.setCookieProcessor(new LegacyCookieProcessor()));}
}

参考资料:

Tomcat 8 CookieProcessor 实现变化
百度百科 ASCII

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

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

相关文章

MySQL 主从同步故障处理-小记

今有运维同学反应&#xff0c;某业务主从复制&#xff08;一主两从&#xff09;延迟较大&#xff1b;MySQL master&#xff1a;5.0.82 Slave&#xff1a;5.0.88首先指出DB的数据量还是几十G的大小&#xff0c;网络没有问题&#xff0c;OS系统负载小&#xff0c;IO没有吃紧&…

学习 Spring Boot:(二十九)Spring Boot Junit 单元测试

From: https://blog.wuwii.com/springboot-test.html 前言 JUnit 是一个回归测试框架&#xff0c;被开发者用于实施对应用程序的单元测试&#xff0c;加快程序编制速度&#xff0c;同时提高编码的质量。 JUnit 测试框架具有以下重要特性&#xff1a; 测试工具测试套件测试运…

程序员容易不能生育?

最近一直看宝贝这部电视剧。里面的孙哲也是写程序的&#xff0c;结果不容易生育。医生从检查结果中就猜出来他是搞IT的。虽然这个只是电视剧中的剧情。但在现实生活中&#xff0c;程序员的身体素质确实不好。我自身就有体会。毕业写了几年程序以后&#xff0c;身体素质直线下降…

Java 中的并发工具类

From: https://blog.wuwii.com/juc-utils.html java.util.concurrent 下提供了一些辅助类来帮助我们在并发编程的设计。 学习了 AQS 后再了解这些工具类&#xff0c;就非常简单了。 jdk 1.8 等待多线程完成的CountDownLatch 在 concurrent 包下面提供了 CountDownLatch 类&…

[转载] 七龙珠第一部——第063话 悟空大反击

转载于:https://www.cnblogs.com/6DAN_HUST/archive/2013/05/28/3102943.html

如何通过Maven的Jetty插件运行Web工程

From: https://blog.wuwii.com/maven-jetty.html Jetty 是一个开源的servlet容器&#xff0c;它为基于Java的web容器&#xff0c;例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的&#xff0c;它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象…

apache php mysql codeigniter smarty 记录方便查询

windows:apache apache:关于apache状态<Location /server-status>SetHandler server-statusOrder deny,allowDeny from allAllow from 127.0.0.1 </Location> restart apache; 2.apache:关闭自动目录列表 #Options Indexes FollowSymLinks#更换为Options -Indexes…

如何通过Maven的Tomcat插件运行Web工程

From: https://blog.wuwii.com/maven-tomcat.html Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。对于一个初学者来说&…

DUMPE2FS(8)

为什么80%的码农都做不了架构师&#xff1f;>>> DUMPE2FS(8) DUMPE2FS(8) NAME dumpe2fs - dump ext2/ext3/ext4 filesystem information SYNOPSIS dumpe2fs [ -bfhixV ] [ -o superblocksuperblock ] [ -o blocksizeblock- size ] …

lombok踩坑与思考

From: https://www.cnblogs.com/wuyuegb2312/p/9750462.html 虽然接触到lombok已经有很长时间&#xff0c;但是大量使用lombok以减少代码编写还是在新团队编写新代码维护老代码中遇到的。 我个人并不主张使用lombok&#xff0c;其带来的代价足以抵消其便利&#xff0c;但是由…

scheme 学习:红黑树

这几天继续学习scheme&#xff0c;scheme中虽然有hashtable但没有类似C中的map,于是把C版本中的红黑树移植到scheme(中间也发现了C版本中的一些问题&#xff0c;暂时懒得调整了^()^) 以作为后序set和表格驱动设计中表格的基础数据结构. 虽说这个红黑树在C版本中是调试好的了&am…

Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出现的问题...

现互联网公司后端架构常用到SpringSpringMVCMyBatis&#xff0c;通过Maven来构建。通过学习&#xff0c;我已经掌握了基本的搭建过程&#xff0c;写下基础文章为而后的深入学习奠定基础。 首先说一下这篇文章的主要内容分为&#xff1a; 1、Maven多模块项目的创建&#xff1b; …

Maven的pom.xml文件结构之Build配置build

From: https://blog.csdn.net/taiyangdao/article/details/52374125 在Maven的pom.xml文件中&#xff0c;Build相关配置包含两个部分&#xff0c;一个是<build>&#xff0c;另一个是<reporting>&#xff0c;这里我们只介绍<build>。 1. 在Maven的pom.xml文件…

FineUI 将不再内置 ExtJS (严格遵守 ExtJS 的开源规则)

从下个版本起&#xff0c;FineUI 将不再内置 ExtJS &#xff0c;不过我会提供说明如何使用 ExtJS&#xff08;并单独提供精简版的 ExtJS 包供论坛用户下载&#xff09;&#xff0c;现有的程序升级到新版本将不受影响&#xff08;只需要将精简版的 extjs 文件夹拷贝到程序根目录…

Maven开发笔记(四)—— Maven中plugins和pluginManagement

From: https://www.jianshu.com/p/49acf1246eff 1.plugins和pluginManagement的区别概述 plugins 和 pluginManagement 的区别&#xff0c;和我们前面研究过的 dependencies 和 dependencyManagement 的区别是非常类似的。plugins 下的 plugin 是真实使用的&#xff0c;而 pl…

Html代码seo优化最佳布局实例讲解

搜索引擎对html代码是非常优化的&#xff0c;所以html的优化是做好推广的第一步。一个符合seo规则的代码大体如下界面所示。 1、<!–木庄网络博客–> 这个东西是些页面注释的&#xff0c;可以在这里加我的“木庄网络博客”&#xff0c;但过多关键字可能被搜索引擎惩罚&a…

基于struts2,hibernate的小javaweb项目

19:47:49 这是截图 闲话不说 就开始了 web-xml&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <web-app version"2.5" xmlns"http://java.sun.com/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-in…

YAML快速入门

From: https://www.jianshu.com/p/97222440cd08 我们学习Java&#xff0c;都是先介绍properties文件&#xff0c;使用properties文件配合Properties对象能够很方便的适用于应用配置上。然后在引入XML的时候&#xff0c;我们介绍properties格式在表现层级关系和结构关系的时候&…

MySql的用户权限

用户管理 MySQL数据库中的表与其他任何关系表没有区别&#xff0c;都可以通过典型的SQL命令修改其结构和数据。可以使用GRANT和REVOKE命令。通过这些命令&#xff0c;可以创建和禁用用户&#xff0c;可以在线授予和撤回用户访问权限。在5.0版本中增加了两个新命令&#xff1a;C…

.yaml 文件格式简介

From: https://www.cnblogs.com/wxmdevelop/p/7341292.html YAML 的意思其实是&#xff1a;"Yet Another Markup Language"&#xff08;仍是一种置标语言&#xff09;的缩写。 功能 YAML的语法和其他高阶语言类似&#xff0c;并且可以简单表达清单、散列表&#x…