这篇文章转载自 : Web容器自己主动对HTTP请求中參数进行URLDecode处理

如题。在Java中或许非常多人都没有注意到当我们发送一个http请求时,假设附带的參数被URLEncode之后,到达web容器之后,开发人员获取到的參数值会自己主动变成了encode之前的值。这是一个非常好的特点,开发人员全然能够忽略http的參数是否须要decode这样的事,可是decode究竟是在什么发生的呢?

第一步就是从request.getParameter()方法下手,可是ServletRequest仅仅是一个接口,是J2EE定义的Servlet框架的一个基本接口,详细实现还是得看详细的Servlet容器。即Web容器。我用的是JBOSS。所以就从JBOSS中源代码着手。

同一时候为了找出当我们调用request.getParameter()时详细是调用哪个ServletRequest对象的方法,使用了反射来查找。代码例如以下:

System.out.println(request.getClass().getName());  

非常easy,通过request的getClass获取对象的详细名称,得到的结果是:org.apache.catalina.connector.RequestFacade。可见是Web容器提供的详细ServletRequest实现类,既然找到了详细的类接下来肯定是去看下API文档,看看有没有提到会对request參数值进行decode操作。顺便说下org.apache.catalina.connector.RequestFacade时Tomcat的API,果然文档并未提到不论什么关于decode的内容,反倒看到RequestFacade仅仅是一个包装器,真正工作的居然另有其人,好吧,仅仅能找到代码了。

找到RequestFacade的源代码,发现真正用于获取request參数的类是RequestFacade的一个受保护的变量request,当然这个类也是实现了ServletRequest接口的。继续查看Request源代码,发现真正干活的类还不是它,Request内部另一个变量org.apache.coyote.Request.coyoteRequest,继续找到org.apache.coyote.Request源代码。找到org.apache.coyote.Request源代码大致就已经能够看出究竟是什么时候进行的decode操作了。在org.apache.coyote.Request的构造器中能够看见:

public Request()
{
this.parameters.setQuery(this.queryMB);
this.parameters.setURLDecoder(this.urlDecoder);
this.parameters.setHeaders(this.headers); this.methodMB.setString("GET");
this.uriMB.setString("/");
this.queryMB.setString("");
this.protoMB.setString("HTTP/1.0");
}

当中一句this.parameters.setURLDecoder(this.urlDecoder);指定了URLDecoder工具类,再来看看parameters能够看到该类就是用来解析http请求參数的类,该类会使用URLDecoder工具类对请求的name以及value进行decode操作。到这里基本就已经看到了HTTP请求中的參数究竟是怎样被自己主动decode的了。

当中并没有去深究代码步骤,毕竟我们仅仅要知道是什么进行的decode就可以。

从上面的整个流程能够看出。对HTTP參数进行自己主动decode是Web容器依赖的,即并不是J2EE标准。所以其它Web容器有可能并未做这样的操作,所以开发人员还是得注意。

Web容器自己主动对HTTP请求中參数进行URLDecode处理的更多相关文章

  1. jQuery.ajax()方法中參数具体解析

    前言 在项目开发中,为了实现异步向服务端发起请求,最常常使用的就是jQuery.ajax方法了.刚開始需求比較简单,调用jQuery.ajax方法时要传的參数也就那几个常见的參数:url/data/d ...

  2. 我的Spring之旅(二):为请求加入參数

    1.前言 在上一篇我的Spring之旅(一)中,我们仅仅是利用不带參数的请求返回一个网页或一段json,在实际的B/S.C/S网络交互中,请求中须要自己定义的參数.本篇将简单地为之前的请求加入參数. ...

  3. Java Web容器的启动与处理请求的过程

    容器启动时的加载顺序 一.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<context-param>结点.二.容创建一个ServletContext(ser ...

  4. AJAX POST请求中參数以form data和request payload形式在servlet中的获取方式

    HTTP请求中,假设是get请求,那么表单參数以name=value&name1=value1的形式附到url的后面,假设是post请求,那么表单參数是在请求体中,也是以name=value& ...

  5. 关于HttpClient模拟浏览器请求的參数乱码问题解决方式

    转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44407297 http://www.llwjy.com/blogdetail/9 ...

  6. C中參数个数可变的函数

    一.什么是可变參数 我们在C语言编程中有时会遇到一些參数个数可变的函数,比如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一 ...

  7. Eclipse创建第一个Servlet(Dynamic Web Project方式)、第一个Web Fragment Project(web容器向jar中寻找class文件)

    创建第一个Servlet(Dynamic Web Project方式) 注意:无论是以注解的方式还是xml的方式配置一个servlet,servlet的url-pattern一定要以一个"/ ...

  8. Shiro简介、入门案例、web容器的集成

    目的: shiro简介 Shiro入门案例 Shiro与web容器的集成 shiro简介(中文官网:https://www.w3cschool.cn/shiro/andc1if0.html) 1.什么 ...

  9. Spring Cloud Gateway 不小心换了个 Web 容器就不能用了,我 TM 人傻了

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...

随机推荐

  1. swift Equatable 的缺省实现

    Starting from Swift 4.1, all you have to is to conform to the Equatable protocol without the need of ...

  2. core下的routelink

    core mvc中 routelink返回和 framework mvc中返回的不一样,core中返回 IHtmlContent, 而 fw 中返回 MvcHtmlString 在写分页方法中用到了r ...

  3. Hibernate5.x版本HQL限定查询 Legacy-style query parameters (`?`) are no longer supported

    在此版本的限定查询和4.0版本的限定查询: 如果查询语句是: String hql = "select u from User u where u.gender = ?"; 会出现 ...

  4. docker guide

    centos docker community version install: yum -y install docker # install docker systemctl start dock ...

  5. spring注解开发-AOP(含原理)

    一:AOP基本使用 AOP指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式: 步骤一:导入aop模块:Spring AOP:(spring-aspects) <depen ...

  6. LInux设备驱动分析—— kmalloc和kzalloc函数

    今晚在研究EVM5728开发板上面Linux系统的IIC设备驱动程序,偶然之间看到驱动程序中有一处使用了kzalloc函数,本人之前都是使用Linux内核提供的kmalloc / kfree函数来给设 ...

  7. phpstudy里升级mysql版本到5.7

    phpstudy里没有地方可以设置mysql数据库,很多人都疑惑在phpstudy里怎么升级mysql数据库版本,本文就教你如何在phpstudy中升级mysql的版本. PhpStudy集成环境中的 ...

  8. MySQL InnoDB配置统计信息

    MySQL InnoDB配置统计信息 1. 配置持久化(Persistent)统计信息参数 1.1 配置自动触发更新统计信息参数 1.2 配置每张表的统计参数 1.3 配置InnoDB优化器统计信息的 ...

  9. 自定义ngCloak

    场景: 一个非常复杂的表单页面,页面有5个标签,第五个标签中又有5个标签,也就是说一共有9个标签,每个标签中都有一个表单,表单之间相互关联.所有表单项(包括复合的),有80多个数据.全部东西写在一个h ...

  10. 在不是modelAttribute的情况下,如何保存页面输入值的方法(多行遍历)

    <c:forEach var="prdRelInfo" items="${goodRelPrdList}" varStatus="s" ...