Tomcat Get请求的巨坑

转载自  Java程序员注意:Tomcat Get请求的巨坑!


Tomcat8.5,当Get请求中包含了未经编码的中文字符时,会报以下错误,请求未到应用程序在Tomcat层就被拦截了。

Tomcat报错:

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

返回400错误:

Transfer-Encoding--->[chunked] 

null--->[HTTP/1.1 400 Bad Request] 

Server--->[Apache-Coyote/1.1] C

onnection--->[close] 

Date--->[Wed, 07 Feb 2018 03:19:04 GMT]

根据错误找到了Tomcat最新的源码:

org/apache/coyote/http11/LocalStrings.properties

iib.invalidRequestTarget=Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

org/apache/coyote/http11/Http11InputBuffer.java

boolean parseRequestLine(boolean keptAlive) throws IOException {...} else if (HttpParser.isNotRequestTarget(chr)) {throw new IllegalArgumentException(sm.getString("iib.invalidRequestTarget"));}...}

java/org/apache/tomcat/util/http/parser/HttpParser.java

public static boolean isNotRequestTarget(int c) {// Fast for valid request target characters, slower for some incorrect// onestry {return IS_NOT_REQUEST_TARGET[c];} catch (ArrayIndexOutOfBoundsException ex) {return true;}
}

查源码发现在Tomcat7.0.73就已经添加了RFC 3986这个规范。

RFC 3986文档对Url的编解码问题做出了详细的建议,指出了哪些字符需要被编码才不会引起Url语义的转变,以及对为什么这些字符需要编码做出了相应的解释。

RFC 3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(! * ' ( ) ; : @ & = + $ , / ? # [ ])。

还有一些字符当直接放在Url中的时候,可能会引起解析程序的歧义,这些字符被视为不安全字符。

  • 空格:Url在传输的过程,或者用户在排版的过程,或者文本处理程序在处理Url的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉。

  • 引号以及<>:引号和尖括号通常用于在普通文本中起到分隔Url的作用

  • #:通常用于表示书签或者锚点

  • %:百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码

  • {}|\^[]`~:某一些网关或者传输代理会篡改这些字符

对于此问题,有以下几种解决方案。

1、切换版本到7.0.73以下,这个不实际。

2、修改Tomcat源码,这个也不实际。

3、前端请求对URL编码。

4、修改Get方法为Post方法。

5、因{}是不安全字符,默认被 tomcat拦截。如果需要在URL中传输json数据,在catalina.properties中添加支持。

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

总结

如果Get请求在合作方,而合作方不愿意修改代码,那1、2种方法可以尝试。如果Get请求在自己,可以尝试3、4种方法。仅需要在URL上传输json数据,使用第5种方法即可。


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

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

相关文章

spring boot actuator 入门荔枝

1.创建maven 项目&#xff0c; 通过 http://start.spring.io/ 构建项目结构 2. 3个核心文件内容 ReadinglistApplicatoin.java package com.tangrong;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplicat…

BigDecimal习题

BigDecimal习题 1.定义一个double类型的数组 double[] array{1.2, 0.6, 0.01, 3.2, 5.56, 7.21}; 2.使用BigDecimal求数组中元素的平均值&#xff0c;保留2位小数(四舍五入) 注意&#xff1a;每一个元素都需要封装为BigDecimal对象&#xff0c;才能进行运算&#xff0c;运算的…

Spring Boot 发布 jar 包转为 war 包秘籍。

转载自 Spring Boot 发布 jar 包转为 war 包秘籍。Spring Boot是支持发布jar包和war的&#xff0c;但它推荐的是使用jar形式发布。使用jar包比较方便&#xff0c;但如果是频繁修改更新的项目&#xff0c;需要打补丁包&#xff0c;那这么大的jar包上传都是问题。所以&#xff0c…

java的几种对象(PO,VO,DAO,BO,POJO)解释

本文转自&#xff1a; http://blog.csdn.net/bzhxuexi/article/details/8227808 Java的几种对象(PO,VO,DAO,BO,POJO)解释 一、PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录&#xff0c;多个记录…

Redis 的 4 大法宝,2018 必学中间件

转载自 Redis 的 4 大法宝&#xff0c;2018 必学中间件&#xff01;Redis是什么&#xff1f;全称&#xff1a;REmote DIctionary ServerRedis是一种key-value形式的NoSQL内存数据库&#xff0c;由ANSI C编写&#xff0c;遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、…

数据交换方法

数据交换方法 一.定义三方变量 【代码实现常用】 int a9; int b10;//定义第三方变量 int tempa; ab; btemp;System.out.println("a"a);//a10 System.out.println("b"b);//b9二.基本位运算&#xff08;^&#xff09; 概念&#xff1a; 参加运算的两个数据…

高级 Java 必须突破的 10 个知识点

转载自 高级 Java 必须突破的 10 个知识点&#xff01; 工作多少年了&#xff0c;还在传统公司写if / for 等简单的代码&#xff1f;那你就真的要被社会淘汰了&#xff0c;工作多年其实你与初级工程师又有多少区别呢&#xff1f;那么作为一个高级Java攻城狮需要突破哪些知识点呢…

java动态代理和cglib动态代理

本文转自&#xff1a; http://blog.csdn.net/leon709/article/details/9529307 动态代理应用广泛&#xff0c;spring&#xff0c;Struts等框架很多功能是通过动态代理&#xff0c;或者进一步封装来实现的。 常见的动态代理模式实现有Java API提供的动态代理和第三方开源类库CG…

排名前 16 的 Java 工具类

转载自 干货&#xff1a;排名前 16 的 Java 工具类&#xff01;在Java中&#xff0c;工具类定义了一组公共方法&#xff0c;这篇文章将介绍Java中使用最频繁及最通用的Java工具类。以下工具类、方法按使用流行度排名&#xff0c;参考数据来源于Github上随机选取的5万个开源项目…

匿名内部类与Lambda表达式习题

匿名内部类与Lambda表达式习题 1.写一个函数式接口 public Operation{ public int calc(int a,int b); } 在测试类中写一个method方法&#xff0c;参数为Operation和a,b public static void method(Operation op) int result op.calc(a,b); System.out.println(result); } 在…

MySQL 调优/优化的 101 个建议!

转载自 MySQL 调优/优化的 101 个建议&#xff01; MySQL是一个强大的开源数据库。随着MySQL上的应用越来越多&#xff0c;MySQL逐渐遇到了瓶颈。这里提供 101 条优化 MySQL 的建议。有些技巧适合特定的安装环境&#xff0c;但是思路是相通的。我已经将它们分成了几类以帮助你理…

CGLIB依赖ASM(关于java字节码框架ASM的学习)

本文转自&#xff1a; http://www.cnblogs.com/liuling/archive/2013/05/25/asm.html 一、什么是ASM ASM是一个java字节码操纵框架&#xff0c;它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件&#xff0c;也可以在类被加载入 Java 虚拟机之前动…

二分查找实现

二分查找实现 1.调用Arrays中的binarySearch方法即可实现 【使用前提&#xff1a;数组必须为升序排列】 public class Demo1 {public static void main(String[] args) {int[] arr {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//查找元素定为4int key 4;int index1 Arrays.binarySea…

Java程序员必须掌握的常用Linux命令

转载自 Java程序员必须掌握的常用Linux命令 Java程序员也是半个运维了&#xff0c;在日常开发中经常会接触到Linux环境操作。小公司的开发人员甚至是兼了全运维的工作&#xff0c;下面整理了一些常用的Linux操作命令。 Linux常用指令 ls   显示文件或目录-l 列…

分类器评价指标

转自&#xff1a;http://www.cnblogs.com/549294286/p/3621740.html&#xff1b; By the way, classic post like 分类指标准确率(Precision)和正确率(Accuracy)的区别 精度和召回率是广泛用于信息检索和统计学分类领域的两个度量值&#xff0c;用来评价结果的质量。其中精度是…

冒泡排序、快排实现

排序实现 1.可调用Arrays.sort方法实现 public class Demo3 {public static void main(String[] args) {int []arr{3,5,2,1,4};Arrays.sort(arr);//可调用Arrays.toString方法打印数组System.out.println(Arrays.toString(arr));} }打印结果&#xff1a; -------------------…

ElasticJob-分布式作业调度神器,你们还在用Quartz吗

转载自 ElasticJob&#xff0d;分布式作业调度神器&#xff0c;你们还在用Quartz吗&#xff1f;&#xff01; 简介 Elastic-Job是一个分布式调度解决方案&#xff0c;由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。 Elastic-Job-Lite定位为轻量级无中心化解…

分类器评估参数——准确度和精度的区别(足球荔枝)

refer to http://www.mathsisfun.com/accuracy-precision.html 准确率accuracy 和 精度precision 的不同&#xff1a; &#xff08;1&#xff09;Accuracy is how close a measured value is to the actual (true) value. 准确率是测量值与实际&#xff08;真&#xff09;值的…

JDK7的日期时间类

JDK7的日期时间类 Date类 1.概念 Date类表示时间&#xff0c;时间可以精确到毫秒。创建一个Date对象&#xff0c;其实就表示时间的对象 2.构造方法和成员方法 public class Demo1 {public static void main(String[] args) {//空参构造(将系统当前时间封装为时间对象[毫秒值…

Java 10的10个新特性,将彻底改变你写代码的方式

转载自 Java 10的10个新特性&#xff0c;将彻底改变你写代码的方式 Java 9才发布几个月&#xff0c;很多玩意都没整明白&#xff0c;现在Java 10又要来了。。 这时候我真尼玛想说&#xff1a;线上用的JDK 7 甚至JDK 6&#xff0c;JDK 8 还没用熟&#xff0c;JDK 9 才发布不久不…