Web容器自己主动对HTTP请求中參数进行URLDecode处理
这篇文章转载自 : 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处理的更多相关文章
- jQuery.ajax()方法中參数具体解析
前言 在项目开发中,为了实现异步向服务端发起请求,最常常使用的就是jQuery.ajax方法了.刚開始需求比較简单,调用jQuery.ajax方法时要传的參数也就那几个常见的參数:url/data/d ...
- 我的Spring之旅(二):为请求加入參数
1.前言 在上一篇我的Spring之旅(一)中,我们仅仅是利用不带參数的请求返回一个网页或一段json,在实际的B/S.C/S网络交互中,请求中须要自己定义的參数.本篇将简单地为之前的请求加入參数. ...
- Java Web容器的启动与处理请求的过程
容器启动时的加载顺序 一.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<context-param>结点.二.容创建一个ServletContext(ser ...
- AJAX POST请求中參数以form data和request payload形式在servlet中的获取方式
HTTP请求中,假设是get请求,那么表单參数以name=value&name1=value1的形式附到url的后面,假设是post请求,那么表单參数是在请求体中,也是以name=value& ...
- 关于HttpClient模拟浏览器请求的參数乱码问题解决方式
转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44407297 http://www.llwjy.com/blogdetail/9 ...
- C中參数个数可变的函数
一.什么是可变參数 我们在C语言编程中有时会遇到一些參数个数可变的函数,比如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一 ...
- Eclipse创建第一个Servlet(Dynamic Web Project方式)、第一个Web Fragment Project(web容器向jar中寻找class文件)
创建第一个Servlet(Dynamic Web Project方式) 注意:无论是以注解的方式还是xml的方式配置一个servlet,servlet的url-pattern一定要以一个"/ ...
- Shiro简介、入门案例、web容器的集成
目的: shiro简介 Shiro入门案例 Shiro与web容器的集成 shiro简介(中文官网:https://www.w3cschool.cn/shiro/andc1if0.html) 1.什么 ...
- Spring Cloud Gateway 不小心换了个 Web 容器就不能用了,我 TM 人傻了
个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...
随机推荐
- 2019_京东JAVA实习生招聘机试第一题
题意抽象出来就是,求根节点的所有子节点中,以这些子节点为根的子树的最大节点数. 已有向图的方式来保存无向图,所以叶子结点i的eage[i].size()==1. import java.util.Ar ...
- ElasticSearch可视化工具 Kibana
Kibana要和ElasticSearch 版本一致,默认的端口号是:5601
- Navicat连不上MySQL的解决办法
USE mysql; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '{your password}'; ...
- NETCORE使用DB First
1)引用 (1)Install-Package Microsoft.EntityFrameworkCore (2)Install-Package Microsoft.EntityFrameworkCo ...
- dockerfile note
dockerfile note reference summary defination docker can build images automatically by reading the in ...
- [LOJ] 分块九题 8
区间查询数值+整体赋值 维护tag代表整个区间被赋成了tag[i] 用pushdown操作,而不是修改了再check. 不压缩代码了,调起来心累,长点有啥不好. //Stay foolish,stay ...
- 如何用纯 CSS 创作一种有削铁如泥感觉的菜单导航特效
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/XqYroe 可交互视频教 ...
- 第一章:systemverilog简介
1.为何要学systemverilog ..... 2.systemverilog起源 ..... 3.systemverilog标准历程 systemverilog3.0 for 综合 system ...
- Java:获取文件内容
文章来源:https://www.cnblogs.com/hello-tl/p/9139353.html import java.io.*; public class FileBasicOperati ...
- 杭电 4707 pet(并查集求元素大于k的集合)
Description One day, Lin Ji wake up in the morning and found that his pethamster escaped. He searche ...