» 游客:  注册 | 登录 | 会员 | 统计 | 帮助
斑竹的菜园子
 

作者:
标题: HttpServletRequest 上一主题 | 下一主题
borneol
管理员




积分 10952
发贴 955
注册 2005-2-23
来自 重庆
状态 离线
#1  HttpServletRequest

HttpServletRequest应用

6.2 获取请求行的相关信息
三个部分: 请求方式,资源路径和HTTP协议版本。如:
GET /it315/servlet/RequestURI?param1=a&param2=b HTTP/1.1

getMethod => GET
getRequestURI => /it315/servlet/RequestURI
getQueryString => param1=a&param2=b
getProtocol => HTTP/1.1
getContextPath =>
getPathInfo => 位于Servlet路径之后和查询参数之前的内容
getPathTranslated =>
getServletPath =>

response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.printf("getMethod => %s<br/>\n", request.getMethod());
        out.printf("getRequestURI => %s<br/>\n", request.getRequestURI());
        out.printf("getRequestURL => %s<br/>\n", request.getRequestURL().toString());
        out.printf("getQueryString => %s<br/>\n", request.getQueryString());
        out.printf("getProtocol => %s<br/>\n", request.getProtocol());
        out.printf("getContextPath => %s<br/>\n", request.getContextPath());
        out.printf("getPathInfo => %s<br/>\n", request.getPathInfo());
        out.printf("getPathTranslated => %s<br/>\n", request.getPathTranslated());
        out.printf("getServletPath => %s<br/>\n", request.getServletPath());

使用如下URL
http://localhost:8080/expweb/controller/apt?a=2

输出:
getMethod => GET
getRequestURI => /expweb/controller/apt
getRequestURL => http://localhost:8080/expweb/controller/apt
getQueryString => a=2
getProtocol => HTTP/1.1
getContextPath => /expweb
getPathInfo => /apt
getPathTranslated => D:\workspace\java\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\expweb\apt
getServletPath => /controller

6.3 获取网络连接信息 P298
如 getRemoteAddr, getRemoteHost

6.4 获取请求头信息 P299

6.4.10 利用Referer请求头阻止盗链 P303
6.4.11 利用Referer请求头隐藏javascript源代码 P305

6.4.12 BASE64编码及客户端身份认证
---------------------------------
当客户端访问WEB服务器时,WEB服务器可以发送401 Unauthorized 响应状态码和 WWW-Authenticate 响应头来要求客户端进行身份认证,而客户端则可以再次发出请求,并通过Authorization请求头来提供用户名和密码信息,服务器接着对 Authorization请求头中的身份信息进行认证。

服务器发送的WWW-Authenticate响应头中可以指定两种认证方式:basic和digest。

BASE64就是将二进制数据转换成可打印的ASCII字符的一种最常见的编码方式。它将一组连续的字节数据按6个bit位进行分组,然后对每一组数据用一个ASCII字符来表示。6个bit位最多能表示2^6 = 64 个数值。

6.5 浏览器传递参数信息的细节 P315
----------------------------
6.5.1 使用GET方式传递参数

对于URL参数部分的特殊字符必须进行URL编码之后才能发送给WEB服务器。
参考:
1.http://blog.csdn.net/yzhz/archive/2007/07/03/1676796.aspx
2.http://www.v-sky.com/blog/?p=215

6.5.2 使用POST方式传递参数
form表单中的enctype属性用于指定使用哪种编码方式将表单中的数据传递给WEB服务器,该属性可以有两种取值:
application/x-www-form-urlencoded
multipart/form-data

6.5.6 隐藏表单字段与图像字段如何传送参数
----------------------------------------
<form action="" method="GET">
  <input type="hidden" name="hidden1" value="hidden1"/>
  <input type="image" name="image1" src="http://www.it315.org/imgs/logo.jpg"/>
</form>

图像字段元素可以提交form表单,表单中的其它信息和图像上单击处的x,y坐标一起传递给服务器 image1.x=1&image1.y=19

6.5.8 使用javascript防止重复提交表单 P323
------------------------------------
在同步HTTP请求下,每一个浏览器窗口最多只与WEB服务器保持一个并发的TCP连接。如果服务器针对上一次请求的响应还没有结束时,用户再次单击了“提交”按钮,浏览器将不等待服务器的上次响应结果而关闭为上次请求建立的与服务器的连接,然后再与WEB服务器建立新的连接和提交新的请求。尽管客户端已经中断了上次请求的连接,但是Servlet程序仍然会忠实地处理完上次的请求,只是响应内容无法返回客户端。

6.6.6 一次性处理多个列表项的实用案例 P329
------------------------------------

6.7.2 分析文件上传的请求消息结构 P334
--------------------------------
如果没有设置form表单的enctype属性值,浏览器将使用其默认值"application/x-www-form-urlencoded"
这样,form表单中的所有字段按URL参数的形式组合成一行,并且对其中的参数值进行了URL编码处理。可以使用request.getParameter方法读取表单字段元素的信息。

如果要上传文件内容,<form>元素的enctype属性必须设置为"multipart/form-data"并且method属性必须设置为post。form表单中的各个字段元素之间以一个连续的字符序列作为字段的分隔界限,通常是由一连串的减号(-)字符后跟上一个随机产生的十六进制数字序列组成,例如,---------------------------198972582813851
这种分隔线就是MIME分隔线。

每一个表单字段元素的信息可以分为描述头和主体内容两部分,描述头与主体内容之间有一空行。格式:
Content-Disposition: form-data; name="fieldname"

文件类型的字段元素的描述头部分除了包含有字段元素的名称外,还包含有上传文件的文件名和文件类型,格式:
Content-Disposition: form-data; name="fieldname"; filename="filename"
Content-Type: text/plain

注:ie浏览器会将filename部分设置为上传文件的完整路径名,而ff只设置为文件名。

HttpServletRequest#getParameter 衣服无法读取以"multipart/form-data"编码的FORM表单中的各个字段元素的信息,只能使用HttpServletRequest的 getInputStream或getReader方法返回的输入流对象进行读取后再提取各个字段元素的信息。

对于提取FORM表单中的各个字段信息和上传文件内容的程序来说。Content-Length和Content-Type是比较重要的请求头。
Content-Length    指定实体内容的总长度
Content-Type    指定了用做字段分隔界线的字符序列,格式如下:
Content-Type: multipart/form-data; boundary=---------------------------198972582813851

注意:
实体内容中的字段分隔界限与Content-Type头中的指定的字段分隔界线有一点细微的差别,前者是在后者前面增加了两个减号(-)字符而形成的。

6.8 利用请求域属性传递信息 HttpServletRequest#setAttribute
----------------------------------------------------------

6.9 请求参数的中文读取问题 P349
--------------------------

6.5.6 隐藏表单字段与图像字段如何传送参数
----------------------------------------
<form action="" method="GET">
  <input type="hidden" name="hidden1" value="hidden1"/>
  <input type="image" name="image1" src="http://www.it315.org/imgs/logo.jpg"/>
</form>

图像字段元素可以提交form表单,表单中的其它信息和图像上单击处的x,y坐标一起传递给服务器 image1.x=1&image1.y=19

6.5.8 使用javascript防止重复提交表单 P323
------------------------------------
在同步HTTP请求下,每一个浏览器窗口最多只与WEB服务器保持一个并发的TCP连接。如果服务器针对上一次请求的响应还没有结束时,用户再次单击了“ 提交”按钮,浏览器将不等待服务器的上次响应结果而关闭为上次请求建立的与服务器的连接,然后再与WEB服务器建立新的连接和提交新的请求。尽管客户端已经中断了上次请求的连接,但是Servlet程序仍然会忠实地处理完上次的请求,只是响应内容无法返回客户端。

6.6.6 一次性处理多个列表项的实用案例 P329
------------------------------------

6.7.2 分析文件上传的请求消息结构 P334
--------------------------------
如果没有设置form表单的enctype属性值,浏览器将使用其默认值"application/x-www-form-urlencoded"
这样,form表单中的所有字段按URL参数的形式组合成一行,并且对其中的参数值进行了URL编码处理。可以使用request.getParameter方法读取表单字段元素的信息。

如果要上传文件内容,<form>元素的enctype属性必须设置为"multipart/form-data"并且method属性必须设置为post。form表单中的各个字段元素之间以一个连续的字符序列作为字段的分隔界限,通常是由一连串的减号(-)字符后跟上一个随机产生的十六进制数字序列组成,例如,---------------------------198972582813851
这种分隔线就是MIME分隔线。

每一个表单字段元素的信息可以分为描述头和主体内容两部分,描述头与主体内容之间有一空行。格式:
Content-Disposition: form-data; name="fieldname"

文件类型的字段元素的描述头部分除了包含有字段元素的名称外,还包含有上传文件的文件名和文件类型,格式:
Content-Disposition: form-data; name="fieldname"; filename="filename"
Content-Type: text/plain

注:ie浏览器会将filename部分设置为上传文件的完整路径名,而ff只设置为文件名。

HttpServletRequest#getParameter衣服无法读取以"multipart/form-data"编码的FORM表单中的各个字段元素的信息,只能使用HttpServletRequest的getInputStream或getReader方法返回的输入流对象进行读取后再提取各个字段元素的信息。

对于提取FORM表单中的各个字段信息和上传文件内容的程序来说。Content-Length和Content-Type是比较重要的请求头。
Content-Length    指定实体内容的总长度
Content-Type    指定了用做字段分隔界线的字符序列,格式如下:
Content-Type: multipart/form-data; boundary=---------------------------198972582813851

注意:
实体内容中的字段分隔界限与Content-Type头中的指定的字段分隔界线有一点细微的差别,前者是在后者前面增加了两个减号(-)字符而形成的。

6.8 利用请求域属性传递信息 HttpServletRequest#setAttribute
----------------------------------------------------------

6.9 请求参数的中文读取问题 P349
--------------------------
对于以Post方式提交的表单数据,可以使用HttpServletRequest#setCharacterEncoding设置字符集,这样HttpServletRequest#getParameter使用这个设定的字符集decode经过编码的参数。

对于在URL中传递的参数,可以在<CATALINA_HOME>/conf/server.xml中的Http Connector的URIEncoding和useBodyEncodingForURI这两个属性来设置对URL后的附加参数进行URL解码时如何选择字符集编码。

URIEncoding用于指定URL后的附加参数的字符集编码,useBodyEncodingForURI则说明是否采用实体内容的字符集编码设置来代替URIEncoding的设置,也就是说,当useBodyEncodingForURI属性设置为true 时,HttpServletRequest#setCharacterEncoding方法设置的字符集编码也将影响getParameter等方法对 URL地址后的参数进行URL解码的结果。



0200 1D 06 00 00 A0 86 01 00 FF FF 00 00 1E 06 00 00
         E-mail:[email protected]
         MSN:[email protected]
         Home page:www.chenzhang.com
0210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2009-6-9 10:55
查看资料  发送邮件  访问主页  发短消息  QQ   编辑帖子  引用回复


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: