这篇文章转载自 : 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容器有可能并未做这种操作,所以开发者还是得注意。

Web容器自动对HTTP请求中参数进行URLDecode处理相关推荐

  1. OkHttp如何移除User-Agent,Accept-Encoding等框架自动添加的请求头参数

    使用OkHttp网络框架在进行网络请求时会发现,传到后台的请求头中会比我们自己添加的参数多出几个额外参数.查看源码会发现 private Response getResponseWithInterce ...

  2. Servlet生命周期与Web容器架构及处理请求详解

    一.Servlet对象 Servlet对象运行在Servlet容器中,Servlet的生命周期由容器管理(Servlet容器的基本思想是在服务器端使用Java来动态生成网页). (一)Servlet对 ...

  3. 解决Tomcat8及Tomcat7下http的post、get请求中参数中文乱码问题

    文章目录 一.post请求方式 二.get请求方式 一.post请求方式 Tomcat 8 在获取参数之前添加如下代码: @Overrideprotected void doPost(HttpServ ...

  4. 服务器自动post,Go Web服务器自动重定向POST请求

    我已经尝试解决一个奇怪的问题了一段时间了.在浏览了许多棱角分明的代码之后,当我通过Charles将请求记录到服务器时,我注意到了一些奇怪的东西. 当我发布到url时/myurl,请求实际上不会到达我的 ...

  5. j2ee servlet 和 threadlocal ,synchronized 与 web容器

    在传统的Web开发中,我们处理Http请求最常用的方式是通过实现Servlet对象来进行Http请求的响应.Servlet是J2EE的重要标准之一,规定了Java如何响应Http请求的规范.通过Htt ...

  6. Web容器启动Spring

    Web工程启动涉及到的内容: 1.当Tomcat启动的时候,通过BootStrap的main方法启动,加载tomcat包下的类,读取包下的配置文件,读取Web.xml配置文件,创建ServletCon ...

  7. SpringBoot中Web容器配置和调优

    SpringBoot的启动容器主要是Tomcat,Jetty,Undertow三种容器类型,具体的配置类为 org.springframework.boot.autoconfigure.web.Ser ...

  8. gin ajax 获取请求参数,go的gin框架从请求中获取参数的方法

    前言: go语言的gin框架go里面比较好的一个web框架, github的start数超过了18000.可见此框架的可信度 如何获取请求中的参数 假如有这么一个请求: POST   /post/te ...

  9. 在jsp页面如何获取servlet请求中的参数的办法

    在JAVA WEB应用中,如何获取servlet请求中的参数 ,并传递给跳转的JSP页面?例如访问http://localhost:8088/bbs?id=1 当执行这个bbs servlet时,将u ...

最新文章

  1. 配置linux下node节点的ip
  2. 【设计模式】两大策略和六大原则
  3. Java常用API(一)Object
  4. Oracle Unicode转中文(解码)
  5. 机器视觉中的图像采集卡
  6. 【Spleeter】实验记录——音轨分离软件spleeter的安装
  7. 实用:旋转矩阵与方向余弦矩阵(DCM)
  8. 形象易懂的傅里叶变换、短时傅里叶变换和小波变换
  9. QT使用WinApi 报错 LNK2019 无法解析外部符号
  10. 数字化大时代崛起的数据安全能力框架
  11. win7文件共享服务器搭建,Win7下搭建web服务器实现数据共享的简单步骤
  12. python手势识别算法_Hand-gesture-recognition 这是一个用python写的手势识别的算法 - 下载 - 搜珍网...
  13. 2019念念不忘,2020必有回响!!!
  14. 互联网常用术语指标经验总结
  15. 运行lidar_align进行全局优化时出现程序中断问题
  16. 计算机基础知识学习题,超全的计算机基础知识题库【精心整理_完全免费】.pdf...
  17. Matlab编程技巧:文本文件的读写
  18. C# WinForm 界面控件
  19. 微型计算机内储存比外储存,智慧职教: 微型计算机中内储存器比外储存器
  20. 用scrapy写爬虫(一)快速上手

热门文章

  1. [CF1066C]Books Queries
  2. 火狐放不了html5 video MP4格式
  3. ajax和promise的结合使用
  4. 使用atomic一定是线程安全的吗
  5. 手机webapp meta标签 (全屏)
  6. 建立PHP-FPM的Chroot执行环境
  7. [bat] 使用bat文件保证指定程序运行
  8. jQuery MD5加密
  9. iis日志转到sql存储
  10. python学习--第三天 粗略介绍人脸识别