`
sailor90
  • 浏览: 10408 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Servlet Specification V2.4——SRV.4 The Request

阅读更多

SRV.4 The Request

        Request对象压缩了来自客户端request的所有信息。根据HTTP协议,这些信息存放在HTTP header和request的message body中,从客户端传送至服务器。

 

 

SRV.4.1 HTTP Protocol Parameters

        作为request的一部分,servlet的request参数是client发送给servlet container的字符串。当request是一个HttpServletRequest对象,并且满足SRV4.1.1 When Parameters Are Available的条件,container会从URI查询字符串和POST-ed数据中取得参数。
        参数以name-value键值对的形式被存储。任何给定的参数名都可以被赋予多个参数值。下面是 ServletRequest接口用来存取参数的方法:

  • getParameter
  • getParameterNames
  • getParameterValues
  • getParameterMap

        getParameterValues方法返回了一个包含了与指定参数名称绑定的所有参数值String对象数组。getParameter方法的返回值一定是getParameterValues方法返回的String对象数组中的第一个String。getParameterMap方法返回了以java.util.Map表示的request中的所有参数,其中key为参数名称,map value是参数值。
        来自查询字符串的数据和post body都存放在request的参数集合中。查询字符串出现在post body之前。例如,一个request的query string为a=hello,post body里有a=goodbye&a=world,那么结果参数集合就会以a=(hello, goodbye, world)的顺序呈现。
        作为GET request的一部分(由HTTP1.1定义),路径参数并不被这些API暴露。他们必须通过getRequestURI方法或getPathInfo方法返回的String values被分析。

 

SRV.4.1.1 When Parameters Are Available

以下条件是在post form数据在被移至参数集合之前必须满足的条件:

  1. request是HTTP/HTTPS request
  2. HTTP method是POST。
  3. content type是application/x-www-form-urlencoded。
  4. servlet已经对request对象中所有getParameter可以得到的参数做了初始化调用。

        如果条件不满足并且post form数据并没有包含在参数集合中,对于servlet来说,post数据仍然是可用的,可以通过request对象的输入流获得(the post data must still be available to the servlet via the request object's input stream)。当条件满足,post form数据将不能再从request对象的输入流中直接读取。

 

 

SRV.4.2 Atributes

        attribute是绑定在request上的一些对象。Attribute可以由container set到request中,用来表达不能通过API表达的信息;或者由servlet set到request中,用来和其他servlet通讯(通过RequestDispatcher)。Attribute可以通过ServletRequest接口的以下方法来存取:

  • getAttribute
  • getAttributeNames
  • setAttribute

        attribute的value和name是一一对应的。
        根据规范的定义,前缀为{[java.], [javax.]}的attribute是被本规范保留的。同样的,前缀为{[sun.], [com.sun.]}的attribute被sun公司保留。关于所有放到attribute集合中的attribute的命名,一般建议与Java Programming Language Specification关于package命名建议保持一致,也就是域名反序排列。

 

 

SRV.4.3 Header

Servlet可以通过HttpServletRequest接口的以下方法存取HTTP request的header信息:

  • getHeader
  • getHeaders
  • getHeaderNames

        getHeader方法返回以入参为名称的header。多个header可以有同样的名字,例如,Cache-Control headers,在HTTP request中。如果多个header拥有相同的名字,getHeader方法返回request中第一个header。getHeaders方法允许存取以入参为header name的所有的header值,返回一个String对象的枚举类型。
        Headers可以包含int或者Date类型数据的String表达。以下是HttpServletRequest接口中可以以某种格式存取header数据的便捷方法:

  • getIntHeader
  • getDateHeader

        如果getIntHeader方法不能把header中的值转换成int类型的数据,就会抛出NumberFormatException。如果getDateHeader方法不能把header转换成Date类型的数据,就会抛出IllegalArgumentException。

 

 

 

SRV4.4 Request Path Elements

        引导servlet处理request的request路径由很多重要的部分组成。下面的元素通过request对象获取request URI路径再被解析而得到:

  • Context Path:context path前缀与当前servlet所属的servlet context相关。如果这个context是位于web server的URL name space的根节点的“默认”context,那这个path就是一个空字符串。否则,如果context部位於server的URL name space根节点,那context path就是以字符'/'开始,以字符'/'结束但包括'/'的一段字符。
  • Servlet Path:servlet path是直接激活request与servlet的映射的部分。以字符'/'开始,除了在request匹配'/*'模式的情况下。在这种情况下,它是个空字符串。
  • PathInfo:这部分的request path既不是context path,也不是servlet path。它要么在没有额外的path时为空,要么就是以'/'开头的字符串。

        以下为HttpServletRequest的一些方法,用来存取这些信息:

  • getContextPath
  • getServletPath
  • getPathInfo

        重点需要注意的是,除了URL编码不同于request URI和路径部分,以下的方程式为恒等式:requestURI =  contextPath + servletPath + pathInfo

        以下是一些例子,用来阐明以上的要点:见图SRV.4.4 - 01.png,SRV.4.4 - 02.png

 

 

SRV.4.5 Path Translation Methods

        开发者可以地通过API中的两个便捷方法来获得等价于特定路径的文件系统路径(obtain the file system path equivalent to a particular path)。这些方法是:

  • ServletContext.getRealPath
  • HttpServletRequest.getPathTranslated

        getRealPath方法以一个String为参数,返回一个代表了本地文件系统上的文件的String表达形式,一个符合文件位置的路径。getPathTranslated方法计算了request的pathInfo的真实路径。
        在servlet container不能为这些方法找到一个和法文件路径的情况下,比如web应用程序从一个存档文件中被执行,在本地无发存取的远程文件系统上,或者在数据库中,这些方法会返回null。

 

 

SRV.4.6 Cookies

        HttpServletRequest接口提供了getCookies方法来获得request中现存的cookie数组。这些cookie是每一次客户端发起请求时client发起送至server的的数据。一般来说,作为cookie的一部分client返回的唯一信息就是cookie的name和value。其他在cookie被发送至浏览器是可以被set的cookie属性,比如注释,并不是典型的返回信息。

 

 

SRV.4.7 SSL Attributes

        如果request通过安全协议传送,就像HTTPS,这个信息必须通过ServletRequest接口的isSecure方法被呈现。Web container一定会呈现以下的attribute给servlet程序员:见图SRV.4.7 - 01.png。

        如果有一个SSL证书与request相关联,它一定会被servlet container作为java.security.cert.X509Certificate类型的对象数组展示给servlet开发者,并且通过ServletRequest的attribute javax.servlet.request.X509Certificate被访问。
        数组定义的书序是配用来验证的列表(The order of this array is defined as being in ascending order of trust)。数组中的第一个证书是被客户端set的,接下来的一个用来验证第一个证书,这样一直往后排。

 

 

SRV.4.8 Internationalization

        如果愿意,客户端可以选择以它喜欢的语言获得从web服务器返回的response。服务器可以使用Accept_Language header从客户端获得这些信息并进行通讯,通过使用HTTP/1.1规范中描述的其他机制。(This information can be communicated from the client using the Accept-Language header along with other mechanisms described in the HTTP/1.1 specification)。ServletRequest接口提供了一下方法来决定request的语言偏好(the preferred locale):

  • getLocal
  • getLocales

        getLocal方法会返回客户端设置的response content的语言偏好(the preferred locale)。参见RFC 2616(HTTP/1.1)的14.4节以获取更多关于Accept-Language header如何必须解析来决定客户端的语言偏好(how the Accept-Language header must interpreted to determine the preferred language of the client)。
        getLocales方法会返回一个语言偏好对象的枚举,以客户端选择的语言偏好开始降序排列,这些偏好是客户端可以接受的(return an Enumeration of Locale objects indicating, in decreasing order starting with the preferred locale, the locales that are acceptable to the client)。
        如果客户端没有选择语言偏好,那getLocale方法返回的语言偏好就会为servlet container的默认偏好,而getLocales方法返回的枚举类型必须只包含一个元素,就是默认偏好。

 

 

SRV4.9 Request data encoding

        目前,很多浏览器发送字符不用content-type header限定编码,而把字符编码的决定权公开给HTTP request读取。如果没有被client request设定的话,Container用来创建request reader和解析POST数据的默认request编码是“ISO-8859-1”。如果client发送字符编码失败,getCharacterEncoding方法会返回null。
        如果client没有设定字符编码并且request数据被编码为与以上提及的默认编码不一致的编码,就会发生错误。为了解决这种情况,ServletRequest接口中加入了一个新的方法setCharacterEncoding(String enc)。开发者可以通过调用这个方法override container支持的字符编码。setCharacterEncoding方法会在从request中传送任何post数据和读取任何输入之前被调用。如果数据在方法调用前被读取,则不会对字符编码产生影响。

 

 

SRV4.10 Lifetime of the Request Object

        每个request对象都只在对应的servlet的service方法的范围内有效,或者在filter的doFilter方法的范围内有效。为了避免request对象创建的性能开销过大,container一般会回收request对象。开发者必须清楚的是,在以上描述的范围之外维护request对象的引用是不被推荐的,因为这有可能引起不可预知的结果。

  • 大小: 32.2 KB
  • 大小: 43.9 KB
  • 大小: 25.5 KB
1
0
分享到:
评论

相关推荐

    Python双语言混合开发 中go语言版 mxshop_goods-srv.sql

    Python双语言混合开发 中go语言版 mxshop_goods-srv.sql

    VSuite.Ramdisk.Srv.Setup 永久试用XX版

    首先很高兴VSuite.Ramdisk.Srv.Setup.4.6.7531.1240总算win 64位系统上实现永久使用了,虽然离完美破解还是很遥远,但是值得庆贺,特此说明: 1、64位系统较32位难破解原因主要在于数字签名上,由于rxvstor.sys是...

    srv蓝屏解决补丁

    标题中的“srv蓝屏解决补丁”指的是针对服务器运行过程中出现的蓝屏问题,特别是由于srv.sys驱动程序导致的问题,而提供的一种修复解决方案。在Windows操作系统中,srv.sys是服务子系统的主要驱动程序,它负责处理...

    Java™ Servlet 规范.

    目录 前言 ............................... 3 其他资料 ....................................................................................................................Request .............................

    Primo.Ramdisk.Srv.Mui.Setup.5.6.0

    Primo Ramdisk(VSuite Ramdisk II) 内存虚拟硬盘软件 使用内存模拟出超快速的硬盘,突破系统IO瓶颈,飞速提升计算机性能 Primo Ramdisk软件的主要功能是通过独特的软件算法将物理内存模拟成一个超快速的硬盘,在这个...

    Primo.Ramdisk.Srv.Mui.5.6.

    安装Primo Ramdisk Srv Mui 5.6.0的过程相对简单,用户只需运行"Primo.Ramdisk.Srv.Mui.Setup.5.6.0.exe"这个安装文件,按照向导指示操作即可。值得注意的是,为了激活软件,可能需要使用到"PrDSrv56crk.reg"这个...

    VSuite.Ramdisk.Srv.Setup.4.6.7531.1240 win 64 永久试用XX版

    VSuite.Ramdisk.Srv.Setup.4.6.7531.1240是一款专为Windows 64位操作系统设计的内存虚拟磁盘软件。该版本为永久试用的XX版,允许用户在一定时间内无限制地体验其功能。Ramdisk技术是一种将计算机的RAM(随机存取内存...

    PrimoCache.Srv.Mui.Setup.3.0.2.rar PrimoCache server 3.02 服务器版,中文版,64位

    PrimoCache 是一款可以将物理内存、SSD 硬盘或闪存盘等虚拟成硬盘缓存的软件,它可以自动将硬盘中读取的数据存入物理内存等速度较快的设备,当系统再次需要该数据时它可以很快从缓存设备中读取,而无需再次访问速度...

    VSuite.Ramdisk.Srv.Setup.zip 服务器版

    VSuite.Ramdisk.Srv.Setup.zip VSuite+Ramdisk+.Crack.By.XLTH.rar 包含配置文件

    VSuite.Ramdisk.Srv.Setup.4.6.7531.1240服务器版

    VSuite.Ramdisk.Srv.Setup.4.6.7531.1240是一款专为服务器设计的内存虚拟硬盘软件,它充分利用了服务器内存的高速性来创建临时的虚拟硬盘,以此提升数据的读写速度并减轻对物理硬盘的磨损。这款工具的核心理念在于将...

    srv.exe 空连接接开telnet

    嘿嘿。ipc入侵里开telnet需要用的srv 个人收集来的。。奉上

    srv.cpp.tar.gz_Server

    标题中的“srv.cpp.tar.gz_Server”表明这是一个与服务器端编程相关的项目,主要涉及C++语言,因为源代码文件“srv.cpp”通常代表C++程序。这个压缩包包含了一个名为“srv.cpp”的文件,我们可以推断这可能是服务器...

    srv.rar_srv

    标题中的“srv.rar_srv”可能是指一个压缩包文件,其中包含了一个名为“srv”的服务器端程序。这个程序基于socket编程,用于实现简单的通信服务。在IT领域,socket编程是网络编程的基础,它允许两个或多个应用程序...

    History_07_Srv.txt

    History_07_Srv.txt

    srv.rar_聊天工具

    【标题】"srv.rar_聊天工具" 涉及的核心知识点是聊天工具的服务器端开发,其中使用了winsock编程技术。Winsock是Windows操作系统中的一个API,它为应用程序提供了网络通信的能力,使得开发者能够创建基于TCP/IP协议...

    srv.rar_srv_服务端 DELPHI_服务端集合

    《srv.rar_srv_服务端 DELPHI_服务端集合》是一个综合性的资源包,主要针对的是使用DELPHI开发服务端应用的初学者。这个压缩包包含了一系列与srv服务端相关的材料,旨在帮助用户理解srv服务端的工作原理,并提供...

    SAS94_09P3PC_70068130_Win_X64_Wrkstn_Srv.txt

    SAS9.4,sid码更新日期到2020年5月30日。 sas工具9.4版本,的sid更新代码,直接把begin里的内容做替换 或者直接使用renewsas进行更新

    Primo.Ramdisk.Srv.Mui.Setup.6.3.1.zip

    压缩包中的Primo.Ramdisk.Srv.Mui.Setup.6.3.1.exe是主安装程序,用户可以通过运行这个文件来安装Primo Ramdisk的服务器版。该程序集成了服务器端的所有功能,包括动态分配内存、设置内存盘大小、配置启动项等,使得...

    tac_plus_srv.zip

    tac_plus_srv.zip服务器源码。ubuntu下解压安装,方法都在对应的文档中

Global site tag (gtag.js) - Google Analytics