今天又遇到一个URL请求参数的编码问题,排查了差不多半天左右,写出来和大家分享一下:
问题1描述:
项目中用到JSON接口,这个JSON接口接受一个可能带有中文的参数,第一次和前端工程师调试的时候,前端工程师并没有将参数进行escape,这样导致浏览器自己进行了escape,结果firefox和ie下分别用了utf-8编码和gbk编码,但是因为后短应用中的所有编码都是gbk的,这样firefox下发出的请求到后端Java代码中就无法正确编码。
解决方法:
这个问题还是比较容易解决的,只需要前端工程师在拼装请求参数的时候用encodeURIComponent()方法对参数进行escape就可以了。
问题2描述:
但是上面的解决方法只能解决部分的问题,前面注意说到后端的应用都是以GBK来处理中文的,我们在来看一下encodeURIComponent这个的说明:
This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This setting is present for compatibility with Tomcat 4.1.x, where the encoding specified in the contentType, or explicitly set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is false.
从上面的信息了解到这个函数只会以utf-8编码,这样到了后端用GBK编码又是乱码。
解决方法1:
在看Tomcat的源代码中了解到在tomcat/jboss的connecter配置中可以配置一个:useBodyEncodingForURI,来看一下这个参数的说明:
This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This setting is present for compatibility with Tomcat 4.1.x, where the encoding specified in the contentType, or explicitly set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is false.
也就是说:打开这个开关以后,tomcat/jboss就会使用contentType而不是使用URIEncoding对URI请求参数进行编码,contentType可以通过调用Request.setCharacterEncoding来设置。这样你就可以在请求参数里面放一个编码方式,后端读取到以后就可以根据这个编码方式设置contentType,从而让servlet engine对URI请求参数进行正确的编码,但是如果你的servlet engine(比如jetty)并不提供这样的机制,那这个方法也就不奏效了。
解决方法2:
第一个方法事实上让后端应用依赖了servletEngine,第二种方法就是让后端应用框架来做URI请求参数的编码,可以像上面一样,在请求参数里面指定URI请求参数的编码方式,后端读取到这个参数后,由应用框架去根据这个编码方式对URI请求参数进行编码。
原文发表于:http://www.khotyn.com/2011/02/16/yet_another_uri_encoding_problem/
分享到:
相关推荐
Uri库是PHP编程中用于处理统一资源标识符(URI)的一个工具,由The PHP League组织开发。这个库提供了一系列的方法和类,使得开发者能够方便、安全地操作和解析URIs,包括路径、查询字符串、主机名等各个部分。在...
这里的`urlencode`函数是一个假设存在的函数,用于对已编码为UTF-8的字符串进行URL编码,以确保它们能在URL或请求体中安全传输。 总的来说,解决C++使用CHttpConnect类进行HTTP文件上传时的中文参数乱码问题,关键...
GET是HTTP协议中的一个方法,用于请求访问已经被URI(统一资源标识符)识别的资源。在Ajax GET请求中,参数通常会附加到URL后面,形成查询字符串。 中文字符在HTTP传输过程中可能出现乱码的主要原因有两个: 1. URL...
以下是一个简单的示例代码,演示如何在SpringBoot项目中解决乱码问题: @RestController public class HelloController { @GetMapping("/hello") public String hello() { return "Hello, World!"; } } 四、...
针对GET请求中文参数乱码的问题,这里提供一种快速解决方法:使用JavaScript的`encodeURI()`函数进行两次编码。`encodeURI()`函数是JavaScript提供的用于编码URI的函数,它不会对已经编码的字符以及特殊字符如'&'、'...
"乱码问题的解决" 在 Web 开发中,乱码问题是常见的...乱码问题的解决需要从多方面入手,包括设置页面编码、服务器编码、客户端编码、数据库编码和超链接的 url 编码等。只有通过统一编码,才能避免乱码问题的出现。
UriMatcher是一个辅助类,用于匹配不同的Uri模式,常用于ContentProvider中,根据Uri决定执行哪种操作。 9. **动态Uri的生成**: 在运行时,可能会根据用户的选择或程序逻辑生成动态的Uri,例如`Uri.fromParts()`...
在获取请求参数时,我们需要注意参数的类型和编码,避免参数的类型转换错误。 使用lua在Nginx服务器中获取get或post参数提供了很高的灵活性和可扩展性,可以满足各种复杂的请求参数处理需求。 在实际应用中,我们...
charset=utf-8`表示这是一个纯文本Data URI,并且字符编码为UTF-8。 ##### 数据 数据部分包含了实际要传输的信息。对于文本数据,可以直接放置在Data URI中;而对于二进制数据,通常会使用Base64编码来表示。 ###...
3. **拼写和大小写错误**:URL中的每一个字符都很关键,一个小写的字母或一个多余的空格都可能导致问题。检查并确保redirect_uri的完整性和准确性。 4. **多级路由处理**:如果你的应用采用了多级路由,例如在Vue....
当设置为`true`时,jBoss会尝试使用与请求体相同的编码格式来解析URL参数,从而避免了因为编码不一致而引起的乱码问题。 #### 注意事项 - 在进行上述配置时,请确保所使用的字符编码与客户端提交的数据编码保持...
Boost.URL库是C++编程语言中的一个开源工具,专门设计用于处理和操作统一资源标识符(URI)和统一资源定位器(URL)。这个库提供了一套全面且强大的API,允许开发者高效、安全地进行URL解析、构建、修改以及验证等...
这将将请求参数的字符编码从 iso-8859-1 转换为 UTF-8,从而解决中文乱码问题。 解决中文乱码问题的关键是确保字符编码的一致性。无论是在 JSP 文件、Servlet、Struts 2 还是在表单处理中,我们都需要设置正确的...
然而,中文乱码问题一直是困扰开发者的一个常见问题,特别是在处理POST和GET请求时。以下是对标题和描述中涉及知识点的详细解释: 1. **StrutsPrepareAndExecuteFilter**: Struts2框架中的`...
中文乱码解决方案 ...中文乱码问题是一个复杂的问题,需要我们对字符编码的基本概念和原理有所了解。通过统一使用UTF-8编码、设置Tomcat容器的URI编码为UTF-8、使用过滤器等方法,我们可以解决中文乱码问题。
总结来说,解决JSP页面中文乱码问题的关键在于保持字符编码的一致性,从编辑器保存文件的编码、JSP页面的编码声明、Servlet的响应编码、POST请求的参数编码,到服务器处理GET请求的编码,都需要进行适配和统一。...
`encodeURI()`函数会将一个URI字符串中的特殊字符转换为它们的百分号编码表示,但是保留了以下未编码的字符:`@`, `;`, `,`, `/`, `?`, `:`, `&`, `=`, `+`, `$`以及`#`。对于包含中文在内的其他非ASCII字符,`...
1. 打开jQuery源代码,定位到处理Ajax请求的`ajax`函数内部,找到`param`函数,该函数负责处理请求参数。 2. 修改`param`函数内的`encodeURIComponent`调用,使其根据设定的字符集进行URI编码。以下是一个示例代码...
在Java应用开发过程中,字符编码问题一直是困扰开发者的一大难题,尤其是在处理HTTP请求中的中文或特殊字符时,经常会出现乱码现象。本文将详细介绍如何通过修改`server.xml`配置文件来解决Java应用中出现的乱码问题...