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());

很简单,通过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容器有可能并未做这种操作,所以开发者还是得注意。

时间: 2024-10-08 15:43:16

Web容器自动对HTTP请求中参数进行URLDecode处理的相关文章

自动匹配HTTP请求中对应实体参数名的数据(性能不是最优)

/// <summary> /// 获取请求参数字段 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public static T GetRequestParas<T>() { T t = (T)Activator.CreateInstance(typeof(T)); if (HttpContext

解决backbone url请求中参数有中文,存入数据库是乱码

最近项目用到了backbone 做前后端的分离方案,遇见了中文乱码问题,解决方案总结如下: 假设需要存一条课程记录到后台 model定义如下: var AddCourse= Backbone.Model.extend({ url:path+"/course/add", parse : function(response){ return response.data; } }); encodeURIComponent 函数 将中文的内容进行编码 $('#addCourseBtn' ).c

Servlet&amp;JSP学习笔记:什么是Web容器

什么是Web容器 Web容器(Container)是Servlet/JSP唯一认得的 HTTP 服务器 在具体层面,容器说穿了就是一个用 Java 写的程序,运行于 JVM 之上,不同类型的容器会负责不同的工作,若以 Servlet/JSP 运行的 Web 容器(Web Container)来说,也是一个 Java 写的程序. HTTP 那些文字性的通信协议,如何变成 Servlet/JSP中可用的 Java 对象,其实就是容器做的剖析与转换. 在抽象层面,可以将Web容器视为运行 Servle

web过滤器中获取请求的参数(content-type:multipart/form-data)

1.前言: 1.1 在使用springMVC中,需要在过滤器中获取请求中的参数token,根据token判断请求是否合法: 1.2 通过requst.getParameter(key)方法获得参数值; 这种方法有缺陷:它只能获取  POST 提交方式中的Content-Type: application/x-www-form-urlencoded; HttpServletRequest request= (HttpServletRequest) req; String param = reque

Web容器自己主动对HTTP请求中參数进行URLDecode处理

这篇文章转载自 : Web容器自己主动对HTTP请求中參数进行URLDecode处理 如题.在Java中或许非常多人都没有注意到当我们发送一个http请求时,假设附带的參数被URLEncode之后,到达web容器之后,开发人员获取到的參数值会自己主动变成了encode之前的值.这是一个非常好的特点,开发人员全然能够忽略http的參数是否须要decode这样的事,可是decode究竟是在什么发生的呢? 第一步就是从request.getParameter()方法下手,可是ServletReques

如何在集群中获得处理本次请求的web容器的端口号?

系统四台机器,每台机器部署四个Tomcat Web容器.现需要根据端口号随机切换到映射的数据源,若一台机器一个Tomcat则用IP识别,可现在一台机器四个Tomcat,因此还需要获得Web容器的端口号.那么:在Web服务器集群中,一个Spring任务该如何获取Web容器的端口号呢?设置需要的Key,本系统使用Tomcat Web服务器,操作如下.编辑文件${tomact-dir}/bin/catalina.bat,添加以下内容即可: set JAVA_OPTS=-D<key>="&l

(三)Asp.net web api中的坑-【http post请求中的参数】

接上篇, HttpPost 请求 1.post请求,单参数 前端 var url = 'api/EnterOrExit/GetData2'; var para = {}; para["Phone"] = "phone13880825221"; para["UID"] = "uid287572292"; $.post(url, para, function () { }, "application/json"

spring源码研究之IoC容器在web容器中初始化过程

前段时间在公司做了一个项目,项目用了spring框架实现,WEB容器是Tomct 5,虽然说把项目做完了,但是一直对spring的IoC容器在web容器如何启动和起作用的并不清楚.所以就抽时间看一下spring的源代码,借此了解它的原理. 我们知道,对于使用Spring的web应用,无须手动创建Spring容器,而是通过配置文件,声明式的创建Spring容器.因此在Web应用中创建Spring容器有如下两种方式: 1. 直接在web.xml文件中配置创建Spring容器. 2. 利用第三方MVC

web页面中参数的传递方法

在web页面中参数的传递方法多样,主要有以下几种: Viewstate,Querystring,Session, Application,Cookie,Cache. Viewstate: 特点:服务启启动的各种控件的视图状态:包括控件的所有属性值:Enableviewstate可以启用和禁用视图状态:        优点:防止新产生一个页面实例后,丢失前一个页面的状态信息: 例如:在用户登录注册验证过程中,无须使用导致服务器往返行程的代码,我们只需要在客户端进行验证就可以了.另外有些控件的初始化