`
khotyn
  • 浏览: 41918 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

又一个URI请求参数编码问题

阅读更多

     今天又遇到一个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/

1
3
分享到:
评论

相关推荐

    C++Http上传文件到web服务器,解决中文参数乱码

    C++Http上传文件到web服务器,解决中文参数乱码问题,微软提供的Chttpconnect 类在请求http头参数是中文时出现乱码

    java-servlet-api.doc

    当客户端发出请求时,Servlet引擎传递给Servlet一个ServletRequest对象和一个ServletResponse对象,这两个对象作为参数传递到service()方法中。 Servlet也可以执行ServletRequest接口和ServletResponse接口。...

    spring-base64-url-decoder:添加 MVC 参数注释和 HandlerMethodArgumentResolver 以启用解码 Base64 编码的 URL 参数

    Spring Base64 URL 解码器 这个库提供了一个注解,并向 MVC 框架添加了一个 。二进制文件Maven 示例: < dependency> < groupId>de.is24.spring</ groupId> < artifactId>base64-url-decoder</ artifactId> ...

    play框架手册

    但是我们可以在一个完全不同的类里定义一些拦截器,然后在任何控制器里使用@With注释来链接他们。 - 42 - Session和Flash作用域 - 42 - 04.模板引擎 - 43 - 模板语法 - 43 - Expressions: ${…} - 44 - Template ...

    超级有影响力霸气的Java面试题大全文档

    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 23、EJB与JAVA BEAN的区别?  Java Bean 是可...

    java 面试题 总结

    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 20、EJB与JAVA BEAN的区别? Java Bean 是可复用...

    jsp内置对象的用法

    config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象) 序号 方 法 说 明 ...

    ssh(structs,spring,hibernate)框架中的上传下载

     第3~9行定义了一个数据源,其实现类是apache的BasicDataSource,第11~25行定义了Hibernate的会话工厂,会话工厂类用Spring提供的LocalSessionFactoryBean维护,它注入了数据源和资源映射文件,此外还通过一些键值...

    gotestwaf:Go Test WAF是一种工具,可针对各种类型的攻击和绕过技术来测试您的WAF检测功能

    这是一个三步的请求生成过程,该过程将有效载荷的数量乘以编码器和占位符。假设您定义了2个有效负载,3个编码器(Base64,JSON和URLencode)和1个占位符(HTTP GET变量)。在这种情况下,该工具将在一个测试用例中...

    frontend-jeopardy-group

    整合Jeopardy和DuckDuckGo的InstantAnswers :warning: 请先阅读此页面底部的提交准则。 阅读要求。 执行GET请求,更改其API URI中的q查询参数... (2分) 推测一下,您的DuckDuckGo请求中至少显示一个有效的“ InstantA

    team-jeopardy-master

    整合Jeopardy和DuckDuckGo的InstantAnswers :warning: 请先阅读此页面底部的提交准则。 阅读要求。 执行GET请求,已更改其API URI中的q查询... (2分) 推测一下,您的DuckDuckGo请求中至少显示一个有效的“ InstantAns

    codebbs:whoami codebbs开放源码的社区代码论坛,技术栈:springboot,mybatis,bootstrap,redis等。。

    编码谈介绍(完善中...) 界面设计模块 使用bootstrap设计简单的响应式页面 下载bootstrap官方资源包 每月项目所需资源 根据官方文档使用相应的组件 登录功能模块 用户点击登录按钮使用github的登录授权,发送请求,...

    HTTP协议详解

    HTTP的一个特点是数据表现形式 是可输入的和可协商性的,这就允许系统能被建立而独立于数据传输。 目录 1 引论 1.1 目的 1.2 要求 1.3 术语 1.4 总体操作 2 符号习惯和一般语法 2.1 扩充的BNF(扩充的 巴科斯-...

    HerosPHP(PHP MVC开发框架) v3.0.1.zip

    HerosPHP是一个免费开源的,快速、优雅的面向对象的 轻量级PHP MVC开发框架。使用她你能够快速的搭建简洁,易于扩展的web应用。 Herosphp特点 1、部署简单,高开发效率并且高性能 2、框架简单实用,傻瓜式开发,...

    Squid中文权威指南

    15.3.1 一个主机,一个主机名 15.3.2 一个主机,多个主机名 15.3.3 多个主机,一个主机名 15.3.4 多个主机,多个主机名 15.4 访问控制 15.5 内容协商 15.6 补充 15.6.1 日志 15.6.2 忽略Reload ...

    C#中在WebClient中使用post发送数据实现方法

    很多时候,我们需要使用C#中....Ctor 包括 一个空构造函数 和一个静态构造函数, 静态构造函数主要为UrlEncode 和UrlEncodeAndWirte 编码提供参照byte[]数据的初始化作用。如下所示: stati WebClient() public WebCl

    ispconfig-json-wrapper:这是 ISPConfig 远程 API 的 JSONJSONP 包装器

    chown ispconfig:ispconfig json.php ISPConfigJsonWrapper.php chmod +x json.php ISPConfigJsonWrapper.php 就是这样用法基本URI http://{ServerIP}:8080/remote/json.phpJSONP 只需添加一个回调查询参数即可触发...

    BufferAPI:缓冲区的C#API

    然后,当浏览器重定向到redirect_uri参数中指定的网页时,您将检索URL中code参数中编码的auth代码。 使用该代码,您应该请求缓冲以指定您的应用程序详细信息和此身份验证代码。 然后,缓冲区将返回一个JSON对象,其...

    新版Android开发教程.rar

    Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。 Beta 版 的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 ...

Global site tag (gtag.js) - Google Analytics