关于ie下href有中文出现RFC 7230 and RFC 3986问题的研究

2023-10-28 03:59

本文主要是介绍关于ie下href有中文出现RFC 7230 and RFC 3986问题的研究,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

记录Java开发中的问题,一起成长!

注意本文只讨论href等在链接中含有中文导致的RFC 7230 and RFC 3986 问题,其他情况导致的不在讨论范围之内,其他情况可能原因及处理方法都有所不同。

问题描述

    在开发的项目中有一个页面,a元素的href中有个参数使用了中文,类似下面代码:
<a href="?kw=敏感词">搜索</a>

在ie浏览器(如ie11)下点击该链接后会报错,而其他浏览器正常:

图片

网上求助

    按照这个错误的关键词在网上搜索资料,可以搜出一些解决方案,如下:
  • 1、更换低版本的Tomcat

    这个方案显然不行,降低版本可能暂时能解决这个问题,但是tomcat为啥升级,当然是进行了一些优化和内部改造,而且还可能存在jdk版本不兼容的问题,所以权衡一下显然降低版本是不合适的。
    
  • 2、修改tomcat配置文件catalina.properties

    在Tomcat的安装目录中,打开conf/catalina.properties,找到末尾的一行。增加两行配置:
    
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

3、修改tomcat的配置文件server.xml 经测试无效,至于为何无效后面说。

增加URIEncoding=“utf-8”

<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URIEncoding="utf-8"/>

经测试无效,原因后面说。

4、根据官方文档上说的修改relaxedPathChars 和relaxedQueryChars 这两个属性

<Connector connectionTimeout="20000" port="6080" protocol="HTTP/1.1" redirectPort="8443" relaxedPathChars="|{}[],%" relaxedQueryChars="|{}[],%"/>

经测试也无效果。

  • 5、使用encodeURIComponent进行转码
<a href="javascript:location.href='${ctxPath}/bbs/index?topic='+encodeURIComponent('${hotTopic}');">${hotTopic}</a> 

经测试,此方法正常。

思考时间

    那么问题来了,为什么ie下不正常,其他浏览器正常,ie下不正常的情况有哪些,经过测试总结如下:
  1. 仅限于ie浏览器(ie7-ie11都有问题,其他版本未测试应该也都有问题)有问题

  2. 如果是form表单中get提交的中文参数值正常

  3. href、src等链接中出现中文值不正常

    然后我们接下来看为什么?可以肯定是浏览器编码的问题。

  • 抓包分析

    使用抓包工具进行抓包分析,可以使用Fiddler或者轻量级的uTools内部插件http(s)抓包。以Fiddler为例:

    页面代码如下:

<form><input name="kw" value="敏感词">
</form>
<a href="?kw=敏感词">搜索</a>

先直接表单提交(因为只有一个input,直接回车就是提交),此时提交页面不会出错,查看抓包的情况:页面上放置一个form(默认即为get方法)里面有中文参数值,写一个a,href内包含中文。

图片

    可以看到参数直接上转换为了URL编码,这样是没有问题的。然后点击a链接,这是就会报错,错误信息同一开始提到的,那么再看此时的抓包情况:可以看到没有转码:

图片

    那么切换到16进制视图(HexView)查看真实的编码:可以看到参数已经变成了乱码显示,找到对应的位置鼠标左键点击一下即可看到对应的16进制编码

图片

查看该编码对应的汉字,我这边使用的是https://www.qqxiuzi.cn/bianma/zifuji.php

图片

可以看到这几个编码对应的正是“敏感词”这三个字的GB2312编码。
切换其他正常的浏览器看这个地方的编码是什么样的。

图片

可以看到是URL编码的,URL编码到tomcat后根据配置转换为中文或者手动转换(与tomcat版本和配置有关,最新版的基本不需要设置可以自动转换),总之使用URL编码是正常的,确定是ie浏览器默认编码的问题。那么解决方案就是转换编码,至于方案2、4是针对具体某个字符的放行,而浏览器传入已经整个成为乱码,没法单独放行某个字符所以无效,方案3之所以无效是因为产生乱码是浏览器传入后服务器之前就是乱码了,后面再修改编码也无效。

至此原因及解决方案都已经弄清楚了,需要注意的一点是传参时不建议用中文,尽量转换为对应的英文或数字,不用中文自然也就没有这样的问题了。

这篇关于关于ie下href有中文出现RFC 7230 and RFC 3986问题的研究的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/290531

相关文章

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明