一、HttpServletRequest简介
- Web客户端发送给Web服务器的HTTP消息可以分为三个部分:
请求行、请求消息头、消息正文(也叫实体内容)。 - Servlet API中定义了一个ServletRequest接口类来作为获取客户端请求消息的基本接口,
Servlet程序通过调用ServletRequest对象的方法可以获知客户端的请求信息,
以及客户机和服务器的网络环境信息。 - Servlet API中定义了一个ServletRequest接口类来作为获取客户端请求消息的基本接口,
Servlet程序通过调用ServletRequest对象的方法可以获知客户端的请求信息,
以及客户机和服务器的网络环境信息。
二、获取请求行的相关信息
- HTTP请求消息的请求行可以分为三个部分:请求方式、资源路径和HTTP协议版本,如下:
GET /com/servlet/RequestURI?param1=a¶m2=b HTTP/1.1 - getMethod方法
getMethod方法返回HTTP请求消息中的请求方式(如GET、POST等)。 - getRequestURI方法
getRequestURI方法返回请求行中的资源名部分,
也就是位于URL的主机和端口号之后、参数部分之前的那部分内容。 - getQueryString方法
getQueryString方法返回请求行中的参数部分,也就是资源路径后面的问号(?)以后的所有内容。 - getProtocol方法
getProtocol方法返回请求行中的协议名和版本。 - getContextPath方法
getContextPath方法返回请求URL所属于的Web应用程序的路径。 - getPathInfo方法
getPathInfo方法返回请求URL中的额外路径信息 - getPathTranslated方法
getPathTranslated方法返回URL中的额外路径信息所对应的资源的真实路径。 - getServletPath方法
getServletPath方法返回Servlet的名称或Servlet所映射的路径。
三、获取网络连接信息
- getRemoteAddr方法
getRemoteAddr方法返回发出请求的客户机的IP地址。 - getRemoteHost方法
getRemoteHost方法返回发出请求的客户机的完整主机名。 - getRemotePort方法
getRemotePort方法返回发出请求的客户机所使用的网络接口的端口号。 - getLocalAddr方法
getLocalAddr方法返回Web服务器上接收当前请求的网络接口的IP地址。 - getLocalName方法
getLocalName方法返回Web服务器上接收当前请求的网络接口的IP地址所对应的主机名。 - getLocalPort方法
getLocalPort方法返回Web服务器上接收当前请求的网络接口的端口号。 - getServerName方法
getServerName方法返回当前请求所指向的主机名。 - getServerPort方法
getServerPort方法返回当前请求所连接的服务器端口号。 - getScheme方法
getScheme方法返回请求的协议名。 - getRequestURL方法
getRequestURL方法返回客户端发出请求时的完整URL,
包括协议、服务器名、端口号、资源路径等信息,但不包括后面的查询参数部分。
四、获取请求头信息
- getHeader方法
getHeader方法用于返回一个指定名称的头字段的值,其完整的语法定义如下:
public java.lang.String getHeader(java.lang.String name) - getHeaders方法
getHeaders方法用于返回一个Enumeration集合对象,该集合对象由请求消息中
出现的某个指定名称的所有头字段值组成。其完整语法定义如下:
public java.util.Enumeration getHeaders(java.lang.String name) - getHeaderNames方法
getHeaderNames方法用于返回一个包含请求消息中的所有头字段名的
Enumeration对象,其完整语法定义如下:
public java.util.Enumeration getHeaderNames() - getIntHeader方法
getIntHeader方法用于获取一个指定名称的头字段的值并将其
转换成int类型后返回,其完整语法定义如下:
public int getIntHeader(java.lang.String name) - getDateHeader方法
getDateHeader方法用于获取一个指定名称的头字段的值并将其按GMT时间格式
转换成一个代表日期/时间的长整型后返回,其完整语法定义如下:
public long getDateHeader(java.lang.String name) - getContentType方法
getContentType方法可用于直接返回Content-Type头字段的值,结果为String类型。 - getContentLength方法
getContentLength方法可用于直接返回Content-Length头字段的值,结果为int类型。 - getCharacterEncoding方法
getCharacterEncoding方法用于返回请求消息的实体部分的字符集编码。 - 获取所有请求头的编程实例
- 利用Referer请求头阻止“盗链”
referrer != null && referrer.startsWith(sitePart)条件下下载 - 利用Referer请求头隐藏JavaScript源代码
用Servlet程序来输出JavaScript源代码 - BASE64编码及客户端身份认证
BASE64就是将二进制数据转换成可打印的ASCII字符的一种最常见的编码方式。
BASE64的编码规则很简单,它将一组连续的字节数据按6个bit位进行分组,
然后对每组数据用一个ASCII字符来表示。6个bit位最多能表示2的6次方=64个数值,
因此可以使用64个ASCII字符来对应这64个数值,这64个ASCII字符为:
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
其中每个字符表示的数值就是该字符在上面的排列中的索引号,索引号从0开始编号。
BASIC验证的交互过程
五、浏览器传递参数信息的细节
- 使用GET方式传递参数
如果要使用GET请求方式给Web服务器传递参数,采取的办法就是将这些参数附加在
URL地址后面,URL地址与其后的参数之间用问号(?)分隔,
各个参数之间用(&)分隔,每个参数的名称与设置值之间用等号(=)分隔。
使用GET方式传送的数据量是有限制的,一般限制在1KB以下。
不要使用GET方式提交包含口令的FORM表单。 - 使用POST方式传递参数
当使用POST方式来提交FORM表单中的数据时,浏览器将各个表单字段元素
及其数据作为HTTP消息的实体内容发送给Web服务器。
使用POST方式传送的数据量要比使用GET方式传送的数据量大得多,
并且在浏览器地址栏中也看不到POST方式提交的数据。
网页中的<form>表单元素的enctype属性用于指定浏览器使用哪种编码方式
将表单中的数据传送给Web服务器,该属性可以有两种取值:
application/x-www-form-urlencoded
multipart/form-data
默认为application/x-www-form-urlencoded。在这种情况下,
浏览器在提交FORM表单数据时,将每个表单字段元素的名称与设置值之间
用等号(=)分隔,形成一个参数,并对其中的特殊字符进行URL编码处理。
各个参数之间用(&)分隔后作为HTTP请求消息的实体内容。 - 提交、重置、普通按钮的参数传递
- 单行与多行文本输入框如何传送参数
- 单选按钮与复选框如何传送参数
- 隐藏表单字段与图像字段如何传送参数
- 列表框的参数传递
- 使用JavaScript防止重复提交表单
六、获取请求参数
- getParameter方法除了能读取HTTP请求消息的请求行中的URL地址后的附加信息外,还能读取
POST方式下的“application/x-www-form-urlencoded”编码格式的实体内容。getParameter
等方法内部能够自动完成参数的分解和提取,并对提取的参数值进行URL解码后返回。 - getParameter方法
getParameter方法用于返回某个指定名称的参数的值,其完整的语法定义如下:
public java.lang.String getParameter(java.lang.String name)
如果请求消息中没有包含指定名称的参数,getParameter方法返回null;
如果指定名称的参数存在但没有设置值,则返回一个空串;
如果请求消息中包含有多个该指定名称的参数,
getParameter方法返回其中的第一个出现的参数值。 - getParameterValues方法
getParameterValues方法用于获取某个指定名称的所有参数的值,并以一个
String数组的形式返回这些参数值,其完整的语法定义如下:
public java.lang.String[] getParameterValues(java.lang.String name) - getParameterNames方法
getParameterNames方法用于返回一个包含请求消息中的所有参数名的
Enumeration对象。其完整语法如下:
public java.util.Enumeration getParameterNames() - getParameterMap方法
getParameterMap方法用于将请求消息中的所有参数名和值装入一个Map对象中返回,
其语法定义如下:
public java.util.Map getParameterMap() - 获取请求参数的编程实例
- 一次性处理多个列表项的实用案例
- 单选列表框的处理经验
七、获取请求消息的实体内容
- 对于HTTP请求消息中的实体内容,ServletRequest以输入流的方式提供给Servlet程序读取。
- getInputStream和getReader
getInputStream方法用于返回一个代表实体内容的输入流对象,
其类型为javax.servlet.ServletInputStream。
getReader方法用于返回一个代表实体内容的BufferedReader对象,
返回的BufferedReader对象将实体内容中的字节数据
按照请求消息中指定的字符集编码转换成文本字符串。在调用getReader方法之前,
可以调用ServletRequest的setCharacterEncoding方法指定其返回的
BufferedReader对象所使用的字符集编码。
调用了ServletRequest对象的getReader或getInputStream中的任何一个方法后,
就不能再调用另一方法,这两个方法时互相排斥的。
最好是在Servlet程序读取完实体内容后,接着在其内部调用流对象的close方法,
以便服务器尽快释放相关的资源。
对于“multipart/form-data”编码的FORM表单传递的信息,
只能调用HttpServletRequest的getInputStream或getReader方法
返回的输入流对象进行读取后再提取各个字段元素的信息。
八、利用请求域属性传递信息
- ServletRequest接口中定义了一个setAttribute方法来将对象存储进ServletRequest对象中,
还定义了一个getAttribute方法来检索存储在ServletRequest对象中的对象。
ServletRequest接口的实现类通常都是采用一个HashMap对象来存储这些对象,
这种存储在servletRequest对象中的对象称之为请求域属性,属于同一个请求的
多个处理模块之间可以通过请求域属性来传递对象数据。 - setAttribute方法
setAttribute方法用于将一个对象与一个名称关联后存储进ServletRequest对象中,
其完整语法定义如下:
public void setAttribute(java.lang.String name, java.lang.Object o)
如果ServletRequest对象中已经存在指定名称的属性,setAttribute方法先删除
原来的属性后再增加新的属性。如果传递给setAttribute方法的属性值对象为null,
则删除指定名称的属性,这时的效果等同于removeAttribute方法。 - getAttribute方法
getAttribute方法用于从ServletRequest对象中返回指定名称的属性对象,
其完整的语法定义如下:
public java.lang.String getAttribute(java.lang.String name) - removeAttribute方法
removeAttribute方法用于从Servlet对象中删除指定名称的属性,
其完整的语法定义如下:
public void removeAttribute(java.lang.String name) - getAttributeNames方法
getAttributeNames方法用于返回一个包含ServletRequest对象中的
所有属性名的Enumeration对象,其完整的语法定义如下:
public java.util.Enumeration getAttributeNames() - 请求域属性的编程实例
Controller选择View的编程实现方式就是
调用RequestDispatcher.forward方法将请求转发给作为View的JSP页面。
存储在ServletRequest对象中的属性只对当前请求有效,而对于其他请求无效,
也就是说,请求域属性只能用于在通过RequestDispatcher的forward和
include方法贯穿起来的多个Servlet或JSP页面之间共享数据。
九、请求参数的中文读取问题
- HTTP协议规定浏览器向Web服务器传递的参数信息中不能出现某些特殊字符,
而必须对这些字符进行URL编码后再传送。Web服务器端程序接收到客户端传递的
整个参数信息后,首先从中分离出每个参数的名称和值部分,接着对单个的名称
和值部分进行URL解码,然后将URL解码得到的字节数组按照某种字符集编码转成
Unicode字符串。 - 了解中文字符的URL编码
JDK的java.net包中有两个类:URLEncoder和URLDecoder。
它们的完整语法分别定义如下:
public static String encode(String s, String enc)
throws UnsupportedEncodingException
public static String decode(String s, String enc)
throws UnsupportedEncodingException
encode方法首先将要URL编码的Unicode字符串转换成某种字符集编码的字节数组,
然后对字节数组中的内容进行URL编码;
decode方法首先将要进行URL解码的字符串解码成一个字节数组,
然后将这个字节数组按照某种字符集编码转换成Unicode字符串。 - 浏览器怎样进行URL编码
浏览器将FORM表单中输入的内容转换成浏览器当前显示页面时所选择的字符集编码后,
再对这些内容进行URL编码后传送给服务器。 - getCharacterEncoding方法
ServletRequest接口中定义了一个getCharacterEncoding方法,
该方法用于返回请求消息中的实体内容的字符集编码名称。 - setCharacterEncoding方法
ServletRequest接口中定义了一个setCharacterEncoding方法,
该方法用于覆盖请求消息中的字符集编码名称的设置。 - getParameter方法的中文问题
1、对于HTTP请求消息的请求行中的URL地址后的参数,
getParameter等方法默认采用ISO8859-1字符集编码进行URL解码。
2、对于POST方式下的“application/x-www-form-urlencoded”编码格式的实体内容,
1)getParameter等方法以ServletRequest对象的getCharacterEncoding方法
返回的字符集编码对其进行URL解码。
2)getParameter等方法将使用默认的ISO8859-1字符集编码对实体内容中的参数
进行URL解码。
3、ServletRequest接口中定义了一个setCharacterEncoding方法来设置请求消息中的
实体内容的字符集编码的名称,getParameter方法将以该方法设置的字符集编码
对实体内容进行URL解码。 - 一些参考经验