这篇文章转载自 : 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. 2019_京东JAVA实习生招聘机试第一题

    题意抽象出来就是,求根节点的所有子节点中,以这些子节点为根的子树的最大节点数. 已有向图的方式来保存无向图,所以叶子结点i的eage[i].size()==1. import java.util.Ar ...

  2. ElasticSearch可视化工具 Kibana

    Kibana要和ElasticSearch 版本一致,默认的端口号是:5601

  3. Navicat连不上MySQL的解决办法

    USE mysql; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '{your password}'; ...

  4. NETCORE使用DB First

    1)引用 (1)Install-Package Microsoft.EntityFrameworkCore (2)Install-Package Microsoft.EntityFrameworkCo ...

  5. dockerfile note

    dockerfile note reference summary defination docker can build images automatically by reading the in ...

  6. [LOJ] 分块九题 8

    区间查询数值+整体赋值 维护tag代表整个区间被赋成了tag[i] 用pushdown操作,而不是修改了再check. 不压缩代码了,调起来心累,长点有啥不好. //Stay foolish,stay ...

  7. 如何用纯 CSS 创作一种有削铁如泥感觉的菜单导航特效

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/XqYroe 可交互视频教 ...

  8. 第一章:systemverilog简介

    1.为何要学systemverilog ..... 2.systemverilog起源 ..... 3.systemverilog标准历程 systemverilog3.0 for 综合 system ...

  9. Java:获取文件内容

    文章来源:https://www.cnblogs.com/hello-tl/p/9139353.html import java.io.*; public class FileBasicOperati ...

  10. 杭电 4707 pet(并查集求元素大于k的集合)

    Description One day, Lin Ji wake up in the morning and found that his pethamster escaped. He searche ...