﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Art of life-随笔分类-HTTP</title><link>http://www.blogjava.net/wiser/category/20777.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 19 Mar 2007 21:02:30 GMT</lastBuildDate><pubDate>Mon, 19 Mar 2007 21:02:30 GMT</pubDate><ttl>60</ttl><item><title>HTTP相应状态代码概述</title><link>http://www.blogjava.net/wiser/archive/2007/03/19/104789.html</link><dc:creator>英明</dc:creator><author>英明</author><pubDate>Mon, 19 Mar 2007 11:36:00 GMT</pubDate><guid>http://www.blogjava.net/wiser/archive/2007/03/19/104789.html</guid><wfw:comment>http://www.blogjava.net/wiser/comments/104789.html</wfw:comment><comments>http://www.blogjava.net/wiser/archive/2007/03/19/104789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiser/comments/commentRss/104789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiser/services/trackbacks/104789.html</trackback:ping><description><![CDATA[
		<p>[转自：伊图教程网] </p>
		<p>
		</p>
		<p>        7.1 状态代码概述</p>
		<p>
				<br />　　 Web服务器响应浏览器或其他客户程序的请求时，其应答一般由以下几个部分组成：一个状态行，几个应答头，一个空行，内容文档。下面是一个最简单的应答：<br />HTTP/1.1 200 OK<br />Content-Type: text/plain<br />Hello World</p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　状态行包含HTTP版本、状态代码、与状态代码对应的简短说明信息。在大多数情况下，除了Content-Type之外的所有应答头都是可选的。但 Content-Type是必需的，它描述的是后面文档的MIME类型。虽然大多数应答都包含一个文档，但也有一些不包含，例如对HEAD请求的应答永远不会附带文档。有许多状态代码实际上用来标识一次失败的请求，这些应答也不包含文档（或只包含一个简短的错误信息说明）。<br />　　 Servlet可以利用状态代码来实现许多功能。例如，可以把用户重定向到另一个网站；可以指示出后面的文档是图片、PDF文件或HTML文件；可以告诉用户必须提供密码才能访问文档；等等。这一部分我们将具体讨论各种状态代码的含义以及利用这些代码可以做些什么。<br />　　 7.2 设置状态代码<br />　　 如前所述，HTTP应答状态行包含HTTP版本、状态代码和对应的状态信息。由于状态信息直接和状态代码相关，而HTTP版本又由服务器确定，因此需要Servlet设置的只有一个状态代码。<br />　　 Servlet设置状态代码一般使用HttpServletResponse的setStatus方法。setStatus方法的参数是一个整数（即状态代码），不过为了使得代码具有更好的可读性，可以用HttpServletResponse中定义的常量来避免直接使用整数。这些常量根据HTTP 1.1中的标准状态信息命名，所有的名字都加上了SC前缀（Status Code的缩写）并大写，同时把空格转换成了下划线。也就是说，与状态代码404对应的状态信息是“Not Found”，则HttpServletResponse中的对应常量名字为SC_NOT_FOUND。但有两个例外：和状态代码302对应的常量根据 HTTP 1.0命名，而307没有对应的常量。<br />　　 设置状态代码并非总是意味着不要再返回文档。例如，虽然大多数服务器返回404应答时会输出简单的“File Not Found”信息，但Servlet也可以定制这个应答。不过，定制应答时应当在通过PrintWriter发送任何内容之前先调用 response.setStatus。<br />　　虽然设置状态代码一般使用的是response.setStauts(int)方法，但为了简单起见，HttpServletResponse为两种常见的情形提供了专用方法：sendError方法生成一个404应答，同时生成一个简短的HTML错误信息文档；sendRedirect方法生成一个 302应答，同时在Location头中指示新文档的URL。<br />　　 7.3 HTTP 1.1状态代码及其含义<br />　　 下表显示了常见的HTTP 1.1状态代码以及它们对应的状态信息和含义。<br />　　 应当谨慎地使用那些只有HTTP 1.1支持的状态代码，因为许多浏览器还只能够支持HTTP 1.0。如果你使用了HTTP 1.1特有的状态代码，最好能够检查一下请求的HTTP版本号（通过HttpServletRequest的getProtocol方法）。 状态代码状态信息 含义 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>100 Continue 初始的请求已经接受，客户应当继续发送请求的其余部分。（HTTP 1.1新）<br />101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议（HTTP 1.1新）<br />200 OK 一切正常，对GET和POST请求的应答文档跟在后面。如果不用setStatus设置状态代码，Servlet默认使用202状态代码。<br />201 Created 服务器已经创建了文档，Location头给出了它的URL。<br />202 Accepted 已经接受请求，但处理尚未完成。<br />203 Non-Authoritative Information 文档已经正常地返回，但一些应答头可能不正确，因为使用的是文档的拷贝（HTTP 1.1新）。<br />204 No Content 没有新文档，浏览器应该继续显示原来的文档。如果用户定期地刷新页面，而Servlet可以确定用户文档足够新，这个状态代码是很有用的。<br />205 Reset Content 没有新的内容，但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容（HTTP 1.1新）。<br />206 Partial Content 客户发送了一个带有Range头的GET请求，服务器完成了它（HTTP 1.1新）。<br />300 Multiple Choices 客户请求的文档可以在多个位置找到，这些位置已经在返回的文档内列出。如果服务器要提出优先选择，则应该在Location应答头指明。<br />301 Moved Permanently 客户请求的文档在其他地方，新的URL在Location头中给出，浏览器应该自动地访问新的URL。<br />302 Found 类似于301，但新的URL应该被视为临时性的替代，而不是永久性的。注意，在HTTP1.0中对应的状态信息是“Moved Temporatily”，而HttpServletResponse中相应的常量是SC_MOVED_TEMPORARILY，而不是 SC_FOUND。<br />出现该状态代码时，浏览器能够自动访问新的URL，因此它是一个很有用的状态代码。为此，Servlet提供了一个专用的方法，即 sendRedirect。使用response.sendRedirect(url)比使用response.setStatus (response.SC_MOVED_TEMPORARILY)和response.setHeader("Location",url)更好。这是因为：<br />首先，代码更加简洁。<br />第二，使用sendRedirect，Servlet会自动构造一个包含新链接的页面（用于那些不能自动重定向的老式浏览器）。<br />最后，sendRedirect能够处理相对URL，自动把它们转换成绝对URL。<br />注意这个状态代码有时候可以和301替换使用。例如，如果浏览器错误地请求<a href="http://www.cnjm.net/resfetch/CyZ26ekjrPr6dlzL6fo_">http://www.cnjm.net/resfetch/CyZ26ekjrPr6dlzL6fo_</a>~user（缺少了后面的斜杠），有的服务器返回301，有的则返回302。<br />严格地说，我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。<br />303 See Other 类似于301/302，不同之处在于，如果原来的请求是POST，Location头指定的重定向目标文档应该通过GET提取（HTTP 1.1新）。<br />304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求（一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档）。服务器告诉客户，原来缓冲的文档还可以继续使用。<br />305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取（HTTP 1.1新）。<br />307 Temporary Redirect 和302（Found）相同。许多浏览器会错误地响应302应答进行重定向，即使原来的请求是POST，即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因，HTTP 1.1新增了307，以便更加清除地区分几个状态代码：当出现303应答时，浏览器可以跟随重定向的GET和POST请求；如果是307应答，则浏览器只能跟随对GET请求的重定向。<br />注意，HttpServletResponse中没有为该状态代码提供相应的常量。（HTTP 1.1新）<br />400 Bad Request 请求出现语法错误。<br />401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头，浏览器据此显示用户名字/密码对话框，然后在填写合适的Authorization头后再次发出请求。<br />403 Forbidden 资源不可用。服务器理解客户的请求，但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。<br />404 Not Found 无法找到指定位置的资源。这也是一个常用的应答，HttpServletResponse专门提供了相应的方法：sendError(message)。<br />405 Method Not Allowed 请求方法（GET、POST、HEAD、DELETE、PUT、TRACE等）对指定的资源不适用。（HTTP 1.1新）<br />406 Not Acceptable 指定的资源已经找到，但它的MIME类型和客户在Accpet头中所指定的不兼容（HTTP 1.1新）。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>407 Proxy Authentication Required 类似于401，表示客户必须先经过代理服务器的授权。（HTTP 1.1新）<br />408 Request Timeout 在服务器许可的等待时间内，客户一直没有发出任何请求。客户可以在以后重复同一请求。（HTTP 1.1新）<br />409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突，因此请求不能成功。（HTTP 1.1新） </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>410 Gone 所请求的文档已经不再可用，而且服务器不知道应该重定向到哪一个地址。它和404的不同在于，返回407表示文档永久地离开了指定的位置，而404表示由于未知的原因文档不可用。（HTTP 1.1新） </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>411 Length Required 服务器不能处理请求，除非客户发送一个Content-Length头。（HTTP 1.1新） </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>412 Precondition Failed 请求头中指定的一些前提条件失败（HTTP 1.1新）。<br />413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求，则应该提供一个Retry-After头（HTTP 1.1新）。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>414 Request URI Too Long URI太长（HTTP 1.1新）。<br />416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。（HTTP 1.1新）<br />500 Internal Server Error 服务器遇到了意料不到的情况，不能完成客户的请求。<br />501 Not Implemented 服务器不支持实现请求所需要的功能。例如，客户发出了一个服务器不支持的PUT请求。<br />502 Bad Gateway 服务器作为网关或者代理时，为了完成请求访问下一个服务器，但该服务器返回了非法的应答。<br />503 Service Unavailable 服务器由于维护或者负载过重未能应答。例如，Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。<br />504 Gateway Timeout 由作为代理或网关的服务器使用，表示不能及时地从远程服务器获得应答。（HTTP 1.1新）<br />505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本。（HTTP 1.1新）<br />　　 7.4 实例：访问多个搜索引擎 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　 下面这个例子用到了除200之外的另外两个常见状态代码：302和404。302通过sendRedirect方法设置，404通过sendError方法设置。<br />　　在这个例子中，首先出现的HTML表单用来选择搜索引擎、搜索字符串、每页显示的搜索结果数量。表单提交后，Servlet提取这三个变量，按照所选择的搜索引擎的要求构造出包含这些变量的URL，然后把用户重定向到这个URL。如果用户不能正确地选择搜索引擎，或者利用其他表单发送了一个不认识的搜索引擎名字，则返回一个提示搜索引擎找不到的404页面。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　 SearchEngines.java<br />　　 注意：这个Servlet要用到后面给出的SearchSpec类，SearchSpec的功能是构造适合不同搜索引擎的URL。<br />package hall;<br />import java.io.*;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br />import java.net.*;<br />public class SearchEngines extends HttpServlet {<br />public void doGet(HttpServletRequest request,<br />HttpServletResponse response)<br />throws ServletException, IOException {<br />// getParameter自动解码URL编码的查询字符串。由于我们<br />// 要把查询字符串发送给另一个服务器，因此再次使用<br />// URLEncoder进行URL编码<br />String searchString =<br />URLEncoder.encode(request.getParameter("searchString"));<br />String numResults =<br />request.getParameter("numResults");<br />String searchEngine = </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>request.getParameter("searchEngine");<br />SearchSpec[] commonSpecs = SearchSpec.getCommonSpecs(); </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>for(int i=0; i&lt;commonSpecs.length; i++) {<br />SearchSpec searchSpec = commonSpecs[i];<br />if (searchSpec.getName().equals(searchEngine)) {<br />String url =<br />response.encodeURL(searchSpec.makeURL(searchString,<br />numResults));<br />response.sendRedirect(url);<br />return;<br />}<br />}<br />response.sendError(response.SC_NOT_FOUND,<br />"No recognized search engine specified.");<br />}<br />public void doPost(HttpServletRequest request, </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>HttpServletResponse response)<br />throws ServletException, IOException {<br />doGet(request, response);<br />}<br />}<br />　　 SearchSpec.java<br />package hall;<br />class SearchSpec {<br />private String name, baseURL, numResultsSuffix; </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>private static SearchSpec[] commonSpecs =<br />{ new SearchSpec("google",<br />"<a href="http://www.cnjm.net/resfetch/HTE4-.tbDklJgICAdCLv7yJfxXTw79RJ5sVjvvA4">http://www.cnjm.net/resfetch/HTE4-.tbDklJgICAdCLv7yJfxXTw79RJ5sVjvvA4</a>?q=",<br />"&amp;num="),<br />new SearchSpec("infoseek",<br />"<a href="http://www.cnjm.net/resfetch/IoxerKxmKqCgTomdyrYFBYTJF8rJ8coMoEhOrLMFtg__">http://www.cnjm.net/resfetch/IoxerKxmKqCgTomdyrYFBYTJF8rJ8coMoEhOrLMFtg__</a>?qt=", </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>"&amp;nh="),<br />new SearchSpec("lycos",<br />"<a href="http://www.cnjm.net/resfetch/JiGbbGz0UF9fILScxHz0.cThILScxHzhnMTWX5yPtoKjtnJf9AT9fAS2bA__">http://www.cnjm.net/resfetch/JiGbbGz0UF9fILScxHz0.cThILScxHzhnMTWX5yPtoKjtnJf9AT9fAS2bA__</a>?query=",<br />"&amp;maxhits="),<br />new SearchSpec("hotbot",<br />"<a href="http://www.cnjm.net/resfetch/GS8Izc0YK6mpo6Ojwgg0zfY0zcIKNLyp">http://www.cnjm.net/resfetch/GS8Izc0YK6mpo6Ojwgg0zfY0zcIKNLyp</a>?MT=",<br />"&amp;DC=")<br />};<br />public SearchSpec(String name, </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>String baseURL,<br />String numResultsSuffix) { </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>this.name = name;<br />this.baseURL = baseURL;<br />this.numResultsSuffix = numResultsSuffix; </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>} </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>public String makeURL(String searchString, String numResults) {<br />return(baseURL + searchString + numResultsSuffix + numResults);<br />}<br />public String getName() {<br />return(name);<br />}<br />public static SearchSpec[] getCommonSpecs() {<br />return(commonSpecs);<br />}<br />}<br />　　 SearchEngines.html<br />　　 下面是调用上述Servlet的HTML表单。<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;<br />&lt;HTML&gt;<br />&lt;HEAD&gt;<br />&lt;TITLE&gt;访问多个搜索引擎&lt;/TITLE&gt;<br />&lt;/HEAD&gt;<br />&lt;BODY BGCOLOR="#FDF5E6"&gt; </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>&lt;FORM ACTION="/servlet/hall.SearchEngines"&gt;<br />&lt;CENTER&gt;<br />搜索关键字:<br />&lt;INPUT TYPE="TEXT" NAME="searchString"&gt;&lt;BR&gt;<br />每页显示几个查询结果: </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>&lt;INPUT TYPE="TEXT" NAME="numResults"<br />VALUE=10 SIZE=3&gt;&lt;BR&gt;<br />&lt;INPUT TYPE="RADIO" NAME="searchEngine"<br />VALUE="google"&gt;<br />Google |<br />&lt;INPUT TYPE="RADIO" NAME="searchEngine"<br />VALUE="infoseek"&gt;<br />Infoseek |<br />&lt;INPUT TYPE="RADIO" NAME="searchEngine"<br />VALUE="lycos"&gt; </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>Lycos | </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>&lt;INPUT TYPE="RADIO" NAME="searchEngine"<br />VALUE="hotbot"&gt;<br />HotBot<br />&lt;BR&gt;<br />&lt;INPUT TYPE="SUBMIT" VALUE="Search"&gt;<br />&lt;/CENTER&gt;<br />&lt;/FORM&gt;<br />&lt;/BODY&gt;<br />&lt;/HTML&gt;</p>
<img src ="http://www.blogjava.net/wiser/aggbug/104789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiser/" target="_blank">英明</a> 2007-03-19 19:36 <a href="http://www.blogjava.net/wiser/archive/2007/03/19/104789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP请求头概述</title><link>http://www.blogjava.net/wiser/archive/2007/03/19/104788.html</link><dc:creator>英明</dc:creator><author>英明</author><pubDate>Mon, 19 Mar 2007 11:25:00 GMT</pubDate><guid>http://www.blogjava.net/wiser/archive/2007/03/19/104788.html</guid><wfw:comment>http://www.blogjava.net/wiser/comments/104788.html</wfw:comment><comments>http://www.blogjava.net/wiser/archive/2007/03/19/104788.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiser/comments/commentRss/104788.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiser/services/trackbacks/104788.html</trackback:ping><description><![CDATA[
		<p>
		</p>
		<p>（转贴：找了好久找到的关于请求头的文章，对联网程序很有帮助） </p>
		<p>HTTP请求头概述 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　 HTTP客户程序（例如浏览器），向服务器发送请求的时候必须指明请求类型（一般是GET或者POST）。如有必要，客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的，但Content-Length除外。对于POST请求来说Content-Length必须出现。<br />　　 下面是一些最常见的请求头：<br />Accept：浏览器可接受的MIME类型。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>Accept-Charset：浏览器可接受的字符集。<br />Accept-Encoding：浏览器能够进行解码的数据编码方式，比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。<br />Accept-Language：浏览器所希望的语言种类，当服务器能够提供一种以上的语言版本时要用到。<br />Authorization：授权信息，通常出现在对服务器发送的WWW-Authenticate头的应答中。<br />Connection：表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”，或者看到请求使用的是HTTP 1.1（HTTP 1.1默认进行持久连接），它就可以利用持久连接的优点，当页面包含多个元素时（例如Applet，图片），显著地减少下载所需要的时间。要实现这一点， Servlet需要在应答中发送一个Content-Length头，最简单的实现方法是：先把内容写入ByteArrayOutputStream，然后在正式写出内容之前计算它的大小。<br />Content-Length：表示请求消息正文的长度。<br />Cookie：这是最重要的请求头信息之一，参见后面《Cookie处理》一章中的讨论。<br />From：请求发送者的email地址，由一些特殊的Web客户程序使用，浏览器不会用到它。<br />Host：初始URL中的主机和端口。<br />If-Modified-Since：只有当所请求的内容在指定的日期之后又经过修改才返回它，否则返回304“Not Modified”应答。<br />Pragma：指定“no-cache”值表示服务器必须返回一个刷新后的文档，即使它是代理服务器而且已经有了页面的本地拷贝。<br />Referer：包含一个URL，用户从该URL代表的页面出发访问当前请求的页面。<br />User-Agent：浏览器类型，如果Servlet返回的内容与浏览器类型有关则该值非常有用。<br />UA-Pixels，UA-Color，UA-OS，UA-CPU：由某些版本的IE浏览器所发送的非标准的请求头，表示屏幕大小、颜色深度、操作系统和CPU类型。<br />　　 有关HTTP头完整、详细的说明，请参见<a href="http://www.cnjm.net/resfetch/CnUnZGQjjsPDHBwclByBlFRh7MORYVRkVG9UdNjD">http://www.cnjm.net/resfetch/CnUnZGQjjsPDHBwclByBlFRh7MORYVRkVG9UdNjD</a> 的HTTP规范。<br />　　 5.2 在Servlet中读取请求头<br />　　在Servlet中读取HTTP头是非常方便的，只需要调用一下HttpServletRequest的getHeader方法即可。如果客户请求中提供了指定的头信息，getHeader返回对应的字符串；否则，返回null。部分头信息经常要用到，它们有专用的访问方法：getCookies方法返回 Cookie头的内容，经解析后存放在Cookie对象的数组中，请参见后面有关Cookie章节的讨论；getAuthType和 getRemoteUser方法分别读取Authorization头中的一部分内容；getDateHeader和getIntHeader方法读取指定的头，然后返回日期值或整数值。<br />　　 除了读取指定的头之外，利用getHeaderNames还可以得到请求中所有头名字的一个Enumeration对象。<br />　　最后，除了查看请求头信息之外，我们还可以从请求主命令行获得一些信息。getMethod方法返回请求方法，请求方法通常是GET或者POST，但也有可能是HEAD、PUT或者DELETE。getRequestURI方法返回URI（URI是URL的从主机和端口之后到表单数据之前的那一部分）。 getRequestProtocol返回请求命令的第三部分，一般是“HTTP/1.0”或者“HTTP/1.1”。<br />　　 5.3 实例：输出所有的请求头<br />　　 下面的Servlet实例把所有接收到的请求头和它的值以表格的形式输出。另外，该Servlet还会输出主请求命令的三个部分：请求方法，URI，协议/版本。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　 ShowRequestHeaders.java<br />package hall;<br />import java.io.*;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br />import java.util.*;<br />public class ShowRequestHeaders extends HttpServlet {<br />public void doGet(HttpServletRequest request, </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>HttpServletResponse response) </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>throws ServletException, IOException {<br />response.setContentType("text/html");<br />PrintWriter out = response.getWriter();<br />String title = "显示所有请求头";<br />out.println(ServletUtilities.headWithTitle(title) +<br />"&lt;BODY BGCOLOR=\"#FDF5E6\"&gt;\n" +<br />"&lt;H1 ALIGN=CENTER&gt;" + title + "&lt;/H1&gt;\n" + </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>"&lt;B&gt;Request Method: &lt;/B&gt;" +<br />request.getMethod() + "&lt;BR&gt;\n" +<br />"&lt;B&gt;Request URI: &lt;/B&gt;" +<br />request.getRequestURI() + "&lt;BR&gt;\n" +<br />"&lt;B&gt;Request Protocol: &lt;/B&gt;" +<br />request.getProtocol() + "&lt;BR&gt;&lt;BR&gt;\n" +<br />"&lt;TABLE BORDER=1 ALIGN=CENTER&gt;\n" +<br />"&lt;TR BGCOLOR=\"#FFAD00\"&gt;\n" +<br />"&lt;TH&gt;Header Name&lt;TH&gt;Header Value");<br />Enumeration headerNames = request.getHeaderNames();<br />while(headerNames.hasMoreElements()) {<br />String headerName = (String)headerNames.nextElement();<br />out.println("&lt;TR&gt;&lt;TD&gt;" + headerName);<br />out.println(" &lt;TD&gt;" + request.getHeader(headerName));<br />}<br />out.println("&lt;/TABLE&gt;\n&lt;/BODY&gt;&lt;/HTML&gt;");<br />}<br />public void doPost(HttpServletRequest request,<br />HttpServletResponse response)<br />throws ServletException, IOException {<br />doGet(request, response); </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>}<br />}</p>
<img src ="http://www.blogjava.net/wiser/aggbug/104788.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiser/" target="_blank">英明</a> 2007-03-19 19:25 <a href="http://www.blogjava.net/wiser/archive/2007/03/19/104788.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于HTTP协议</title><link>http://www.blogjava.net/wiser/archive/2007/03/17/104402.html</link><dc:creator>英明</dc:creator><author>英明</author><pubDate>Sat, 17 Mar 2007 02:39:00 GMT</pubDate><guid>http://www.blogjava.net/wiser/archive/2007/03/17/104402.html</guid><wfw:comment>http://www.blogjava.net/wiser/comments/104402.html</wfw:comment><comments>http://www.blogjava.net/wiser/archive/2007/03/17/104402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiser/comments/commentRss/104402.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiser/services/trackbacks/104402.html</trackback:ping><description><![CDATA[
		<p>近日正在做有关HTTP协议的工作，发现自己的基本功实在不过关，下面转贴一篇对自己很帮助的文章。</p>
		<p>出处<a href="http://blog.csdn.net/heiyeshuwu/archive/2006/06/28...">http://blog.csdn.net/heiyeshuwu/archive/2006/06/28...</a></p>
		<p> </p>
		<p>
				<strong>HTTP：超文本传输协议</strong>
		</p>
		<p>更详细的HTTP协议头信息参考我blog之前的文章。 </p>
		<p>
				<img height="20" alt="" src="http://www.networkdictionary.com/chinese/images/arrow.gif" width="20" />
				<br />HTTP：超文本传输协议 </p>
		<p>HTTP：Hypertext Transfer Protocol </p>
		<p>　　超文本传输协议（HTTP）是应用层协议，由于其简捷、快速的方式，适用于分布式和合作式超媒体信息系统。自 1990 年起， HTTP 就已经被应用于 WWW 全球信息服务系统。 </p>
		<p>　　HTTP 允许使用自由答复的方法表明请求目的，它建立在统一资源识别器（URI）提供的参考原则下，作为一个地址（URL）或名字（URN），用以标志采用哪种方法，它用类似于网络邮件和多用途网际邮件扩充协议（MIME）的格式传递消息。 </p>
		<p>　　HTTP 也可用作普通协议，实现用户代理与连接其它 Internet 服务（如 SMTP 、 NNTP 、 FTP 、 GOPHER 及 WAIS ）的代理服务器或网关之间的通信，允许基本的超媒体访问各种应用提供的资源，同时简化了用户代理系统的实施。 </p>
		<p>　　HTTP 是一种请求 / 响应式的协议。一个客户机与服务器建立连接后，发送一个请求给服务器，请求的格式是：统一资源标识符（URI）、协议版本号，后面是类似 MIME 的信息，包括请求修饰符、客户机信息和可能的内容。服务器接到请求后，给予相应的响应信息，其格式是：一个状态行包括信息的协议版本号、一个成功或错误的代码，后面也是类似 MIME 的信息，包括服务器信息、实体信息和可能的内容。 </p>
		<p>　　HTTP 的第一版本 HTTP/0.9 是一种简单的用于网络间原始数据传输的协议。而由 RFC 1945 定义的 HTTP/1.0 ，在原 HTTP/0.9 的基础上，有了进一步的改进，允许消息以类 MIME 信息格式存在，包括请求 / 响应范式中的已传输数据和修饰符等方面的信息。但是， HTTP/1.0 没有充分考虑到分层代理服务器、高速缓冲存储器、持久连接需求或虚拟主机等方面的效能。相比之下， HTTP/1.1 要求更加严格以确保服务的可靠性。关于安全增强版的 HTTP （即S-HTTP），将在相关文件中再作介绍。 </p>
		<p>
				<img height="20" alt="" src="http://www.networkdictionary.com/chinese/images/arrow.gif" width="20" />
				<br />协议结构 </p>
		<p>　　 HTTP报文由从客户机到服务器的请求和从服务器到客户机的响应构成。 请求报文格式如下： </p>
		<p>请求行<br />通用信息头<br />请求头<br />实体头<br />报文主体 </p>
		<p>　　请求行以方法字段开始，后面分别是 URL 字段和 HTTP 协议版本字段，并以 CRLF 结尾。SP 是分隔符。除了在最后的 CRLF 序列中 CF 和 LF 是必需的之外，其他都可以不要。有关通用信息头，请求头和实体头方面的具体内容可以参照相关文件。 </p>
		<p>　　应报文格式如下： </p>
		<p>状态行<br />通用信息头<br />响应头<br />实体头<br />报文主体 </p>
		<p>　　状态码元由3位数字组成，表示请求是否被理解或被满足。原因分析是对原文的状态码作简短的描述，状态码用来支持自动操作，而原因分析用来供用户使用。客户机无需用来检查或显示语法。有关通用信息头，响应头和实体头方面的具体内容可以参照相关文件。 </p>
		<p>相关协议<br />WWW、<a href="http://www.networkdictionary.com/chinese/protocols/ftp">FTP</a>、STMP、<a href="http://www.networkdictionary.com/chinese/protocols/nntp.php">NNTP</a>、Gopher、WAIS、<a href="http://www.networkdictionary.com/chinese/protocols/dns.php">DNS</a>、<a href="http://www.networkdictionary.com/chinese/protocols/shttp.php">S-HTTP</a></p>
		<p>组织来源<br />HTTP 定义在 IETF (<a href="http://www.ietf.org/">http://www.ietf.org/</a>) 的 RFC 1945和2616中。 </p>
		<p>相关链接<br /><a href="http://www.javvin.com/protocol/rfc1945.pdf">http://www.javvin.com/protocol/rfc1945.pdf</a> ：Hypertext Transfer Protocol – HTTP 1.0<br /><a href="http://www.javvin.com/protocol/rfc2616.pdf">http://www.javvin.com/protocol/rfc2616.pdf</a> ：Hypertext Transfer Protocol – HTTP 1.1 </p>
		<p>
				<strong>FTP：文件传输协议</strong>
		</p>
		<p>
				<img height="20" alt="" src="http://www.networkdictionary.com/chinese/images/arrow.gif" width="20" />
				<br />FTP：文件传输协议 </p>
		<p>（FTP：File Transfer Protocol） </p>
		<p>　　文件传输协议（FTP）使得主机间可以共享文件。 FTP 使用 TCP 生成一个虚拟连接用于控制信息，然后再生成一个单独的 TCP 连接用于数据传输。控制连接使用类似 TELNET 协议在主机间交换命令和消息。 </p>
		<p>　　FTP 的主要功能如下： </p>
		<ul>
				<li>提供文件的共享（计算机程序 / 数据）； 
</li>
				<li>支持间接使用远程计算机； 
</li>
				<li>使用户不因各类主机文件存储器系统的差异而受影响； 
</li>
				<li>可靠且有效的传输数据。 </li>
		</ul>
		<p>　　FTP ，尽管可以直接被终端用户使用，但其应用主要还是通过程序实现。 </p>
		<p>　　FTP 控制帧即指 TELNET 交换信息，包含 TELNET 命令和选项。然而，大多数 FTP 控制帧是简单的 ASCII 文本，可以分为 FTP 命令或 FTP 消息。 FTP 消息是对 FTP 命令的响应，它由带有解释文本的应答代码构成。 </p>
		<p>
				<img height="20" alt="" src="http://www.networkdictionary.com/chinese/images/arrow.gif" width="20" />
				<br />协议结构 </p>
		<p>
				<strong>命令</strong>
				<br />
				<strong>描述</strong>
		</p>
		<p>ABOR<br />中断数据连接程序 </p>
		<p>ACCT &lt;account&gt;<br />系统特权帐号 </p>
		<p>ALLO &lt;bytes&gt; <br />为服务器上的文件存储器分配字节 </p>
		<p>APPE &lt;filename&gt;<br />添加文件到服务器同名文件 </p>
		<p>CDUP &lt;dir path&gt;<br />改变服务器上的父目录 </p>
		<p>CWD &lt;dir path&gt;<br />改变服务器上的工作目录 </p>
		<p>DELE &lt;filename&gt;<br />删除服务器上的指定文件 </p>
		<p>HELP &lt;command&gt;<br />返回指定命令信息 </p>
		<p>LIST &lt;name&gt;<br />如果是文件名列出文件信息，如果是目录则列出文件列表 </p>
		<p>MODE &lt;mode&gt;<br />传输模式（S=流模式，B=块模式，C=压缩模式） </p>
		<p>MKD &lt;directory&gt;<br />在服务器上建立指定目录 </p>
		<p>NLST &lt;directory&gt;<br />列出指定目录内容 </p>
		<p>NOOP<br />无动作，除了来自服务器上的承认 </p>
		<p>PASS &lt;password&gt;<br />系统登录密码 </p>
		<p>PASV<br />请求服务器等待数据连接 </p>
		<p>PORT &lt;address&gt;<br />IP 地址和两字节的端口 ID </p>
		<p>PWD<br />显示当前工作目录 </p>
		<p>QUIT<br />从 FTP 服务器上退出登录 </p>
		<p>REIN<br />重新初始化登录状态连接 </p>
		<p>REST &lt;offset&gt;<br />由特定偏移量重启文件传递 </p>
		<p>RETR &lt;filename&gt;<br />从服务器上找回（复制）文件 </p>
		<p>RMD &lt;directory&gt;<br />在服务器上删除指定目录 </p>
		<p>RNFR &lt;old path&gt;<br />对旧路径重命名 </p>
		<p>RNTO &lt;new path&gt;<br />对新路径重命名 </p>
		<p>SITE &lt;params&gt;<br />由服务器提供的站点特殊参数 </p>
		<p>SMNT &lt;pathname&gt;<br />挂载指定文件结构 </p>
		<p>STAT &lt;directory&gt;<br />在当前程序或目录上返回信息 </p>
		<p>STOR &lt;filename&gt;<br />储存（复制）文件到服务器上 </p>
		<p>STOU &lt;filename&gt;<br />储存文件到服务器名称上 </p>
		<p>STRU &lt;type&gt;<br />数据结构（F=文件，R=记录，P=页面） </p>
		<p>SYST<br />返回服务器使用的操作系统 </p>
		<p>TYPE &lt;data type&gt;<br />数据类型（A=ASCII，E=EBCDIC，I=binary） </p>
		<p>USER &lt;username&gt;&gt;<br />系统登录的用户名 </p>
		<p>标准 FTP 信息如下： </p>
		<p>
				<strong>响应代码</strong>
				<br />
				<strong>解释说明</strong>
		</p>
		<p>110<br />新文件指示器上的重启标记 </p>
		<p>120<br />服务器准备就绪的时间（分钟数） </p>
		<p>125<br />打开数据连接，开始传输 </p>
		<p>150<br />打开连接 </p>
		<p>200<br />成功 </p>
		<p>202<br />命令没有执行 </p>
		<p>211<br />系统状态回复 </p>
		<p>212<br />目录状态回复 </p>
		<p>213<br />文件状态回复 </p>
		<p>214<br />帮助信息回复 </p>
		<p>215<br />系统类型回复 </p>
		<p>220<br />服务就绪 </p>
		<p>221<br />退出网络 </p>
		<p>225<br />打开数据连接 </p>
		<p>226<br />结束数据连接 </p>
		<p>227<br />进入被动模式（IP 地址、ID 端口） </p>
		<p>230<br />登录因特网 </p>
		<p>250<br />文件行为完成 </p>
		<p>257<br />路径名建立 </p>
		<p>331<br />要求密码 </p>
		<p>332<br />要求帐号 </p>
		<p>350<br />文件行为暂停 </p>
		<p>421<br />服务关闭 </p>
		<p>425<br />无法打开数据连接 </p>
		<p>426<br />结束连接 </p>
		<p>450<br />文件不可用 </p>
		<p>451<br />遇到本地错误 </p>
		<p>452<br />磁盘空间不足 </p>
		<p>500<br />无效命令 </p>
		<p>501<br />错误参数 </p>
		<p>502<br />命令没有执行 </p>
		<p>503<br />错误指令序列 </p>
		<p>504<br />无效命令参数 </p>
		<p>530<br />未登录网络 </p>
		<p>532<br />存储文件需要帐号 </p>
		<p>550<br />文件不可用 </p>
		<p>551<br />不知道的页类型 </p>
		<p>552<br />超过存储分配 </p>
		<p>553<br />文件名不允许 </p>
		<p>相关协议<br /><a href="http://www.networkdictionary.com/chinese/protocols/telnet.php">TELNET</a></p>
		<p>组织来源<br />FTP 由 IETF（<a href="http://www.ietf.org/">http://www.ietf.org/</a>）在 RFC 959 中，并由2228、2640 和 2773 重新更新。 </p>
		<p>相关链接<br /><a href="http://www.javvin.com/protocol/rfc959.pdf">http://www.javvin.com/protocol/rfc959.pdf</a> ：File Transfer Protocol（FTP） </p>
		<p>
				<strong>POP &amp; POP3：邮局协议(邮局协议第3版)</strong>
		</p>
		<p>
				<img height="20" alt="" src="http://www.networkdictionary.com/chinese/images/arrow.gif" width="20" />
				<br />POP &amp; POP3：邮局协议(邮局协议第3版) </p>
		<p>POP &amp; POP3：Post Office Protocol </p>
		<p>　　POP 协议允许工作站动态访问服务器上的邮件，目前已发展到第三版，称为 POP3 。 POP3 允许工作站检索邮件服务器上的邮件。 POP3 传输的是数据消息，这些消息可以是指令，也可以是应答。 </p>
		<p>　　创建一个分布式电子邮件系統有多种不同的技术支持和途径： POP （邮局协议）、 DMSP （分层式电子邮件系统协议）和 IMAP （因特网信息访问协议）。其中， POP 协议创建最早因此也最为人们了解； DMSP 具有较好的支持“无连接”操作的性能，但其很大程度上仅限于单个应用程序（PCMAIL ）； IMAP 提供了 POP 和 DMSP 的扩展集并提供对远程邮件访问的三种支持方式：离线、在线和无连接。   </p>
		<p>　　POP 协议支持“离线”邮件处理。其具体过程是：邮件发送到服务器上，电子邮件客户端调用邮件客户机程序以连接服务器，并下载所有未阅读的电子邮件。这种离线访问模式是一种存储转发服务，将邮件从邮件服务器端送到个人终端机器上，一般是 PC 机或 MAC 。一旦邮件发送到 PC 机或 MAC 上，邮件服务器上的邮件将会被删除。   </p>
		<p>　　POP3 并不支持对服务器上邮件进行扩展操作，此过程由更高级的 IMAP4 完成。 POP3 使用 TCP 作为传输协议。 </p>
		<p>
				<img height="20" alt="" src="http://www.networkdictionary.com/chinese/images/arrow.gif" width="20" />
				<br />协议结构 </p>
		<p>　　POP3 是发送在客户机和服务器间的 ASCII 信息。POP3 命令摘要： </p>
		<p>
				<strong>命令</strong>
				<br />
				<strong>描述</strong>
		</p>
		<p>USER<br />用户名 </p>
		<p>PASS<br />用户密码 </p>
		<p>STAT<br />服务器上的邮件信息 </p>
		<p>RETR<br />获取的信息数 </p>
		<p>DELE<br />删除的信息数 </p>
		<p>LIST<br />显示的信息数 </p>
		<p>TOP &lt;messageID&gt; &lt;nombredelignes&gt; <br />从头开始（包含协议头）打印X行信息 </p>
		<p>QUIT<br />退出POP3服务器 </p>
		<p>可选POP3命令： </p>
		<p>APOP name digest                             AUTHORIZATION 状态有效； </p>
		<p>TOP msg n                                    TRANSACTION 状态有效； </p>
		<p>UIDL [msg] </p>
		<p>POP3 Replies： </p>
		<p>  + OK </p>
		<p>  - ERR。 </p>
		<p>相关协议<br /><a href="http://www.networkdictionary.com/chinese/protocols/smtp.php">SMTP</a>、<a href="http://www.networkdictionary.com/chinese/protocols/imap.php">IMAP4</a>、<a href="http://www.networkdictionary.com/chinese/protocols/tcp.php">TCP</a>、<a href="http://www.networkdictionary.com/chinese/protocols/pop3.php">POP</a></p>
		<p>组织来源<br />POP3 由 IETF（<a href="http://www.ietf.org/">http://www.ietf.org/</a>定义在 RFC 1939中。 </p>
		<p>相关链接<br /><a href="http://www.javvin.com/protocol/rfc1939.pdf">http://www.javvin.com/protocol/rfc1939.pdf</a>：Post Office Protocol – Version 3 </p>
		<p>
				<strong>SMTP：简单邮件传输协议</strong>
		</p>
		<p>
				<img height="20" alt="" src="http://www.networkdictionary.com/chinese/images/arrow.gif" width="20" />
				<br />SMTP：简单邮件传输协议 </p>
		<p>（SMTP：Simple Mail Transfer Protocol） </p>
		<p>　　SMTP 是一种提供可靠且有效电子邮件传输的协议。 SMTP 是建模在 FTP 文件传输服务上的一种邮件服务，主要用于传输系统之间的邮件信息并提供来信有关的通知。 </p>
		<p>　　SMTP 独立于特定的传输子系统，且只需要可靠有序的数据流信道支持。 SMTP 重要特性之一是其能跨越网络传输邮件，即“ SMTP 邮件中继”。通常，一个网络可以由公用互联网上 TCP 可相互访问的主机、防火墙分隔的 TCP/IP 网络上 TCP 可相互访问的主机，及其它 LAN/WAN 中的主机利用非 TCP 传输层协议组成。使用 SMTP ，可实现相同网络上处理机之间的邮件传输，也可通过中继器或网关实现某处理机与其它网络之间的邮件传输。 </p>
		<p>　　在这种方式下，邮件的发送可能经过从发送端到接收端路径上的大量中间中继器或网关主机。域名服务系统（DNS）的邮件交换服务器可以用来识别出传输邮件的下一跳 IP 地址。 </p>
		<p>
				<img height="20" alt="" src="http://www.networkdictionary.com/chinese/images/arrow.gif" width="20" />
				<br />协议结构 </p>
		<p>　　SMTP 命令是发送于 SMTP 主机之间的 ASCII 信息，可能命令如下所示： </p>
		<p>
				<strong>命令</strong>
				<br />
				<strong>描述</strong>
		</p>
		<p>DATA<br />开始信息写作 </p>
		<p>EXPN &lt;string&gt;<br />在指定邮件表中返回名称 </p>
		<p>HELO &lt;domain&gt;<br />返回邮件服务器身份 </p>
		<p>HELP &lt;command&gt;<br />返回指定命令中的信息 </p>
		<p>MAIL FROM &lt;host&gt;<br />在主机上初始化一个邮件会话 </p>
		<p>NOOP<br />除服务器响应确认以外，没有引起任何反应 </p>
		<p>QUIT<br />终止邮件会话 </p>
		<p>RCPT TO &lt;user&gt;<br />指明谁收到邮件 </p>
		<p>RSET<br />重设邮件连接 </p>
		<p>SAML FROM &lt;host&gt;<br />发送邮件到用户终端和邮箱 </p>
		<p>SEND FROM &lt;host&gt;<br />发送邮件到用户终端 </p>
		<p>SOML FROM &lt;host&gt;<br />发送邮件到用户终端或邮箱 </p>
		<p>TURN<br />接收端和发送端交换角色 </p>
		<p>VRFY &lt;user&gt;<br />校验用户身份 </p>
		<p>相关协议<br /><a href="http://www.networkdictionary.com/chinese/protocols/pop3.php">POP3</a>、<a href="http://www.networkdictionary.com/chinese/protocols/imap.php">IMAP4</a>、<a href="http://www.networkdictionary.com/chinese/protocols/tcp.php">TCP</a>、<a href="http://www.networkdictionary.com/chinese/protocols/pop3.php">POP</a>、<a href="http://www.networkdictionary.com/chinese/protocols/ftp.php">FTP</a></p>
		<p>组织来源<br />SMTP 由 IETF（<a href="http://www.ietf.org/">http://www.ietf.org/</a>）定义在 RFC2821中。 </p>
		<p>相关链接<br /><a href="http://www.javvin.com/protocol/rfc2821.pdf">http://www.javvin.com/protocol/rfc2821.pdf</a>：Simple Mail Transfer Protocol</p>
<img src ="http://www.blogjava.net/wiser/aggbug/104402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiser/" target="_blank">英明</a> 2007-03-17 10:39 <a href="http://www.blogjava.net/wiser/archive/2007/03/17/104402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>