??xml version="1.0" encoding="utf-8" standalone="yes"?> Generic Connections
In the CLDC Generic Connection framework, all connections are created using
the
The
Here are a few examples:
HTTP Connection
Datagram Connection
Communicate with a Port
Open Files
In the setup state the following methods can be invoked:
For example, suppose you have this connection:
Then, you can set the request method to be of type
And likewise, you can set some of the HTTP properties. For example, you
can set the
If there is a method that requires data to be sent or received from the
server, there is a state transition from Setup to Connected.
Examples of methods that cause the transition include:
And while the connection is open, some of these methods that may
be invoked:
open
static method from the Connector
class. If
successful, this method returns an object that implements one of the generic
connection interfaces. Figure 1 shows how these interfaces form an is-a
hierarchy. The Connection
interface is the base interface such
that StreamConnectionNotifier
is a Connection
and
InputConnection
is a Connection
too.
Figure 1: Connection interface hierarchy
Connection
interface is the most basic connection type. It
can only be opened and closed.InputConnection
interface represents a device from which
data can be
read. Its openInputStream
method returns an input stream for the
connection.
OuputConnection
interface represents a device to which data
can be
written. Its openOutputStream
method returns an output stream for
the connection.
StreamConnection
interface combines the input and output
connections.
ContentConnection
is a subinterface of
StreamConnection
. It
provides access to some of the basic meta data information provided by HTTP
connections.
StreamConnectionNotified
waits for a connection to be
established.
It returns a StreamConnection
on which a communication link has ben
established.
DatagramConnection
represents a datagram endpoint.open
method of the Connector
class has the
following syntax, where the String
parameter has the format
"protocol:address;parameters"
.
The HttpConnection Interface:
The HTTP protocol is a request-response application protocol in which the
parameters of the request must be set before the request is sent. The connection
could be in one of the three following states:
setRequestMethod
setRequestProperty
Connector.open("http://java.sun.com/developer");POST
as follows:
User-Agent
as follows:
openOutputStream
openDataInputStream
openDataOutputStream
getLength
getType
getDate
getExpiration
getProtocol
getHost
getPort
------------------------------------------------------------
要注意的问题:
开发中遇到个很头疼的问? 与服务器通信write()数据时报java.io.IOException: Couldn't write to socket.
但是服务器抓不到M? 一开始怀疑是q徏立连接出的问? 实际上服务器抓不到包也有可能是流在没有close的时候就已经报错?
?
conn.open("url");
out = conn.openDataOutputStream();//此时进行与服务器的三次握手;
//但是如果在out.close()之前出现异常服务器是抓不CQ何包?br />
out.write(byte[] bb);
关于q个的解释应该是的~冲机制.
所以正的写法应该是捕捉到异常之后在catch块中把流close?strong>.
服务器端开发h员一般会说收不到包所以连接有问题,会把责Q推给客户?抓住q个证据在跟服务器端的同事扯皮时处于有利的位置,嘎嘎.
q有是要多做小实验, 注意代码要规范严?
发现的几个问?
1. java.io.IOException: Couldn't write to socket
2.
java.io.IOException: Couldn't read from socket
CMNET联网Ҏ:
CMWAP联网Ҏ:
Ud资费늚处理:
一个通用的HTTPq接装:
]]>
Chunked-Body = *chunk //0臛_个chunk
last-chunk //最后一个chunk
trailer //N
CRLF //l束标记W?br />
chunk = chunk-size [ chunk-extension ] CRLF
chunk-data CRLF
chunk-size = 1*HEX
last-chunk = 1*("0") [ chunk-extension ] CRLF
chunk-extension= *( ";" chunk-ext-name [ "=" chunk-ext-val ] )
chunk-ext-name = token
chunk-ext-val = token | quoted-string
chunk-data = chunk-size(OCTET)
trailer = *(entity-header CRLF)
解释Q?br />
Chunked-Body表示l过chunked~码后的报文体。报文体可以分ؓchunk,
last-chunkQtrailer和结束符四部分。chunk的数量在报文体中最可以ؓ0Q无上限Q每个chunk的长度是自指定的Q即Qv始的?
据必然是16q制数字的字W串Q代表后面chunk-data的长度(字节敎ͼ。这?6q制的字W串W一个字W如果是“0”Q则表示chunk-
size?Q该chunk为last-chunk,无chunk-data部分。可选的chunk-extension由通信双方自行定Q如果接收?
不理解它的意义,可以忽略?br />
trailer是附加的在尾部的额外头域Q通常包含一些元数据Qmetadata, meta means "about information"Q,q些头域可以在解码后附加在现有头域之后?br />
实例分析Q?br />
下面分析用ethereal抓包使用Firefox与某|站通信的结果(从头域结束符后开始)Q?br />
Address 0.......................... f
000c0 31
000d0 66 66 63 0d 0a ............... // ASCII?1ffc"r"n, chunk-data数据起始地址?00d5
很明显,“1ffc”为第一个chunk的chunk-size,转换为int?188.׃1ffc后马上就?br />
CRLF,因此没有chunk-extension.chunk-data的v始地址?00d5, 计算可知下一块chunk的v?br />
地址?00d5+1ffc + 2=020d3,如下Q?br />
020d0 .. 0d 0a 31 66 66 63 0d 0a .... // ASCII?"r"n1ffc"r"n
前一?d0a是上一个chunk的结束标记符Q后一?d0a则是chunk-size和chunk-data的分隔符?br />
此块chunk的长度同样ؓ8188, 依次cLQ直到最后一?br />
100e0 0d 0a 31
100f0 65 61 39 0d 0a...... //ASII码:"r"n"1ea9"r"n
此块长度?x1ea9 = 7849, 下一块v始ؓ100f5 + 1ea9 + 2 = 11fa0,如下Q?br />
100a0 30 0d 0a 0d 0a //ASCII码:0"r"n"r"n
“0”说明当前chunk为last-chunk, W一?d 0a为chunkl束W。第二个0d0a说明没有trailer部分Q整个Chunk-bodyl束?br />
解码程Q?br />
对chunked~码q行解码的目的是分块的chunk-data整合恢复成一块作为报文体Q同时记录此块体的长度?br />
RFC2616中附带的解码程如下Q?伪代码)
length := 0 //长度计数器置0
read chunk-size, chunk-extension (if any) and CRLF //dchunk-size, chunk-extension
//和CRLF
while(chunk-size > 0 ) { //表明不是last-chunk
read chunk-data and CRLF //读chunk-size大小的chunk-data,skip CRLF
append chunk-data to entity-body //此块chunk-dataq加到entity-body?br />
read chunk-size and CRLF //d新chunk的chunk-size ?CRLF
}
read entity-header //entity-header的格式ؓname:valueCRLF,如果为空卛_有CRLF
while Qentity-header not empty) //卻I不是只有CRLF的空?br />
{
append entity-header to existing header fields
read entity-header
}
Content-Length:=length //整个解码流E结束后计算得到的新报文体length
//作ؓContent-Length域的值写入报文中
Remove "chunked" from Transfer-Encoding //同时从Transfer-Encoding中域值去除chunkedq个标记
length最后的值实际ؓ所有chunk的chunk-size之和Q在上面的抓包实例中Q一共有八块chunk-size?x1ffc(8188)的chunk,剩下一块ؓ0x1ea9(7849),加v来一?3353字节?br />
注:对于上面例子中前几个chunk的大都?188,可能是因?"1ffc" 4字节Q?"r"n"2字节Q加上块一?"r"n"2字节一?字节Q因此一个chunk整体?196,正好可能是发送端一ơTCP发送的~存大小?
]]>
最q初涉网l编E,分析了下HTTP协议Q下面ؓW一关于HTTPq接控制斚w的学习日志,主要参考RFC2616Q肯定有疏漏之处Q还望指出?br />
HTTP协议是位于传输层之上的应用层协议Q其|络层基通常是TCP协议。TCP协议是面向连接和的Q因此连接的状态和控制对于HTTP协议而言相当重要。同ӞHTTP是基于报文的Q因此如何确定报文长度也是协议中比较重要的一炏V?br />
Persistent Connections持久q接
目的
在用持久连接前QHTTP协议规定取每个URL资源都需要用单独的一个TCPq接Q这增加了HTTP服务端的负蝲Q引起互联网拥塞。例如内嵌图片以及其他类似数据的使用要求一个客L在很短时间内向同一个服务端发v多个h?br />
使用持久q接的优?
减少TCPq接数量
在一个连接上实现HTTPh和应{的水Q即允许客户端发出多个请求,而不必在接收到前一h的应{后才发Z一hQ极大减时间消?br />
后箋h延迟减少Q无需再在TCP握手上耗时
可以更加优雅地实现HTTP协议Q由于持l连接的存在无需报告错误后无需关闭q接Q因此客L可用最新的协议Ҏ发求,如果接收到表C错误的应答Q则换用更旧的语义?br />
M描述
HTTP/1.1和之前版本的显著区别是HTTP/1.1默认使用持久q接。即Q除非服务端在应{中明确指出Q客L应当假定服务端会l持一个持久连接,即从服务端收到的应{是报告错误?br />
?
久连接对关闭TCPq接的行为提供信号量机制支持。这个信号量是在HTTP头中的Connection域设|,注意Client向Proxy发出h时该
域可能被Proxy-Connection域替换。一旦close信号被表明,客户端绝不能再通过该连接发送更多的h?br />
协商(Negotiation)
HTTP/1.1
服务端可以假定HTTP/1.1客户端会l持持久q接Q除非请求中Connection域的值是"close".同样的,如果服务端打在送出应答后立?
关闭q接Q它应当在应{中包含同样的Connection域?TCPq接关闭是双向的,此时TCPq入半关闭状?
同样的,HTTP/1.1客户端可以期望连接是持久的,除非如前所q收到表C接关闭的应答。当Ӟ也可以主动发Z个包含Connection:close的请求以表明l止q接?br />
无论客户端还是服务端发出的报文包含Connection:closeQ则该请求均接上的最后一个请?服务端发出此应答后关闭,因此不可能接收更多的h)
报文传输长度
Z证持久性,q接上的报文都必L一个自定义的报文传输长?否则必须通过q接的关闭表C报文结束,因ؓTCPq接是面向流?Q确定的规则按优先由高C排列如下Q?br />
报文传输长度指报文中出现的报文体的长?卻I不包括头长度Q因为报文头的结束可通过q箋两个CRLF定Q?br />
1.Ml不能包含报文体(?xx,204,304)的应{消息L以头域后的第一个空行结?无视头中所有的entitycd域的讄Q包括Content-Length域?br />
2.Transfer-Encoding域出玎ͼ其gؓ?identify"以外的其他|则用"chunked"传输~码方式定传输长度Q具体方式留待下分析?br />
3.Content-
Length域出玎ͼ且Transfer-Encoding域未出现(出现则忽略Content-Length?。Content-Length域的?
为十q制数的字节序,如Content-LengthQ?234Q则1???是分别作Z个octet传输的,因此需要atoi转换成数倹{?br />
4.如果报文使用?multipart/byteranges"的媒体类型,且没对传输长度做前面的指明,则这U自分割的媒体类型定义了传输长度。具体参见Range头域的说明?br />
5.服务端关闭连?此方法不可用于客L发出的请求报文,因ؓ客户端关闭连接则使得服务端无法发送应{?.
Z持和HTTP/1.0的兼Ҏ?
包含报文体的HTTP/1.1h必须包含合法的Content-Length头域,除非明确知道服务端是HTTP/1.1兼容?如果h包含消息?
而没有Content-Length?那么如果服务端无法确定消息长度时,它会q回400(无效h),或者坚持获取合法Content-Length
而返?11(要求包含长度).
所有接收实体的HTTP/1.1应用E序必须接受"chunked"传输~码, q样允许当报文长度无法预先确定时可以q用此机制获取报文长?
报文不能同时包含Content-Length头域和非"identity" Transfer-Encoding.如果出现? Content-Length域必被忽略.
当Content-Length域在允许报文体的报文中存在时, 其域值必M格等于消息体中的8比特字节.HTTP/1.1 user agent 必须在接收ƈ到一个错误的长度时提醒用?
以上Ҏ中,最常见的还是用Content-Length域表C报文体长度QTransfer-Encoding需要按格式解码才能q原出发送编码前的报文?br />
水
支持持久q接的客L可以水发送请求,服务端必L发送的序发送应{?br />
假定持久q接和连接后卛_水的客L应当做好在第一ơ流水失败后重新试此连接。在q样的尝试中Q在定q接是持久的之前Q客L不能再流水?br />
客户端同样必d备好在服务端送回所有相兛_{前关闭连接时重发h?br />
不应水non-idempotentҎ
Proxy Servers
对于代理服务端而言Q正实现Connection头域指定的属性尤为重要?br />
代理服务端必d立通告它的客户端和q接的原始服务端持久q接的属性,每个持久q接讄仅针对一个传输连接?br />
实践考量
时|服务端通常会ؓ每个q接l护一个定时器Q一旦某个连接不z跃过一定时间|服务端会关闭此连接。考虑C个客L可能通过代理服务端发出更多连接,代理服务端通常会将时D|得更高?br />
q有一些关于从异步关闭中恢复的讨论?br />
报文传输要求
使用TCP控制来解决服务端时负载过高问题,而不是简单的依赖客户端重q而关闭连接?br />
监视q接情况以获取错误状态消?br />
关于使用100(l箋)状态码
100状态码用于客户端发送请求体之前试是否可以发送该hQ对于ProxyQ有以下要求Q?br />
1.如果代理服务端接收到包含Expect头域gؓ"100-continue"的请? 而不明确知道下一x务不支持HTTP/1.1以上版本, 则它必须转发q个h, 包括Expect头域.
2.如果代理知道下一x务端为HTTP/1.0或者更低版? 则它不能转发此请? 且必M407应答客户?
3.如果明确知道发出h的客L版本为HTTP/1.0或者更低,则代理服务端l不能{?00应答,q条规则凌驾于{?xx应答的一般准?
Connection头域说明
BNF文法Q?br />
Connection = "Connection" ":" 1#(connection-token)
connection-token = token
Connection头域中的token用于指定对于特定q接有意义的选项Q因此proxy在{发前要扫描此域,从头中去除和token同名的域。例如Connection:Range,则要LRange域?br />
HTTP/1.1定义了closeq个tokenQ发送者用此token表示在完成这个报文所属请?应答的收发后q接关闭?br />
]]>
]]>
通常HTTP消息包括客户机向服务器的h消息和服务器向客h的响应消息。这两种cd的消息由一个v始行Q?
一个或者多个头域,一个只是头域结束的I和可
选的消息体组成?span style="color: #ff9658;">HTTP的头域包括通用_h_响应头和实体头四个部?/span>。每个头域由一个域名,冒号Q?Q和域g部分l成。域名是大小写无关的Q域
值前可以dM数量的空格符Q头域可以被扩展为多行,在每行开始处Q用至一个空格或制表W?
通用头域
通用?域包含请求和响应消息都支持的头域Q通用头域包含Cache-Control?
Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此?
展,如果存在不支持的通用头域Q一般将会作为实体头域处理。下面简单介l几个在UPnP消息中用的通用头域?
Cache-Control头域
Cache -Control指定h和响应遵循的~存机制。在h消息或响应消息中讄
Cache-Controlq不会修改另一个消息处理过E中的缓存处理过E。请求时的缓存指令包括no-cache、no-store、max-age?
max-stale、min-fresh、only-if-cachedQ响应消息中的指令包括public、private、no-cache、no-
store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如
下:
Public指示响应可被M~存区缓存?
Private指示对于单个用户的整个或部分响应消息Q不能被׃n~存处理。这允许服务器仅仅描q当用户的部分响应消息,此响应消息对于其他用Lh无效?
no-cache指示h或响应消息不能缓?
no-store用于防止重要的信息被无意的发布。在h消息中发送将使得h和响应消息都不用缓存?
max-age指示客户机可以接收生存期不大于指定时_以秒为单位)的响应?
min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应?
max-stale指示客户机可以接收超时期间的响应消息。如果指定max-stale消息的|那么客户机可以接收超时期指定g内的响应消息?
Date头域
Date头域表示消息发送的旉Q时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表CZ界标准时Q换成本地旉Q需要知道用h在的时区?
Pragma头域
Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache- Control:no-cache相同?
h消息
h消息的第一行ؓ下面的格式:
MethodSPRequest-URISPHTTP-VersionCRLFMethod
表示对于Request-URI完成的方法,q个字段是大写敏感的,包括OPTIONS、GET、HEAD、POST、PUT、DELETE?
TRACE。方法GET和HEAD应该被所有的通用WEB服务器支持,其他所有方法的实现是可选的。GETҎ取回由Request-URI标识的信息?
HEADҎ也是取回由Request-URI标识的信息,只是可以在响应时Q不q回消息体。POSTҎ可以h服务器接收包含在h中的实体信息Q可
以用于提交表单,向新ȝ、BBS、邮件群l和数据库发送消息?
SP表示I格。Request-URI遵@URI格式Q在此字D?
为星 P*Q时Q说明请求ƈ不用于某个特定的资源地址Q而是用于服务器本w。HTTP-
Version表示支持的HTTP版本Q例如ؓHTTP/1.1。CRLF表示换行回RW。请求头域允许客L向服务器传递关于请求或者关于客h的附?
信息。请求头域可能包含下列字DAccept、Accept-Charset、Accept-
Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If-
Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards?
Proxy-Authorization、Range、Referer、User-Agent。对h头域的扩展要求通讯双方都支持,如果存在不支持的?
求头域,一般将会作为实体头域处理?
典型的请求消息:
GET http://download.microtool.de:80/somedata.exe
Host: download.microtool.de
Accept:*/*
Pragma: no-cache
Cache-Control: no-cache
Referer: http://download.microtool.de/
User-Agent:Mozilla/4.04[en](Win95;I;Nav)
Range:bytes=554554-
上例W一行表CHTTP客户端(可能是浏览器、下载程序)通过GETҎ获得指定URL下的文g。棕色的部分表示h头域的信息,l色的部分表C通用头部分?
Host头域
Host头域指定h资源的IntenetL和端口号Q必表C求url的原始服务器或网关的位置。HTTP/1.1h必须包含L头域Q否则系l会?00状态码q回?
Referer头域
Referer
头域允许客户端指定请求uri的源资源地址Q这可以允许服务器生成回退链表Q可用来登陆、优化cache{。他也允许废除的或错误的q接׃l护的目的被
q踪。如果请求的uri没有自己的uri地址QReferer不能被发送。如果指定的是部分uri地址Q则此地址应该是一个相对地址?
Range头域
Range头域可以h实体的一个或者多个子范围。例如,
表示?00个字节:bytes=0-499
表示W二?00字节Qbytes=500-999
表示最?00个字节:bytes=-500
表示500字节以后的范_bytes=500-
W一个和最后一个字节:bytes=0-0,-1
同时指定几个范围Qbytes=500-600,601-999
但是服务器可以忽略此h_如果无条件GET包含Rangeh_响应会以状态码206QPartialContentQ返回而不是以200 QOKQ?
User-Agent头域
User-Agent头域的内容包含发求的用户信息?
响应消息
响应消息的第一行ؓ下面的格式:
HTTP-VersionSPStatus-CodeSPReason-PhraseCRLF
HTTP -Version表示支持的HTTP版本Q例如ؓHTTP/1.1。Status-
Code是一个三个数字的l果代码。Reason-PhraselStatus-Code提供一个简单的文本描述。Status-Code主要用于机器?
动识别,Reason-Phrase主要用于帮助用户理解。Status-Code的第一个数字定义响应的cdQ后两个数字没有分类的作用。第一个数字可
能取5个不同的|
1xx:信息响应c,表示接收到请求ƈ且l处?
2xx:处理成功响应c,表示动作被成功接收、理解和接受
3xx:重定向响应类Qؓ了完成指定的动作Q必L受进一步处?
4xx:客户端错误,客户h包含语法错误或者是不能正确执行
5xx:服务端错误,服务器不能正执行一个正的h
响应头域允许服务器传递不能放在状态行的附加信息,q些域主要描q服务器的信息和
Request-URIq一步的信息。响应头域包含Age、Location、Proxy-Authenticate、Public、Retry-
After、Server、Vary、Warning、WWW-Authenticate。对响应头域的扩展要求通讯双方都支持,如果存在不支持的响应?
域,一般将会作为实体头域处理?
典型的响应消息:
HTTP/1.0200OK
Date:Mon,31Dec200104:25:57GMT
Server:Apache/1.3.14(Unix)
Content-type:text/html
Last-modified:Tue,17Apr200106:46:28GMT
Etag:"a030f020ac7c01:1e9f"
Content-length:39725426
Content-range:bytes554554-40279979/40279980
上例W一行表CHTTP服务端响应一个GETҎ。棕色的部分表示响应头域的信息,l色的部分表C通用头部分,U色的部分表C实体头域的信息?
Location响应?/strong>
Location响应头用于重定向接收者到一个新URI地址?
Server响应?/strong>
Server响应头包含处理请求的原始服务器的软g信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序?
实体
h消息和响应消息都可以包含实体信息Q实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括Allow、Content-
Base、Content-Encoding、Content-Language?
Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type?
Etag、Expires、Last-Modified、extension-header。extension-header允许客户端定义新的实?
_但是q些域可能无法未接受方识别。实体可以是一个经q编码的字节,它的~码方式由Content-Encoding或Content-Type?
义,它的长度由Content-Length或Content-Range定义?
Content-Type实体?/strong>
Content-Type实体头用于向接收ҎC实体的介质cdQ指定HEADҎ送到接收方的实体介质cdQ或GETҎ发送的h介质cd Content-Range实体?
Content-Range实体头用于指定整个实体中的一部分的插入位|,他也指示了整个实体的长度。在服务器向客户q回一个部分响应,它必Lq响应覆盖的范围和整个实体长度。一般格式:
Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth
例如Q传送头500个字节次字段的Ş式:Content-Range:bytes0-
499/1234如果一个http消息包含此节Q例如,对范围请求的响应或对一pd范围的重叠请求)QContent-Range表示传送的范围Q?
Content-Length表示实际传送的字节数?
Last-modified实体?/strong>
应答? | 说明 |
Allow | 服务器支持哪些请求方法(如GET、POST{)?/td> |
Content-Encoding | ? 档的~码QEncodeQ方法。只有在解码之后才可以得到Content-Type头指定的内容cd。利用gzip压羃文档能够显著地减HTML文档? 下蝲旉。Java的GZIPOutputStream可以很方便地q行gzip压羃Q但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding_即request.getHeader("Accept- Encoding")Q检查浏览器是否支持gzipQؓ支持gzip的浏览器q回lgzip压羃的HTML面Qؓ其他览器返回普通页面?/td> |
Content-Length | ? C内定w度。只有当览器用持久HTTPq接时才需要这个数据。如果你惌利用持久q接的优势,可以把输出文档写? ByteArrayOutputStramQ完成后查看其大,然后把该值放入Content-Length_最后通过 byteArrayStream.writeTo(response.getOutputStream()发送内宏V?/td> |
Content-Type | 表示后面的文档属于什么MIMEcd。Servlet默认为text/plainQ但通常需要显式地指定为text/html。由于经常要讄Content-TypeQ因此HttpServletResponse提供了一个专用的ҎsetContentTyep? |
Date | 当前的GMT旉。你可以用setDateHeader来设|这个头以避免{换时间格式的ȝ? |
Expires | 应该在什么时候认为文档已l过期,从而不再缓存它Q?/td> |
Last-Modified | ? 档的最后改动时间。客户可以通过If-Modified-Sinceh头提供一个日期,该请求将被视Z个条件GETQ只有改动时间迟于指定时间的文档 才会q回Q否则返回一?04QNot ModifiedQ状态。Last-Modified也可用setDateHeaderҎ来设|?/td> |
Location | 表示客户应当到哪里去提取文档。Location通常不是直接讄的,而是通过HttpServletResponse的sendRedirectҎQ该Ҏ同时讄状态代码ؓ302? |
Refresh | 表示览器应该在多少旉之后h文档Q以U计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器d指定的页面? ? 意这U功能通常是通过讄HTML面HEAD区的QMETA HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path"Q实玎ͼq是因ؓQ自动刷新或重定向对于那些不能用CGI或Servlet? HTML~写者十分重要。但是,对于Servlet来说Q直接设|Refresh头更加方ѝ? 注意Refresh的意义是“NU之? h本页面或讉K指定面”Q而不?#8220;每隔NU刷新本面或访问指定页?#8221;。因此,q箋h要求每次都发送一个Refresh_而发?04状态代码则 可以L览器l刷斎ͼ不管是用Refresh头还是<META HTTP-EQUIV="Refresh" ...Q? 注意Refresh头不属于HTTP 1.1正式规范的一部分Q而是一个扩展,但Netscape和IE都支持它?/td> |
Server | 服务器名字。Servlet一般不讄q个|而是由Web服务器自p|?/td> |
Set-Cookie | 讄和页面关联的Cookie。Servlet不应使用response.setHeader("Set-Cookie", ...)Q而是应用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie讄的讨论?/td> |
WWW-Authenticate | ?
户应该在Authorization头中提供什么类型的授权信息Q在包含401QUnauthorizedQ状态行的应{中q个头是必需的。例如,
response.setHeader("WWW-Authenticate", "BASIC realm=Q?executivesQ?")? 注意Servlet一般不q行q方面的处理Q而是让Web服务器的专门机制来控制受密码保护面的访问(例如.htaccessQ?/td> |
RefererQ包含一个URLQ用户从该URL代表的页面出发访问当前请求的面?br /> User-AgentQ浏览器cdQ如果Servletq回的内容与览器类型有兛_该值非常有用?br /> UA-PixelsQUA-ColorQUA-OSQUA-CPUQ由某些版本的IE览器所发送的非标准的h_表示屏幕大小、颜色深度、操作系l和CPUcd?br /> 有关HTTP头完整、详l的说明Q请参见http://www.w3.org/Protocols/ 的HTTP规范?br />
java dҎ
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String headerName = (String)headerNames.nextElement();
out.println("<p>"+headerName+" "+request.getHeader(headerName)+"</p>");
}