关于The valid characters are defined in RFC 7230 and RFC 3986问题

简介: 建议从目前的角度出发使用第三种方式降低tomcat版本就可以了,如果从长远出发的话,建议遵循RFC 7230 and RFC 3986规范,对于非保留字字符(json格式的请求参数)做转义操作。

关于The valid characters are defined in RFC 7230 and RFC 3986问题


一、背景


最近在某详情页面需要使用到地图相关API,但不能直接写入页面,会和原页面样式冲突,故嵌入了一个单独的html,奈何在IE下(客户多数使用IE)并不是很友好,一直找不到页面。经过各种search(百度,Google,Stack Overflow。。。)找到了问题的根本所在。


二、出现原因

20180806193152804.png

摘自网友:


①  在tomcat 8.0.35之后 ,tomcat对url的参数做了比较规范的限制,必须按照RFC 7230 and RFC 3986规范,对于非保留字字符,如果不做转义处理,一律都会报The valid characters are defined in RFC 7230 and RFC 3986 错误


②  RFC3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。


RFC3986中指定了以下字符为保留字符:


image.png


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


不安全字符有:


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


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


-># 通常用于表示书签或者锚点


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


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


此处就是json格式的参数在地址栏传递过程中转义出了问题,一半地址中传递的参数含有中文也遇到了此异常。可以对字符串进行编码解决此问题。js编码的函数有: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent 。


其中escape()除了 ASCII 字母、数字和特定的符号外,对传进来的字符串全部进行转义编码,因此如果想对URL编码,最好不要使用此方法,而encodeURI()用于编码整个URI,因为URI中的合法字符都不会被编码转换。encodeURIComponent方法在编码单个URIComponent(指请求参数)应当是最常用的,它可以讲参数中的中文、特殊字符进行转义,而不会影响整个URL。


三、解决方案


由于我是将父页面的值传递给子页面,子页面再将父页面路径值按 “&” 符号进行切割,所以我只需要更改拼接符即可(不推荐),但这种并非通用而长久之计,可以有以下几种解决方案:


①   换了个低版本的tomcat


②   遵循7230 and RFC 3986规范,对于非保留字字符做转义操作


③   使用保留字字符


④   将json数据进行urlencode编码


建议从目前的角度出发使用第三种方式降低tomcat版本就可以了,如果从长远出发的话,建议遵循RFC 7230 and RFC 3986规范,对于非保留字字符(json格式的请求参数)做转义操作。

目录
相关文章
|
Java API 语音技术
MRCP(Media Resource Control Protocol)
MRCP(Media Resource Control Protocol)是一种音视频资源控制协议,用于控制语音识别、语音合成和语音交互等场景中的音视频资源。阿里云语音交互服务(ASR、TTS、Chatbot)支持MRCP协议,您可以使用MRCP协议来控制音视频资源,并实现语音交互的功能。
4429 1
|
JSON fastjson Java
FastJson 完全学习指南(初学者从零入门)
摘要:本文是FastJson的入门学习指南,主要内容包括: JSON基础:介绍JSON格式特点、键值对规则、数组和对象格式,以及嵌套结构的访问方式。FastJson是阿里巴巴开源的高性能JSON解析库,具有速度快、功能全、使用简单等优势,并介绍如何引入依赖,如何替换Springboot默认的JackJson。 核心API: 序列化:将Java对象转换为JSON字符串,演示对象、List和Map的序列化方法; 反序列化:将JSON字符串转回Java对象,展示基本对象转换方法;
4075 77
|
应用服务中间件
Tomcat请求特殊字符参数问题:Invalid character found in the request target. The valid characters are defined in
Tomcat请求特殊字符参数问题:Invalid character found in the request target. The valid characters are defined in
1971 0
Tomcat请求特殊字符参数问题:Invalid character found in the request target. The valid characters are defined in
|
12月前
|
运维 安全 Linux
Linux网络telnet命令详解(小白也能轻松掌握的远程连接与端口测试指南)
本文介绍Linux中telnet命令的使用方法,重点讲解如何通过telnet测试网络端口连通性。尽管telnet因明文传输已不推荐用于远程登录,但在排查服务状态、验证端口开放等方面仍具实用价值。教程涵盖安装、基本语法、实战示例及安全建议,适合初学者快速掌握这一轻量级网络调试工具。
|
人工智能 Java 程序员
Java程序员在AI时代必会的技术:Spring AI
在AI时代,Java程序员需掌握Spring AI技术以提升竞争力。Spring AI是Spring框架在AI领域的延伸,支持自然语言处理、机器学习集成与自动化决策等场景。它简化开发流程,无缝集成Spring生态,并提供对多种AI服务(如OpenAI、阿里云通义千问)的支持。本文介绍Spring AI核心概念、应用场景及开发步骤,含代码示例,助你快速入门并构建智能化应用,把握AI时代的机遇。
3004 61
|
关系型数据库 MySQL
MySQL数据表添加字段(三种方式)
本文解析了数据表的基本概念及字段添加方法。在数据表中,字段是纵向列结构,记录为横向行数据。MySQL通过`ALTER TABLE`指令支持三种字段添加方式:1) 末尾追加字段,直接使用`ADD`语句;2) 首列插入字段,通过`FIRST`关键字实现;3) 指定位置插入字段,利用`AFTER`指定目标字段。文内结合`student`表实例详细演示了每种方法的操作步骤与结构验证,便于理解与实践。
|
Java Maven Spring
【异常解决】java: 无法访问org.springframework.boot.SpringApplication的解决方案
【异常解决】java: 无法访问org.springframework.boot.SpringApplication的解决方案
5369 0
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
本文介绍了Spring Boot中静态资源的访问位置、如何进行静态资源访问测试、自定义静态资源路径和静态资源请求映射,以及如何处理自定义静态资源映射对index页面访问的影响。提供了两种解决方案:取消自定义静态资源映射或编写Controller来截获index.html的请求并重定向。
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
|
存储 Java Apache
Java“NoClassDefFoundError”解决
“Java NoClassDefFoundError”是运行时错误,表示JVM找不到某个类的定义。通常由类路径设置不当、依赖缺失或版本冲突引起。解决方法包括检查类路径、确保所有依赖正确添加及版本兼容。
2866 3
|
数据采集 前端开发 Java
@ControllerAdvice:你可以没用过,但是不能不了解
`@ControllerAdvice` 是 Spring MVC 中用于定义全局行为的注解,如异常处理、数据绑定和预处理。它从 `@Component` 派生,确保被扫描并纳入容器。`@ExceptionHandler` 用于全局异常处理,提供统一的错误响应。例如,当处理不当的异常时,它能返回友好的错误信息。`@InitBinder` 在数据绑定前对参数进行处理,如格式转换。`@ModelAttribute` 可以用于全局绑定模型属性,如登录用户信息。Spring MVC 通过 `DispatcherServlet` 和 `HandlerAdapter` 在请求处理流程中应用这些全局配置。
1427 3
@ControllerAdvice:你可以没用过,但是不能不了解