??xml version="1.0" encoding="utf-8" standalone="yes"?>
本文详l介l反向代理服务的概念以及如何利用反向代理服务器提?span lang=EN-US>WEB服务器的性能和安全性?span lang=EN-US>
一Q反向代理的概念
什么是反向代理呢?其实Q反向代理也是通常所说的WEB服务器加速,它是一U通过在繁忙的WEB服务器和Internet之间增加一个高速的WEB~冲服务器(卻IWEB反向代理服务器)来降低实际的WEB服务器的负蝲。典型的l构如下图所C:
Web服务器加速(反向代理Q是针对Web服务器提供加速功能的。它作ؓ代理CacheQ但q不针对?览器用户Q而针对一台或多台特定Web服务器(q也是反向代理名U的由来Q。实施反向代理(如上图所C)Q只要将Reverse Proxy Cache讑֤攄在一台或多台Web服务器前端即可。当互联|用戯问某?span lang=EN-US>WEB服务器时Q通过DNS服务器解析后?span lang=EN-US>IP地址?span lang=EN-US>Reverse Proxy Server?span lang=EN-US>IP地址,而非原始Web服务器的IP地址,q时Reverse Proxy Server讑֤充当Web服务器,览器可以与它连接,无需再直接与Web服务器相q。因此,大量Web服务工作量被卸蝲到反向代理服务上。不但能够防 止外部网L直接?span lang=EN-US>web服务器直接通信带来的安全隐患,而且能够很大E度上减?span lang=EN-US>web服务器的负担Q提高访问速度?span lang=EN-US>
二. 反向代理和其它代理的比较
下面对几种典型的代理服务作一个简单的比较。在|络上常见的代理服务器有三种Q?span lang=EN-US>
1Q?标准的代理缓冲服务器
一个标准的代理~冲服务被用于缓存静态的|页Q例如:html文g和图片文件等Q到本地|络上的一CZQ即代理服务器)。当被缓存的面被第二次讉K的时候,览器将直接从本C理服务器那里获取h数据而不再向?span lang=EN-US>web站点h数据。这样就节省了宝늚|络带宽Q而且提高了访问速度。但是,要想实现q种方式Q必d每一个内部主机的览器上明确指明代理服务器的IP地址和端口号。客L上网Ӟ每次都把h送给代理服务器处理,代理服务器根据请求确定是否连接到q程web服务器获取数据。如果在本地~冲区有目标文gQ则直接文件传l用户即可。如果没有的话则先取回文Ӟ先在本地保存一份缓Ԍ然后文件发l客L览器?span lang=EN-US>
2Q?透明代理~冲服务?span lang=EN-US>
透明代理~冲服务和标准代理服务器的功能完全相同。但是,代理操作对客L的浏览器是透明的(即不需?明代理服务器?span lang=EN-US>IP和端口)。透明代理服务器阻断网l通信Qƈ且过滤出讉K外部?span lang=EN-US>HTTPQ?span lang=EN-US>80端口Q流量。如果客L的请求在本地有缓冲则缓冲的数据 直接发给用户Q如果在本地没有~冲则向q程web服务器发求,其余操作和标准的代理服务器完全相同。对?span lang=EN-US>Linux操作pȝ来说Q透明代理使用 Iptables或?span lang=EN-US>Ipchains实现。因Z需要对览器作M讄Q所以,透明代理对于ISPQ?span lang=EN-US>Internet服务器提供商Q特别有用?span lang=EN-US>
3Q?反向代理~冲服务?span lang=EN-US>
反向代理是和前两U代理完全不同的一U代理服务。用它可以降低原始WEB服务器的负蝲。反向代理服务器承担了对原始WEB服务器的静态页面的hQ防止原始服务器q蝲。它位于本地WEB服务器和Internet之间Q处理所有对WEB服务器的hQ阻??span lang=EN-US>WEB服务器和Internet的直接通信。如果互联网用户h的页面在代理服务器上有缓冲的话,代理服务器直接将~冲内容发送给用户。如果没有缓冲则先向WEB服务器发求,取回数据Q本地缓存后再发送给用户。这U方式通过降低了向WEB服务器的hC而降低了WEB服务器的负蝲?span lang=EN-US>
三.反向代理工作原理
反向代理服务器位于本?span lang=EN-US>WEB服务器和Internet之间,如下图所C:
当用h览器发出一?span lang=EN-US>HTTPhӞ通过域名解析请求定向到反向代理服务器(如果要实现多?span lang=EN-US>WEB 服务器的反向代理Q需要将多个WEB服务器的域名都指向反向代理服务器Q。由反向代理服务器处理器h。反向代理一般只~存可缓冲的数据Q比?span lang=EN-US>html|?和囄{)Q而一?span lang=EN-US>CGI脚本E序或?span lang=EN-US>ASP之类的程序不~存。它Ҏ?span lang=EN-US>WEB服务器返回的HTTP头标记来~冲静态页面。有四个最重要HTTP头标 讎ͼ
例如Q在默认情况下,ASP面q回” Cache-control: private.” Q所?span lang=EN-US>ASP面时不会在反向代理服务器缓存的
反向代理服务器(Reverse Proxy ServerQ一般被|于源服务器的前端,如图中所C。它配备有大定w的内存和高速磁盘,用于~存客户的请求,所以反向代理服务器又称为加速服务器?
?span lang=EN-US>:反向代理服务?span lang=EN-US>
对于客户送过来的hQ反向代理服务器的工作方式如下:
· 使用反向代理服务器后Q客L送过来的h会首先送到反向代理服务器?
· 反向代理服务器先查自q存的内容Q动态内Ҏ静态内容)?
· 如果客户h内容在缓存中Q则直接结果反馈给客户Q此ơ请求完成?
· 如果客户h内容不在~存中,它会Ҏ后面的各?span lang=EN-US>HTTP服务器(或内Ҏ务器Q的q行情况Q做负蝲均衡处理Q将hq一步送到某个http 服务器(或内Ҏ务器Q?
· 后端服务器作处理后,反馈l果l反向代理服务器?
· 对于后端服务器反馈过来的l果Q它会将l果~存Q动态内Ҏ静态内容)hQƈq一步送给客户端,此次h完成?
反向代理服务器通常要ؓ一个请求同时维护两个会话:与客L的会话和与后端服务器的对话。和普通的代理不同Q反向代理服务器一般只代理一台或者有限的几台服务器,对于客户而言Q反向代理服务器对于他们q当于源服务器Q对于源服务器而言Q反向代理服务器通常是唯一的客P因ؓ一般客户不和源服务器直接通信。典型情况下Q源服务器对于客h者客户对于源服务器,都是不可见的?span lang=EN-US>
反向代理服务器的作用
代理服务器v着客户Zl站的作用。它转发hq接收响应,q它成为高速缓存结果以侉K用的理想场所。这cM理服务器UCؓ高速缓存代理,它具有以下作用:
· 加快对客L响应旉Q减d端源服务器(卛_Ҏ务器Q负?
使用反向代理服务器后Q由于它h大容量缓存,可以~存多个静?span lang=EN-US>/动态页面,当有客户h送过来时Q如能够直接在缓存中扑ֈhl果Q就可以直接反馈l客P而不用再请求送给后端服务器。这样就加快了对客户的响应时_同时也减M后端源服务器的负载?span lang=EN-US>
· 保障后端源服务器Q即内容服务器)的安?
?span lang=EN-US>Internet上的客户端而言Q它只能接触到反向代理服务器Q因此反向代理服务器成为后端服务器的屏障,保障了后端服务器的安全?span lang=EN-US>
· 减少源服务器Q即内容服务器)节点之间占用的网l带?
使用反向代理服务器后Q它h的大定w~存可以减少源服务器的网l通讯量。这样就减少源服务器Q即内容服务器)节点之间占用的网l带宽?span lang=EN-US>
· Ҏ服务器进行负载均?span lang=EN-US>(Load Balance)?
当后端源服务器有多个Ӟ反向代理服务器可以根据后端各个服务器当前负蝲情况Q做负蝲均衡处理Q有选择的将当前h送给最I闲的后端服务器?/span>
是?span lang=EN-US>timeout旉内又有新的连接过来,同时max会自动减1Q直Cؓ0Q强制断?/span>。见下面的四个图Q注意看Date的|前后旉差都是在5U之内)Q?span lang=EN-US>
?/span>HTTP的角?/span>
1 客户?/span> ?/span>http Request Header上带?/span> Accept-Encoding:gzip,deflate
2服务器若是支?/span>gzip压羃则在http reponse eader
部分q回Content-Encoding: gzip 或?/span>Content-Type: application/x-gzip
3?/span>body部分?/span>gzip解压~?/span> 则得到网内?/span>.
传说?/span>ie?/span>bug 在处?/span>js css压羃的时候有bug,我不理解 挺简单的怎么会有bug?/span>.
?/span>gzip的角?/span>
gzip是一U数据格?/span> 默认且目前仅使用deflate法压羃data部分
zlib也是一U数据格?/span>,使用defalte法压羃数据部分.
deflate是一U压~算?/span>,?/span>huffman~码的一U加?/span>
zlib是一个开源库, 提供deflate压羃和对应的infalte解压~?/span>.
不过zlib默认?/span>deflate infalte默认是处?/span>zlib格式数据.必须使用
deflateInit2(&strm, DEFAULT_COMPRESSION,Z_DEFLATED, DEFAULT_WINDOWSIZE,DEFAULT_MEMLEVEL, Z_DEFAULT_STRATEGY);
初始化才是处?/span>raw deflate data.(q一点在zlib manul没有?/span>,?/span>faq中提?/span>,困扰了我好久,q是同事L帮我调试发现)
至于gzip格式解析 对着RFC写就可以?/span>.
参见RFC 1950 关于zlib http://www.faqs.org/rfcs/rfc1950.html
RFC 1951 关于deflate http://www.faqs.org/rfcs/rfc1951.html
RFC 1952 关于gzip http://www.faqs.org/rfcs/rfc1952.html
nt CGzip::Ungzip(const std::string & inStr , std::string &outStr){
static int nFileCount=0;
nFileCount++;
string strZipFileName="test";
// CConvert::StrToFile(inStr,strZipFileName+CConvert::toString<int>(nFileCount)+"H.gzip";
if(inStr.length()<11){
return -1;
}
//process gzip header
unsigned int skipCt = 10;
unsigned int skipZeroCt = 0;
unsigned char ID1 = inStr[0];
unsigned char ID2 = inStr[1];
unsigned char XFL=inStr[8];
bool bFEXTRA = false ;
bool bFNAME = false ;
bool bFCOMMENT = false ;
bool bFHCRC = false ;
unsigned int XLEN = 0;
if( (ID1!=31) && (ID2!=139)){
return -1; //?/span>gzip头部
}
unsigned char CM = inStr[2];
if(CM!={
return -1; //现在都只处理 deflate压羃?/span>
}
unsigned char FLG = inStr[3];
if( (FLG & GZIP_HEAD_FEXTRA) != 0){
bFEXTRA = true ;
skipCt += 2;
XLEN = inStr[10]+ inStr[11]*256 ;//按照端字节序列处理
skipCt += XLEN;
}
if( (FLG & GZIP_HEAD_FNAME) != 0){
bFNAME = true;
skipZeroCt++;
}
if( (FLG & GZIP_HEAD_FCOMMENT) != 0){
bFCOMMENT = true;
skipZeroCt++;
}
size_t passedZeroCt = 0;
size_t iStep = skipCt ;
for( size_t iStep = skipCt ; iStep<inStr.length(); iStep++){
if(passedZeroCt>=skipZeroCt){
break;
}
if(inStr[iStep]==''{
passedZeroCt++;
}
}
skipCt = iStep ;
if( (FLG & GZIP_HEAD_FHCRC) != 0){
bFHCRC = true;
skipCt+=2 ;
}
string coreStr = inStr.substr(skipCt,inStr.length()-8-skipCt);
return CGzip::Inflate(coreStr,outStr);
}
int CGzip:ogzip(const std::string & inStr , std::string &outStr){
char pAddHead[10];
unsigned long crc = 0;
// gzip header
static const char deflate_magic[2] = {'37', '\213'};
snprintf(pAddHead, 10,
"%c%c%c%c%c%c%c%c%c%c", deflate_magic[0],
deflate_magic[1], Z_DEFLATED, 0 /* flags */,
0, 0, 0, 0 /* 4 chars for mtime */,
0 /* xflags */, 0xff);
string addHead(pAddHead,10);
//gzip's raw deflate body
if(CGzip:eflate(inStr,outStr)<0){
return - 1;
}
//gzip trailer
crc = crc32(crc, (const Bytef*)inStr.data(), inStr.length());
char tailBuf[8];
memcpy(tailBuf, &crc, 4);
int isize=inStr.size();
memcpy(tailBuf,&isize,4);
string tailStr(tailBuf , 8 );
outStr = addHead + outStr+tailStr; //
return outStr.length(); //
消息Q?span lang=EN-US>HTTP协议中顶U数据单位,使用HTTP协议通信的机器之间来回发送的数据?span lang=EN-US>
实体Q只出现在有消息体的消息中。它按照实体header定义的格式和~码q行传输?span lang=EN-US>
ҎQ?span lang=EN-US>
OPTIONS Q客L查询服务器对与某URL允许的通信选项
GET Q从服务器获?span lang=EN-US>URL对应的资?span lang=EN-US>
HEAD Q除了服务器响应中不能包含消息体Q该Ҏ?span lang=EN-US>GET一栗用于只需数元信息的情况
POST Q被设计用来注解、修?span lang=EN-US>URL所对应的资?span lang=EN-US>
PUT Q被设计用来修改或创源。当URL对应的资源存在时Q则提交的作为新版本Q否则新?span lang=EN-US>
DELETE Q被设计用来删除URL对应的资?span lang=EN-US>
TRACE Q主要用来测试。服务器最l接收到的请求本w发送回来,作ؓ客户端诊断依?span lang=EN-US>
CONNECT Q保留的Ҏ名,用于代理切换隧道
headerҎ参数Q?span lang=EN-US>
q Q在大多的各U?span lang=EN-US>headergQ都可以看到一个名?span lang=EN-US>q=0.2?span lang=EN-US>q=0.7之类的参数。因为发?span lang=EN-US>header主要是一个和服务器的协商q程Q所以能允许的选项一般不只一个,但具体哪个优先呢Q这需要ؓ一些选项制定权重倹{?span lang=EN-US>q参数的值是一个从0?span lang=EN-US>1的QҎQ默认是1Qؓ0表示客户端无法接Ӟ数点后 不能过3位。另外,header的多个g间用逗号分隔而不是分受比如这?span lang=EN-US>headerQ?span lang=EN-US>Accept:audio/*;q=0.2,audio /basicQ这表示客户端告诉服务器“我最喜欢的是一?span lang=EN-US>audio/basiccd的音?span lang=EN-US>(因ؓ它没有设|?span lang=EN-US>q参数Q默认是1Q,但如果没有,l我一个Q 意类?span lang=EN-US>(audio/*)的音频也?#8221;。当Ӟq只?span lang=EN-US>q参数一个比较简单的应用?span lang=EN-US>
常规header Q?span lang=EN-US>
Cache-Control Q用于指?span lang=EN-US>/响应链上所有缓存必L从的指oQ它必须hIK各代理和网关的能力?span lang=EN-US>HTTP1.0可能不支持该header?span lang=EN-US>PragmaQ?span lang=EN-US>no-cache?span lang=EN-US>
Connection Q允许客L指出希望特定q接的选项Q且止׃理在来的连接中通讯
Date Q表C消息发生的日期和时_?span lang=EN-US>RFC 822中的orig-date语义一?
Pragma Q用来包括实现特定的指oQ可能应用到h/响应链上所有接收方
Trailer Q指出给出的头部域集合在?span lang=EN-US>chunked transfer-coding~码的消息的N中存?span lang=EN-US>
Transfer-Encoding Q指出应用什么类型的转换到消息主体上Q与content-coding不同Q这不是指定实体的属性而是消息?span lang=EN-US>
Upgrade Q允许客L指出其支持的其他通讯协议Q切愿意使用之,若服务器发现切换是可行的Q必d响应中回101
Via Q必ȝ|关或代理来指出h中的UA和服务器、以及在响应中的原始服务器和客户端的中间协议和接收方。用于跟t消息{发,避免h循环
Warning Q用h带关于消息的状态和转换的额外信息,可能不在消息中反映。一般用于警告应用到消息实体上的~存操作或{换缺语义透明?span lang=EN-US>
hheaderQ?span lang=EN-US>
Accept Q客L指出响应可以接受的媒体类?span lang=EN-US>
Accept-Charset Q客L指出响应可以接受的字W集
Accept-Encoding Q客L指出响应可以接受的字W编?span lang=EN-US>
Accept-Language Q客L指出允许的语a
Authorization Q客L在受?span lang=EN-US>401后,需要向服务器标明n份,包括?span lang=EN-US>header卛_
Expect : 客户端指求的Ҏ服务器行为。若服务器无法满I可以q回417
From :
Host : 客户端指h的资源的因特|主机和端口?span lang=EN-US>
If-Match : 用于与方法一起其条件化
If-Modified-Since : 用于Ҏ使其条g化,如果h的变量在本域指定的时间从来不曾修改过Q则实体不会从服务器返回,改ؓ304
If-None-Match : 用于与方法一起其条件化
If-Range : 用于与方法一起其条件化
If-Unmodified-Since : 用于与方法一起其条件化Q如果请求的资源?span lang=EN-US>header值时间以来未改变Q则服务器执行该h
Max-Forwards : 提供某种机制Q?span lang=EN-US>TRACE?span lang=EN-US>OPTIONSҎ用来限制可以转发l下个入界服务器代理或网关的数量Q相当于客户端跟t请求链
Proxy-Authorization : 允许客户端向代理标识自己Q该代理需要认?span lang=EN-US>
Range : 字节范围Q可以指定单个实体中单个字节范围或范围集
Referer : 允许服务器ؓ感兴的资源、日志、优化缓存等生成向后链接清单
TE : 指出愿意在响应中接受M扩展?span lang=EN-US>transfer-coding
User-Agent : 包含发vh的用户代理(览器和OSQ的信息
响应headerQ?span lang=EN-US>
Accept-Ranges Q服务器指出对请求的资源可接受的范围Q可以是字节数或none
Age Q?span lang=EN-US>HTTP使用?span lang=EN-US>header来传输从~存服务器获取时的响应消息的估计q龄Q是~存服务器估计从响应产生或被原始服务器重新证实以来的L?span lang=EN-US>
ETag Q提供所h的实体标{当前?span lang=EN-US>
Location Q用来重定向接收
方到?span lang=EN-US>URI的位|来完成h。对?span lang=EN-US>201Q?span lang=EN-US>Location是由h创徏的新资源的标?span lang=EN-US>
Proxy-Authenticate Q该header必须作ؓ407响应的一部分Q指证方案和可应用到代理?span lang=EN-US>URI上的参数
Retry-After Q能?span lang=EN-US>503响应一L于指出希望该服务对客L可以l持多久Q?span lang=EN-US>
Server Q指出服务器使用的Y件信?span lang=EN-US>
Vary Q?span lang=EN-US>
WWW-Authenticate Q必d括在401中,D有challengel成Q它指出认证Ҏ和可应用?span lang=EN-US>URI的参?span lang=EN-US>
实体headerQ?span lang=EN-US>
Allow Q客L指出?span lang=EN-US>URI的资源允许的Ҏ
Content-Encoding : 用作?span lang=EN-US>media-type的修饰符Q其值将必须应用到实?span lang=EN-US>body上的额外内容~码。主要用来允许压~而不丢失下层媒体cd标识
Content-Language : 客户端指己所选的语言Q指出目标观众对所装实体的自然语a。这可能与实?span lang=EN-US>body内所有语a相同
Content-Length Q指出实?span lang=EN-US>body按十q制数的字节的寸
Content-Location Q如果实体能从独立于hURI的位|访问,则服务器可以提供该实体自q位置
Content-MD5 Q是实体body?span lang=EN-US>MD5摘要Q以便提供端到端的完整性检?span lang=EN-US>
Content-Range Q与实体body的一部分一起发送,用来指定该部?span lang=EN-US>body应用到全?span lang=EN-US>body的哪个地?span lang=EN-US>
Content-Type Q指出发送给接收方的实体body的媒体类型,媒体cd参见IANA
Expires Q指出响应被认ؓq期的日?span lang=EN-US>/旉
Last-Modified Q指出原始服务器认ؓ该变量最后修改的日期和时_实意思取决于原是服务器的实现和资源的属性。对文gQ可能只是文件系l内最后修Ҏ?
extension-header Q?span lang=EN-US>
状态码Q?span lang=EN-US>
100 : Continue
101 : Switching Protocols
200 : OK
201 : Created
202 : Accepted
203 : Non-Authoritative Information
204 : No Content
205 : Reset Content
206 : Partial Content
300 : Multiple Choices
301 : Moved Permanently
302 : Found
303 : See Other
304 : Not Modified
305 : Use Proxy
307 : Temporary Redirect
400 : Bad Request
401 : Unauthorized
402 : Payment Required
403 : Forbidden
404 : Not Found
405 : Method Not Allowed
406 : Not Acceptable
407 : Proxy Authentication Required
408 : Request Time-out
409 : Conflict
410 : Gone
411 : Length Required
412 : Precondition Failed
413 : Request Entity Too Large
414 : Request-URI Too Large
415 : Unsupported Media Type
416 : Requested range not satisfiable
417 : Expectation Failed
500 : Internal Server Error
501 : Not Implemented
502 : Bad Gateway
503 : Service Unavailable
504 : Gateway Time-out
505 : HTTP Version not supported
extension-code
关键字:HTTP
对应URL:D:\New HY Code\HY Web Server\Debug\hy web root\Henyep\UploadFile
<form action="/UploadFile" method="post" enctype="multipart/form-data" onSubmit="return validate()">对应URL:D:\UploadFile
HTTP消息由客L到服务器的请求和服务器到客户端的响应l成。请求消息和响应消息都是由开始行Q对于请求消息,开始行是h行,对于响应消息Q开始行是状态行Q,消息报头Q可选)Q空行(只有CRLF的行Q,消息正文Q可选)l成?
HTTP消息报头包括普通报头、请求报头、响应报头、实体报头?br>每一个报头域都是由名?“Q?#8221;+I格+?l成Q消息报头域的名字是大小写无关的?
1、普通报?br>在普通报头中Q有数报头域用于所有的h和响应消息,但ƈ不用于被传输的实体,只用于传输的消息?br>egQ?br>Cache-Control 用于指定~存指oQ缓存指令是单向的(响应中出现的~存指o在请求中未必会出玎ͼQ且是独立的Q一个消息的~存指o不会影响另一个消息处理的~存机制Q,HTTP1.0使用的类似的报头域ؓPragma?br>h时的~存指o包括Qno-cacheQ用于指C求或响应消息不能~存Q、no-store、max-age、max-stale、min-fresh、only-if-cached;
响应时的~存指o包括Qpublic、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.
egQؓ了指CIE览器(客户端)不要~存面Q服务器端的JSPE序可以~写如下Qresponse.sehHeader("Cache-Control","no-cache");
//response.setHeader("Pragma","no-cache");作用相当于上qC码,通常两?/合用
q句代码在发送的响应消息中设|普通报头域QCache-Control:no-cache
Date普通报头域表示消息产生的日期和旉
Connection普通报头域允许发送指定连接的选项。例如指定连接是q箋Q或者指?#8220;close”选项Q通知服务器,在响应完成后Q关闭连?
2、请求报?br>h报头允许客户端向服务器端传递请求的附加信息以及客户端自w的信息?br>常用的请求报?br>Accept
Accepth报头域用于指定客L接受哪些cd的信息。egQAcceptQimage/gifQ表明客L希望接受GIF图象格式的资源;AcceptQtext/htmlQ表明客L希望接受html文本?br>Accept-Charset
Accept-Charseth报头域用于指定客L接受的字W集。egQAccept-Charset:iso-8859-1,gb2312.如果在请求消息中没有讄q个域,~省是Q何字W集都可以接受?br>Accept-Encoding
Accept-Encodingh报头域类gAcceptQ但是它是用于指定可接受的内容编码。egQAccept-Encoding:gzip.deflate.如果h消息中没有设|这个域服务器假定客L对各U内容编码都可以接受?br>Accept-Language
Accept-Languageh报头域类gAcceptQ但是它是用于指定一U自然语a。egQAccept-Language:zh-cn.如果h消息中没有设|这个报头域Q服务器假定客户端对各种语言都可以接受?br>Authorization
Authorizationh报头域主要用于证明客L有权查看某个资源。当览器访问一个页面时Q如果收到服务器的响应代码ؓ401Q未授权Q,可以发送一个包含Authorizationh报头域的hQ要求服务器对其q行验证?br>HostQ发送请求时Q该报头域是必需的)
Hosth报头域主要用于指定被h资源的InternetL和端口号Q它通常从HTTP URL中提取出来的QegQ?br>我们在浏览器中输入:http://www.guet.edu.cn/index.html
览器发送的h消息中,׃包含Hosth报头域,如下Q?br>HostQwww.guet.edu.cn
此处使用~省端口?0Q若指定了端口号Q则变成QHostQwww.guet.edu.cn:指定端口?br>User-Agent
我们上网登陆论坛的时候,往往会看C些欢q信息,其中列出了你的操作系l的名称和版本,你所使用的浏览器的名U和版本Q这往往让很多h感到很神奇,实际上,服务器应用程序就是从User-Agentq个h报头域中获取到这些信息。User-Agenth报头域允许客L它的操作系l、浏览器和其它属性告诉服务器。不q,q个报头域不是必需的,如果我们自己~写一个浏览器Q不使用User-Agenth报头域,那么服务器端无法得知我们的信息了?br>h报头举例Q?br>GET /form.html HTTP/1.1 (CRLF)
Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)
Accept-Language:zh-cn (CRLF)
Accept-Encoding:gzip,deflate (CRLF)
If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)
If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)
User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)
Host:www.guet.edu.cn (CRLF)
Connection:Keep-Alive (CRLF)
(CRLF)
3、响应报?br>响应报头允许服务器传递不能放在状态行中的附加响应信息Q以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息?br>常用的响应报?br>Location
Location响应报头域用于重定向接受者到一个新的位|。Location响应报头域常用在更换域名的时候?br>Server
Server响应报头域包含了服务器用来处理请求的软g信息。与User-Agenth报头域是相对应的。下面是
Server响应报头域的一个例子:
ServerQApache-Coyote/1.1
WWW-Authenticate
WWW-Authenticate响应报头域必被包含?01Q未授权的)响应消息中,客户端收?01响应消息时候,q发送Authorization报头域请求服务器对其q行验证Ӟ服务端响应报头就包含该报头域?br>egQWWW-Authenticate:Basic realm="Basic Auth Test!" //可以看出服务器对h资源采用的是基本验证机制?br>Content-Disposition是当用h把请求所得的内容存ؓ一个文件的时候提供一个默认的文g名。具体的定义如下 Content-Disposition: attachment; filename=“filename.xls”
当然filename参数可以包含路径信息Q但User-Agnet会忽略掉q些信息Q只会把路径信息的最后一部分做ؓ文g名。当你在响应cd为application/octet- stream情况下用了q个头信息的话,那就意味着你不想直接显C内容,而是弹出一?#8221;文g下蝲”的对话框Q接下来是׃来决?#8220;打开”q是“保存”了?
4、实体报?br>h和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文l成Q但q不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文QegQ有无实体正文)和请求所标识的资源的元信息?br>常用的实体报?br>Content-Encoding
Content -Encoding实体报头域被用作媒体cd的修饰符Q它的值指CZ已经被应用到实体正文的附加内容的~码Q因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encodingq样用于记录文档的压~方法,egQContent-EncodingQ?gzip
Content-Language
Content-Language实体报头域描qC资源所用的自然语言。没有设|该域则认ؓ实体内容提供给所有的语言阅读
者。egQContent-Language:da
Content-Length
Content-Length实体报头域用于指明实体正文的长度Q以字节方式存储的十q制数字来表C?br>Content-Type
Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。egQ?br>Content-Type:text/html;charset=ISO-8859-1
Content-Type:text/html;charset=GB2312
Last-Modified
Last-Modified实体报头域用于指C源的最后修Ҏ期和旉?br>Expires
Expires 实体报头域给出响应过期的日期和时间。ؓ了让代理服务器或览器在一D|间以后更新缓存中(再次讉K曾访问过的页面时Q直接从~存中加载,~短响应旉和降低服务器负蝲)的页面,我们可以使用Expires实体报头域指定页面过期的旉。egQExpiresQThuQ?5 Sep 2006 16:23:12 GMT
HTTP1.1的客L和缓存必d其他非法的日期格式(包括0Q看作已l过期。egQؓ了让览器不要缓存页面,我们也可以利用Expires实体报头域,讄?Qjsp中程序如下:response.setDateHeader("Expires","0");
但凡搞WEB开发的人都M开HTTPQ超文本传输协议Q,而要了解HTTPQ除了HTML本n以外Q还有一部分不可忽视的就是HTTP消息头?br>做过Socket~程的h都知道,当我们设计一个通信协议Ӟ“消息?消息?#8221;的分割方式是很常用的Q消息头告诉Ҏq个消息是干什么的Q消息体告诉Ҏ怎么qӀHTTP传输的消息也是这栯定的Q每一个HTTP包都分ؓHTTP头和HTTP体两部分Q后者是可选的Q而前者是必须的。每当我们打开一个网,在上面点d键,选择“查看源文?#8221;Q这时看到的HTML代码是HTTP的消息体Q那么消息头又在哪呢QIE览器不让我们看到这部分Q但我们可以 通过截取数据包等Ҏ看到它?br>下面来看一个简单的例子Q?br>首先制作一个非常简单的|页Q它的内容只有一行:
<html><body>hello world</body></html>
把它攑ֈWEB服务器上Q比如IISQ然后用IE览器请求这个页面(http://localhost:8080/simple.htmQ,当我们请求这个页面时Q浏览器实际做了以下四项工作Q?br>1 解析我们输入的地址Q从中分解出协议名、主机名、端口、对象\径等部分Q对于我们的q个地址Q解析得到的l果如下Q?br>协议名:http
L名:localhost
端口Q?080
对象路径Q?simple.htm
2 把以上部分结合本q信息Q封装成一个HTTPh数据?br>3 使用TCP协议q接C机的指定端口Qlocalhost, 8080Q,q发送已装好的数据?br>4 {待服务器返回数据,q解析返回数据,最后显C出?br>由截取到的数据包我们不难发现览器生成的HTTP数据包的内容如下Q?br>GET /simple.htm HTTP/1.1<CR>
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*<CR>
Accept-Language: zh-cn<CR>
Accept-Encoding: gzip, deflate<CR>
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)<CR>
Host: localhost:8080<CR>
Connection: Keep-Alive<CR>
<CR>
Z昄清楚我把所有的回R的地斚w加上?#8220;<CR>”Q注意最后还有一个空行加一个回车,q个I正是HTTP规定的消息头和消息体的分界线Q第一个空行以下的内容是消息体,q个h数据包是没有消息体的?br>消息的第一?#8220;GET”表示我们所使用的HTTP动作Q其他可能的q有“POST”{,GET的消息没有消息体Q而POST消息是有消息体的Q消息体的内容就是要POST的数据。后?simple.htm是我们要请求的对象Q之?a name=baidusnap0>HTTP1.1表示使用的是HTTP1.1协议?br>W二行表C我们所用的览器能接受的Content-typeQ三四两行则是语a和编码信息,W五行显C出本机的相关系信息Q包括浏览器cd、操作系l信息等Q很多网站可以显C出你所使用的浏览器和操作系l版本,是因ؓ可以从这里获取到q些信息?br>W六行表C我们所h的主机和端口Q第七行表示使用Keep-Alive方式Q即数据传递完q不立即关闭q接?br>服务器接收到q样的数据包以后会根据其内容做相应的处理Q例如查找有没有“/simple.htm”q个对象Q如果有Q根据服务器的设|来军_如何处理Q如果是HTMQ则不需要什么复杂的处理Q直接返回其内容卛_。但在直接返回之前,q需要加上HTTP消息头?br>服务器发回的完整HTTP消息如下Q?br>HTTP/1.1 200 OK<CR>
Server: Microsoft-IIS/5.1<CR>
X-Powered-By: ASP.NET<CR>
Date: Fri, 03 Mar 2006 06:34:03 GMT<CR>
Content-Type: text/html<CR>
Accept-Ranges: bytes<CR>
Last-Modified: Fri, 03 Mar 2006 06:33:18 GMT<CR>
ETag: "5ca4f75b8c3ec61:9ee"<CR>
Content-Length: 37<CR>
<CR>
<html><body>hello world</body></html>
同样Q我?#8220;<CR>”来表C回车。可以看刎ͼq个消息也是用空行切分成消息头和消息体两部分Q消息体的部分正是我们前面写好的HTML代码?br>消息头第一?#8220;HTTP/1.1”也是表示所使用的协议,后面?#8220;200 OK”是HTTPq回代码Q?00pC操作成功,q有其他常见的如404表示对象未找刎ͼ500表示服务器错误,403表示不能览目录{等?br>W二行表C个服务器使用的WEB服务器YӞq里是IIS 5.1。第三行是ASP.Net的一个附加提C,没什么实际用处。第四行是处理此h的时间。第五行是所q回的消息的content-typeQ浏览器 会根据它来决定如何处理消息体里面的内容,例如q里是text/htmlQ那么浏览器׃启用HTML解析器来处理它,如果是image/jpegQ那?׃使用JPEG的解码器来处理?br>消息头最后一?#8220;Content-Length”表示消息体的长度Q从I以后的内容算P以字节ؓ单位Q浏览器接收到它所指定的字节数的内容以后就会认个消息已l被完整接收了?
理解HTTP消息?Q二Q?/strong>
常见的HTTPq回?/strong>
上一文章里我简要的说了说HTTP消息头的格式Q注意到在服务器q回的HTTP消息头里有一?#8220;HTTP/1.1 200 OK”Q这里的200是HTTP规定的返回代码,表示h已经被正常处理完成。浏览器通过q个q回代码可以知道服务器Ҏ发请求的处理情况是什么,每一U返回代码都有自q含义。这里列丑ևU常见的q回码?
1 403 Access Forbidden
如果我们试图h服务器上一个文件夹Q而在WEB服务器上q个文g夹ƈ没有允许对这个文件夹列目录的话,׃q回q个代码。一个完整的403回复可能是这LQ(IIS5.1Q?br>HTTP/1.1 403 Access Forbidden <html><head><title>Directory Listing Denied</title></head> 2 404 Object not found
当我们请求的对象在服务器上ƈ不存在时Q就会给个返回代码,q可能也是最常见的错误代码了。IISl出?04消息内容很长Q除了消息头以外q有一个完整的说明“Z么会q样”的网cAPACHE服务器的404消息比较短,如下Q?br>HTTP/1.1 404 Not Found <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 也许你会问,无论?04q是200Q都会在消息体内l出一个说明网,那么对于客户端来说二者有什么区别呢Q一个比较明昄区别在于200?成功hQ浏览器会记录下q个地址Q以便下ơ再讉K时可以自动提C地址Q?04是失败请求,览器只会显C出q回的页面内容,q不会记录此地址Q要再次讉K时还需要输入完整的地址?
3 401 Access Denied
当WEB服务器不允许匿名讉KQ而我们又没有提供正确的用户名/密码Ӟ服务器就会给个返回代码。在IIS中,讄IIS的安全属性ؓ不允许匿名访问(如下图)Q此时直接访问的话就会得C下返回结果:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> 因返回信息中消息体较长,只取前面两行内容。注意,如果是用localhost来访问本机的IISQ因IE可以直接取得当前用户的n份,它会和服务器间直接进行协商,所以不会看?01提示?br>当我们在输入了用户名和密码以后,服务器与客户端会再进行两ơ对话。首先客L向服务器索取一个公钥,服务器端会返回一个公钥,二者都用BASE64~码Q相应的消息如下Q编码部分已l做了处理)Q?
GET / HTTP/1.1 HTTP/1.1 401 Access Denied <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> q样Q如果验证通过Q服务器端就会把h的内容发送过来了Q也是说禁止匿名访问的|站会经q三ơ请求才可以看到面。但因ؓ客户端浏览器已经~存了公钥,用同一个浏览器H口再次hq个|站上的其它面时就可以直接发送验证信息,从而一ơ交互就可以完成了?
4 302 Object Moved
用过ASP的h都知道ASP中页面重定向臛_有Redirect和Transfer两种Ҏ。二的区别在于Redirect是客L重定向,而Transfer是服务器端重定向Q那么它们具体是如何通过HTTP消息头实现的呢? 注意h的文件确实是1.aspQ而得到的回应则是Q?br>HTTP/1.1 200 OK <p>this is 1.htm</p> <head><title>Object moved</title></head> 注意HTTP的返回代码由200变成?02Q表C是一个重定向消息Q客L需要根据消息头中Location字段的值重新发送请求,于是有了下面一l对话: HTTP/1.1 200 OK <p>this is 1.htm</p> 5 500 Internal Server Error
500号错误发生在服务器程序有错误的时候,例如QASPE序?br><% if %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html dir=ltr> 服务器发送了500号错误,q且后面通过HTML的方式说明了错误的原因?
理解HTTP消息?Q三Q?/strong>
Q三Q?客户端发送的内容 1 HTTP_REFERER 而以下Ş式不会发送HTTP_REFERERQ?br>script转向Q?lt;script>location.href="b.asp"</script> 2 COOKIE 3 SESSION 4 POST text1=haha -----------------------------7d62bf2f9066c hehe ABCDEFG 昄q个提交的信息要比前q的复杂很多。Content-Type变成?#8220;multipart/form-data”Q后面还多了一?boundaryQ此值是Z区分POST的内容的区段用的Q只要在内容中遇C此|pCZ面要开始一个新的区D了Q每个区D늚内容相对独立。如果遇 到的是此值后面连着两个减号Q则表示全部内容到此l束。每个段也分为段头和D体两部分,用空行隔开Q每D都有自qcd和相关信息。如W一区段?text1的|它的名称?#8220;text1”Qgؓ“hehe”。第二段是文件内容,D首里表明了此文件域的名U?#8220;file1”和此文g在用L盘上的位|,后面是文g的内宏V?br>如果我们惌自己写一个上传文件组件来接收HTML表单传送的文g数据Q那么最核心的Q务就是解析此数据包,从中取得需要的信息?
理解HTTP消息?Q四Q?br>服务器返回的消息
服务器返回的HTTP消息也分为消息头和消息体两部分。前面连载的W二里已经介绍了返回消息中常见q回代码的含义。对于非正常的返回代码的处理比较单,只要照着要求d好了,而对于正常的q回代码Q?00Q,其处理方式就多种多样了?
1 Content-Type
Content-Type是返回消息中非常重要的内容,它标识出q个q回内容的类型,其gؓ“ȝ?子类?#8221;的格式,例如最常见的就?text/htmlQ它的意思是说返回的内容是文本类型,q个文本又是HTML格式的。原则上览器会ҎContent-Type来决定如何显C回的 消息体内宏V常见的内容cd有: 2 Content-Disposition
如果用AddHeader的方法在HTTP消息头中加入Content-DispositionD,q指定其gؓ“attachment”Q那么无个文件是何类型,览器都会提C我们下载此文gQ因为此时它认ؓ后面的消息体是一?#8220;附g”Q不需要由览器来处理了。例如,在ASP.Net?写入如下语句Q?br>Response.AddHeader("Content-Disposition: attachment"); 3 Content-Type与Content-Disposition
如果把Content-Type和Content-Dispositionl合在一起用会怎么样呢Q?br>打开一个网|Q浏览器会首先看是否有Content-Disposition: attachmentq一,如果有,无论Content-Type的值是什么,都会提示文g下蝲?br>如果指定了filenameQ就会提C默认的文g名ؓ此文件名。注意到在IE6中除?#8220;保存”按扭外还?#8220;打开”按扭Q此时打开文g的类型是由在 filename中指定的文g扩展名决定的Q例如让filename=mypic.jpgQ浏览器׃查找默认的图片查看器来打开此文件?br>如果没有指定filenameQ那么浏览器根据Content-Type中的cd来决定文件的cdQ例如Content-Typecd?image/gifQ那么就会去查找默认的看GIF囄的工Pq且讄此文件的名字为所h的网늚dQ不带扩展名Q加上对应于此文件类弄扩展名Q例 如请求的mypage.aspxQ就会自动变成mypage.gif。如果ƈ没有指定Content-Type|那么默认它?“text/html”Qƈ且保存的文g名就是所h的网|件名?br>但如果没有指定Content-DispositionQ那么就和前面关于Content-Type中所讨论的情冉|一L了?
4 Cache
q回消息中的Cache用于指定|页~存。我们经常可以看到这L情况Q打开一个网|速度不快Q但再次打开时就会快很多Q原因是览器已l对此页面进行了~存Q那么在同一览器窗口中再次打开此页时不会重C服务器端获取。网늚~存是由HTTP消息头中?#8220;Cache-control”来控?的,常见的取值有private、no-cache、max-age、must-revalidate{,默认为private。其作用Ҏ不同的重新浏 览方式分Z下几U情况: 当指定Cache-controlgؓ“no-cache”Ӟ讉K此页面不会在Internet临时文章夹留下页面备份?br>另外Q通过指定“Expires”g会媄响到~存。例如,指定Expiresgؓ一个早已过ȝ旉Q那么访问此|时若重复在地址栏按回RQ那么每ơ都会重复访问: 在ASP中,可以通过Response对象的Expires、ExpiresAbsolute属性控制Expires|通过Response对象的CacheControl属性控制Cache-control的|例如Q?br>Response.ExpiresAbsolute = #2000-1-1# ' 指定l对的过期时_q个旉用的是服务器当地旉Q会被自动{换ؓGMT旉
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 08:57:39 GMT
Connection: close
Content-Type: text/html
Content-Length: 172
<body><h1>Directory Listing Denied</h1>This Virtual Directory does not allow contents to be listed.</body></html>
Date: Mon, 06 Mar 2006 09:03:14 GMT
Server: Apache/2.0.55 (Unix) PHP/5.0.5
Content-Length: 291
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /notexist was not found on this server.</p>
<hr>
<address>Apache/2.0.55 (Unix) PHP/5.0.5 Server at localhost Port 8080</address>
</body></html>
HTTP/1.1 401 Access Denied
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 09:15:55 GMT
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
Connection: close
Content-Length: 3964
Content-Type: text/html
<html dir=ltr>
……
此时览器上l出的提C如下图Q让我们输入用户名和密码Q?
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: 192.168.0.55:8080
Connection: Keep-Alive
Authorization: Negotiate ABCDEFG……
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 09:20:53 GMT
WWW-Authenticate: Negotiate HIJKLMN……
Content-Length: 3715
Content-Type: text/html
<html dir=ltr>
……
客户端拿到公钥之后用公钥对用户名和密码q行加密码,然后把加密以后的l果重新发给服务器:
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: 192.168.0.55:8080
Connection: Keep-Alive
Authorization: Negotiate OPQRST……
先来看一下Transfer的例子:
例如ASP文g1.asp只有一?br><% Server.Transfer "1.htm" %>
HTML文g1.htm也只有一行:
<p>this is 1.htm</p>
如果我们从浏览器里请?.aspQ发送的h是:
GET /1.asp HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: localhost:8080
Connection: Keep-Alive
Cookie: ASPSESSIONIDACCTRTTT=PKKDJOPBAKMAMBNANIPIFDAP
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 12:52:44 GMT
X-Powered-By: ASP.NET
Content-Length: 20
Content-Type: text/html
Cache-control: private
不难看出Q通过Server.Transfer语句服务器端已经做了面重定向,而客LҎ一无所知,表面上看上去得到的就?.asp的结果?br>如果?.asp的内Ҏ为:
<% Response.Redirect "1.htm" %>
再次h1.aspQ发送的h没有变化Q得到的回应却变成了Q?br>HTTP/1.1 302 Object moved
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 12:55:57 GMT
X-Powered-By: ASP.NET
Location: 1.htm
Content-Length: 121
Content-Type: text/html
Cache-control: private
<body><h1>Object Moved</h1>This object may be found <a HREF="">here</a>.</body>
GET /1.htm HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: localhost:8080
Connection: Keep-Alive
If-Modified-Since: Thu, 02 Mar 2006 06:50:13 GMT
If-None-Match: "b224758ec53dc61:9f0"
Cookie: ASPSESSIONIDACCTRTTT=PKKDJOPBAKMAMBNANIPIFDAP
Server: Microsoft-IIS/5.1
X-Powered-By: ASP.NET
Date: Mon, 06 Mar 2006 12:55:57 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Mon, 06 Mar 2006 12:52:32 GMT
ETag: "76d85bd51c41c61:9f0"
Content-Length: 20
很明显,两种重定向方式虽然看上去l果很像Q但在实现原理上有很大的不同?
昄q个E序q不完整Q于是得到的l果为:
HTTP/1.1 500 Internal Server Error
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 12:58:55 GMT
X-Powered-By: ASP.NET
Content-Length: 4301
Content-Type: text/html
Expires: Mon, 06 Mar 2006 12:58:55 GMT
Set-Cookie: ASPSESSIONIDACCTRTTT=ALKDJOPBPPKNPCNOEPCNOOPD; path=/
Cache-control: private
……
q一ơ主要来观察HTTP消息头中客户端的hQ从中找C些有意思的内容?
写两个简单的|页Q?br>a.htmQ?br><a href=b.htm>to page b</a>
b.htmQ?br>haha
内容很简单,是|页A中有一个到B的链接。把它们攑ֈIIS上,q访问网AQ从中再点击到B的链接,于是看到了B늚“haha”。那么这两次h有什么不同吗Q观察它们所发送的HTTP消息_最明显的区别就是访问B|比访问A|多了一行:
Referer: http://localhost/a.htm
q一行就表示Q用戯讉K的B|从A链接过来的?br>服务器端要想取得q个g是很Ҏ的,以ASPZQ只需要写一?br><% =Request.ServerVariables("HTTP_REFERER") %>
可以了?br>一些网站通过HTTP_REFERER来做安全验证Q判断用h不是从允许的面链接来的Q而不是直接从览器上打URL或从其他面链接q来Q这样可?从一定程度上防止|页被做非法使用。但从上q原理来看,惌骗过服务器也q不困难Q只要手工构造输入的HTTP消息头就可以了,其他常用的手D还有通过 HOSTS文g伪造域名等?br>除了链接以外,q有其他几种方式会导致HTTP_REFERER信息被发送,如:
内联框架Q?lt;iframe src=b.asp></iframe>
框架集:<frameset><frame src=b.asp></frameset>
表单提交Q?lt;form action=b.asp><input type=submit></form>
SCRIPT引用Q?lt;script src=b.asp></script>
CSS引用Q?lt;link rel=stylesheet type=text/css href=b.asp>
XML数据岛:<xml src=b.asp></xml>
script开新窗口:<script>window.open("b.asp");</script>
META转向Q?lt;meta http-equiv="refresh" content="0;URL=b.asp">
引入囄Q?lt;img src=b.asp>
COOKIE是大安非常熟悉的了Q通过它可以在客户端保存用L态,即用户关闭览器也能l保存。那么客L与服务器端是如何交换COOKIE信息的呢Q没错,也是通过HTTP消息头?br>首先写一个简单的ASP|页Q?br><%
Dim i
i = Request.Cookies("key")
Response.Write i
Response.Cookies("key") = "haha"
Response.Cookies("key").Expires = #2007-1-1#
%>
W一ơ访问此|页Ӟ屏幕上一片白Q第二次讉KӞ则会昄?#8220;haha”。通过阅读E序不难发现Q屏q上昄的内容实际上是COOKIE 的内容,而第一ơ访问时q没有设|COOKIE的|所以不会有昄Q第二次昄的是W一ơ设|的倹{那么对应的HTTP消息头应该是什么样的呢Q?br>W一ơ请求时没什么不同,略过
W一ơ返回时消息内容多了下面q一行:
Set-Cookie: key=haha; expires=Sun, 31-Dec-2006 16:00:00 GMT; path=/
很明显,key=haha表示键名?#8220;key”的COOKIE的gؓ“haha”Q后面是q则COOKIE的过期时_因ؓ我用的中文操作系l的时区是东八区Q?007q???点对应的GMT旉是2006q?2?1?6炏V?br>W二ơ再讉K此网|Q发送的内容多了如下一行:
Cookie: key=haha
它的内容是刚才讄COOKIE的内宏V可见,客户端在从服务器端得到COOKIEg后就保存在硬盘上Q再ơ访问时׃把它发送到服务器。发送时q没有发送过期时_因ؓ服务器对q期旉q不兛_Q当COOKIEq期后浏览器׃会再发送它了?br>如果使用IE6.0览器ƈ且禁用COOKIE功能Q可以发现服务器端的set-cookieq是有的Q但客户端ƈ不会接受它,也不会发送它。有些网站, 特别是在U投网站通过记录COOKIE防止用户重复投票Q破解很单,只要用IE6览器ƈ用COOKIE可以了。也有的|站通过COOKIEgؓ 某值来判断用户是否合法Q这U判断也非常Ҏ通过手工构造HTTP消息头来ƺ骗Q当然用HOSTS的方式也是可以欺骗的?
HTTP协议本n是无状态的Q服务器和客L都不保证用户讉K期间q接会一直保持,事实上保持连接是HTTP1.1才有的新内容Q当客户端发送的消息头中?#8220;Connection: Keep-Alive” 时表C客L览器支持保持连接的工作方式Q但q个q接也会在一D|间没有请求后自动断开Q以节省服务器资源。ؓ了在服务器端l持用户状态,SESSIONp发明出来了,现在各主的动态网制做工具都支持SESSIONQ但支持的方式不完全相同Q以下皆以ASPZ?br>当用戯求一个ASP|页Ӟ在返回的HTTP消息头中会有一行:
Set-Cookie: ASPSESSIONIDCSQCRTBS=KOIPGIMBCOCBFMOBENDCAKDP; path=/
服务器通过COOKIE的方式告诉客L你的SESSIONID是多,在这里是“KOIPGIMBCOCBFMOBENDCAKDP”Qƈ且服务器上保 留了和此SESSIONID相关的数据,当同一用户再次发送请求时Q还会把q个COOKIE再发送回去,服务器端Ҏ此ID扑ֈ此用L数据Q也实C 服务器端用户状态的保存。所以我们用ASP~程时可以?#8220;session("name")=user”q样的方式保存用户信息。注意此COOKIE内容 里ƈ没有q期旉Q这表示q是一个当关闭览器时立即q期的COOKIEQ它不会被保存到盘上。这U工作方式比单纯用COOKIE的方式要安全很多Q因 为在客户端ƈ没有什么能让我们修改和ƺ骗的|唯一的信息就是SESSIONIDQ而这个ID在浏览器关闭时会立即失效Q除非别在你览|站期间或关闭浏览器后很短时间内知道此ID的|才能做一些欺骗活动。因为服务器端判断SESSIONq期的方式ƈ不是断开q接或关闭浏览器Q而是通过用户手工l束 SESSION或等待超Ӟ当用户关闭浏览器后的一D|间里SESSIONq没有超Ӟ所以这时如果知道了刚才的SESSIONIDQ还是可以欺骗的。因 此最安全的办法还是在d|站之前手工l束SESSIONQ很多网站都提供“Logout”功能Q它会通过讄SESSION中的gؓ已退出状态或?SESSION立即q期从而v到安全的目的?br>SESSION和COOKIE的方式各有优~点。SESSION的优Ҏ比较安全Q不Ҏ被欺骗,~点是过期时间短Q如果用q在过q期旉里没有向服务器发送Q何信息,׃被认q过期了QCOOKIE则相反,Ҏ服务器端讄的超时时_可以长时间保留信息,即x再开Z可能保留状态,而安全性自然大打折扣。很多网站都提供两种验证方式相结合,如果用户临时用这台电脑访问此讉K则需要输入用户名和密码,不保存COOKIEQ如果用户用的是自q个h电脑Q则可以让网站在自己盘上保留COOKIEQ以后访问时׃需要重新输入用户名和密码了?
览器访问服务器常用的方式有GET和POST两种QGET方式只发送HTTP消息_没有消息体,也就是除了要GET的基本信息之?不向服务器提供其他信息,|页表单QFROMQ的默认提交方式是用GET方式Q它会把所有向服务器提交的信息都作为URL后面的参敎ͼ?a.asp?a=1&b=2q样的方式。而当要提交的数据量很大,或者所提交内容不希望别人直接看到时Q应该用POST方式。POST方式提交 的数据是作ؓHTTP消息体存在的Q例如,写一个网表单:
<form method=post>
<input type=text name=text1>
<input type=submit>
</form>
讉K此网,q在表单中填入一?#8220;haha”Q然后提交,可以看到此次提交所发送的信息如下Q?br>POST /form.asp HTTP/1.1
Accept: */*
Referer: http://localhost:8080/form.asp
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; InfoPath.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: localhost:8080
Content-Length: 10
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: key=haha; ASPSESSIONIDCSQCRTBS=LOIPGIMBLMNOGCOBOMPJBOKP
前面关键字从“GET”变ؓ?#8220;POST”QContent-Type变成?#8220;application/x-www-form- urlencoded”Q后面内容ƈ无大变化Q只是多了一行:Content-Length: 10Q表C提交的内容的长度。空行后面是消息体,内容是表单中所填的内容。注意此时发送的内容只是“Name=Value”的Ş式,表单上其他的信息?会被发送,所以想直接从服务器端取得list box中所有的list item是办不到的,除非在提交前用一Dscript把所有的item内容都连在一hC个隐含表单域中?br>如果是用表单上传文gQ情况就要复杂一些了Q首先是表单声明中要加上一句话Qenctype='multipart/form-data'Q表C个表单将提交多段数据Qƈ用HTMLQinput type=file来声明一个文件提交域?br>表单内容如下Q?br><form method=post enctype='multipart/form-data'>
<input type=text name=text1>
<input type=file name=file1>
<input type=submit>
</form>
我们为text1输入文字QheheQؓfile1选择文ghaha.txtQ其内容?#8220;ABCDEFG”Q然后提交此表单。提交的完全信息为:
POST /form.asp HTTP/1.1
Accept: */*
Referer: http://localhost:8080/form.asp
Accept-Language: zh-cn
Content-Type: multipart/form-data; boundary=---------------------------7d62bf2f9066c
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; InfoPath.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: localhost:8080
Content-Length: 337
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: key=haha; ASPSESSIONIDCSQCRTBS=LOIPGIMBLMNOGCOBOMPJBOKP
Content-Disposition: form-data; name="text1"
-----------------------------7d62bf2f9066c
Content-Disposition: form-data; name="file1"; filename="H:\Documents and Settings\Administrator\桌面\haha.txt"
Content-Type: text/plain
-----------------------------7d62bf2f9066c--
text/html HTML文本
image/jpeg JPG囄
image/gif GIF囄
application/xml XML文档
audio/x-mpegurl MP3文g列表Q如果安装了WinampQ则可以直接把它当面M3U文g来打开
更多的内容类型可以在注册?#8220;HKCR\MIME\Database\Content Type”下看?br>对于IE6览器来_如果Content-Type中的cd和实际的消息体类型不一_那么它会Ҏ内容中的cd来分析实际应该是什么类型,对于JPG、GIF{常用图片格式都可以正确的识别出来,而不Content-Type中写的是什么?br>如果Content-Type中指定的是浏览器可以直接打开的类型,那么览器就会直接打开其内ҎC出来,如果是被兌到其它应用程序的cdQ这时就要查找注册表中关于这U类型的注册情况Q如果是允许直接打开而不需要询问的Q就会直接调个关联的应用E序来打开q个文gQ但如果是不允许直接打开的,?会询问是否打开。对于没有关联到M应用E序的类型,IE览器不知道它该如何打开Q此时IE6׃把它当成XML来尝试打开?
h此页面是得到的结果如Q?br>HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
Date: Thu, 23 Mar 2006 07:54:53 GMT
Content-Disposition: attachment
Cache-Control: private
Content-Type: text/html; charset=utf-8
……
也就是说Q通过AddHeader函数可以为HTTP消息头加入我们自定义的内宏V用这U方法可以强制让览器提CZ载文Ӟ即ɘq个文g是我们已知的 cdQ基于是HTML|页。如果想要让用户下蝲时提CZ个默认的文g名,只需要在前面一句话后加?#8220;filename=文g?#8221;卛_。例如:
Response.AddHeader("Content-Disposition: attachment; filename=mypage.htm");
Q?Q?打开新窗?/strong>
如果指定cache-control的gؓprivate、no-cache、must-revalidateQ那么打开新窗口访问时都会重新讉K服务器。而如果指定了max-age|那么在此值内的时间里׃会重新访问服务器Q例如:
Cache-control: max-age=5
表示当访问此|页后的5U内再次讉K不会L务器
Q?Q?在地址栏回?/strong>
如果gؓprivate或must-revalidateQ和|上说的不一PQ则只有W一ơ访问时会访问服务器Q以后就不再讉K。如果gؓno-cacheQ那么每ơ都会访问。如果gؓmax-ageQ则在过期之前不会重复访问?br>Q?Q?按后退按扭
如果gؓprivate、must-revalidate、max-ageQ则不会重访问,而如果ؓno-cacheQ则每次都重复访?br>Q?Q?按刷新按?br>无论Z|都会重复讉K
Expires: Fri, 31 Dec 1999 16:00:00 GMT
Response.Expires = 20 ' 指定相对的过期时_以分钟ؓ单位Q表CZ当前旉赯多少分钟q期?br>Response.CacheControl = "no-cache"
Expires值是可以通过在Internet临时文g夹中查看临时文g的属性看到的Q如Q?
]]>
2、POST是被设计用来向上放东西的Q而GET是被设计用来从服务器取东西的QGET也能够向服务器传送较的数据Q而Get之所以也能传送数?只是用来设计告诉服务?你到底需要什么样的数?POST的信息作为HTTP h的内容,而GET是在HTTP 头部传输的;
3、POST与GET在HTTP 中传送的方式不同QGET的参数是在HTTP 的头部传送的Q而Post的数据则是在HTTP h的内定w传?
4、POST传输数据Ӟ不需要在URL中显C出来,而GETҎ要在URL中显C;
5、GETҎ׃受到URL长度的限?只能传递大U?024字节QPOST传输的数据量大,可以辑ֈ2MQ而根据微软方面的说法Q微软对?Request.Form() 可接收的最大数据有限制QIIS 4 中ؓ 80 KB 字节QIIS 5 中ؓ 100 KB 字节Q?
6、SOAP是依赖于HTTP POST模式实现的;
例子Q?
HTTP GET
发?
GET /DEMOWebServices2.8/Service.asmx/CancelOrder?UserID=string&PWD=string&OrderConfirmation=string HTTP/1.1
Host: api.efxnow.com
回复
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<objPlaceOrderResponse xmlns="https://api.efxnow.com/webservices2.3">
<Success>boolean</Success>
<ErrorDescription>string</ErrorDescription>
<ErrorNumber>int</ErrorNumber>
<CustomerOrderReference>long</CustomerOrderReference>
<OrderConfirmation>string</OrderConfirmation>
<CustomerDealRef>string</CustomerDealRef>
</objPlaceOrderResponse>
HTTP POST
发?
POST /DEMOWebServices2.8/Service.asmx/CancelOrder HTTP/1.1
Host: api.efxnow.com
Content-Type: application/x-www-form-urlencoded
Content-Length: length
UserID=string&PWD=string&OrderConfirmation=string
回复
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<objPlaceOrderResponse xmlns="https://api.efxnow.com/webservices2.3">
<Success>boolean</Success>
<ErrorDescription>string</ErrorDescription>
<ErrorNumber>int</ErrorNumber>
<CustomerOrderReference>long</CustomerOrderReference>
<OrderConfirmation>string</OrderConfirmation>
<CustomerDealRef>string</CustomerDealRef>
</objPlaceOrderResponse>
SOAP 1.2
发?
POST /DEMOWebServices2.8/Service.asmx HTTP/1.1
Host: api.efxnow.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<CancelOrder xmlns="https://api.efxnow.com/webservices2.3">
<UserID>string</UserID>
<PWD>string</PWD>
<OrderConfirmation>string</OrderConfirmation>
</CancelOrder>
</soap12:Body>
</soap12:Envelope>
回复
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<CancelOrderResponse xmlns="https://api.efxnow.com/webservices2.3">
<CancelOrderResult>
<Success>boolean</Success>
<ErrorDescription>string</ErrorDescription>
<ErrorNumber>int</ErrorNumber>
<CustomerOrderReference>long</CustomerOrderReference>
<OrderConfirmation>string</OrderConfirmation>
<CustomerDealRef>string</CustomerDealRef>
</CancelOrderResult>
</CancelOrderResponse>
</soap12:Body>
</soap12:Envelope>
1. 目的——HTTP/0.9-〉HTTP/1.0-〉HTTP/1.1
2. 要求——MUST、REQUIRED、SHOULD
3. 术语——连?Connection)、消?Message)、请?Request)、应{?Response)、资?Resource)、实?Entity)、表C方?Representation)、内容协?Content Negotiation)、变量(Variant)、客hQClientQ、用户代?User agent)、服务器(Server)、原服务器(Origin server)、代理服务器Q?ProxyQ、网养IgatewayQ、高速缓存(CacheQ、可~存QCacheableQ、直接(first-handQ、明终止时_explicit expiration timeQ、探索终止时_heuristic expiration timeQ、年龄(AgeQ、保鲜寿命(Freshness lifetimeQ、保鲜(FreshQ、陈旧(StaleQ、语义透明Qsemantically transparentQ、有效性判别器QValidatorQ、实体标讎ͼentity tagQ或最l更Ҏ_Last-Modified time))、上?下游Qupstream/downstreamQ、向?向外Qinbound/outboundQ?
4. M操作——请?应答、中?
二、符h例与一般语法(notational conversions and generic grammarQ?
1. 扩充BNF——name = definition,"literal",rule1 | rule2,(rule1 rule2),*rule,[rule],N rule, #rule,; comment, implied *LWS
2. 基本规则——OCTET,CHAR,UPALPHA,LOALPHA,ALPHA,DIGIT,CTL,CR,LF,SP,HT,<">
三、协议参敎ͼprotocol parametersQ?
1. HTTP版本——HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT
2. l一资源标示W(URIQ——统一资源定位?URL)和统一资源名称(URN)的结合,http_URL = "http:" "http://" host [ ":" port ] [ abs_path [ "?" query ]]
3. 日期/旉格式——Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123Q?br>Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036Q?br>Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
4. 字符集——本文档中的术语"字符?指一U用一个或更多表格一个八字节序列转换成一个字W序列的ҎQ?br>charset=token
p字符?
5. 内容~码——内容编码主要用来允许文档压~(信源~码Q?br>content-coding= token
注册表包含下列标讎ͼgzipQcompressQdeflateQidentity
6. 传输~码——目的是能够保通过|络安全传输Q信道编码)
transfer-coding = "chunked" | transfer-extension
transfer-extension = token *( ";" parameter )Q?br>成块传输代码
7. 媒体cd——media-type = type "/" subtype *( ";" parameter )
type = token
subtype = token
规范化和原文~省
多部分类?
8. 产品标记——product = token ["/" product-version]
product-version = token
9. 质量值——qvalue = ( "0" [ "." 0*3DIGIT ] )| ( "1" [ "." 0*3("0") ] )
10. 语言标记——language-tag = primary-tag *( "-" subtag )
primary-tag = 1*8ALPHA
subtag = 1*8ALPHA
11. 实体标记——entity-tag = [ weak ] opaque-tag
weak = "W/"
opaque-tag = quoted-string
12. 范围单位——range-unit = bytes-unit | other-range-unit
bytes-unit = "bytes"
other-range-unit = token
四?HTTP消息QHTTP messageQ?
1. 消息cd——HTTP-message = Request | Response ; HTTP/1.1 messages
generic-message = start-line *(message-header CRLF) CRLF [ message-body ]
start-line = Request-Line | Status-Line
2. 消息头——HTTP头域包括常规?h?应答头和实体头域
message-header = field-name ":" [ field-value ]
field-name = token
field-value = *( field-content | LWS )
field-content = <the OCTETs making up the field-value and consisting of either *TEXT or combinations of token, separators, and quoted-string>
3. 消息体——message-body = entity-body| <entity-body encoded as per Transfer-Encoding>
4. 消息的长度——决定因?
5. 常规头域——general-header = Cache-Control| Connection| Date| Pragma| Transfer-Encoding
五?hQrequestQ?
首行包括利用资源的方?区分资源的标?以及协议的版本号
Request = Request-Line * (( general-header| request-header| entity-header ) CRLF) CRLF [ message-body ]
1. h行——Request-Line = Method SP Request-URI SP HTTP-Version CRLF
Ҏ——方法标记指的是在请求URI所指定的资源上所实现的方?br>Method = "OPTIONS"| "GET"| "POST"| "PUT"| "DELETE"| "TRACE"| "CONNECT"| extension-method
extension-method = token
hURL——请求URL是一U全球统一的应用于资源h的资源标识符
Request-URI = "*" | absoluteURI | abs_path | authority
h行D例:GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1
GET /pub/WWW/TheProject.html HTTP/1.1
Host: www.w3.org
2. h定义的资源——一个INTERNETh所定义的精资源由hURL和主机报头域所军_
3. h报头域——request-header = Accept| Accept-Charset| Accept-Encoding| Accept-Language| Authorization| Expect| From| Host| If-Match| If-Modified-Since| If-None-Match| If-Range| If-Unmodified-Since| Max-Forwards| Proxy-Authorization| Range| Referer| TE| User-Agent
六?应答QresponseQ?
接收和翻译一个请求信息后Q服务器发出一个HTTP应答信息
Response = Status-Line*(( general-header| response-header| entity-header ) CRLF) CRLF [ message-body ]
1. 状态行——Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
状态码——状态码是试囄解和满h的三位数字的整数码,1xx,2xx,3xx,4xx,5xxQ?00-?05-〉扩展码
2. 应答报头域——response-header = Accept-Ranges| Age| Location| Proxy-Authenticate| Retry-After| Server| Vary| WWW-Authenticate
七?实体QentityQ?
在未l特别规定的情况下,h与应{的消息也可以传送实体?实体包括实体报头域与实体正文Q而有些应{只包括实体报头?
1. 实体报头域——entity-header = Allow | Content-Encoding| Content-Language| Content-Length | Content-Location| Content-MD5| Content-Range| Content-Type| Expires| Last-Modified| extension-header
extension-header = message-header
2. 实体正文——entity-body = *OCTET
entity-body := Content-Encoding( Content-Type( data ) )
八?q接QconnectionQ?
1. 持箋q接——优?br>持箋q接是Q何HTTPq接的缺省方式,支持持箋q接的客h可以以流水线方式发送请?br>代理服务?
2. 消息传递要求——持l连接与量控制
监视q接中出错状态的消息
100L态的用?br>服务器过早关闭连接时客户机的动作
九?Ҏ定义Qmethod definitionsQ?
1. 安全和等q方?br>安全Ҏ——GET和HEADҎ除了补救外不应该有别的采取措施的含义
{幂Ҏ——没有副作用的序列是{幂?
2. OPTIONS——OPTIONSҎ代表在请求URI定的请?应答q程中通信条g是否可行的信?
3. GET——GETҎ说明了重Z息的内容p求URI来确?
4. HEAD——除了应{中止q回消息正文?HEADҎ与GETҎ一?
5. POST——POSTҎ实现的实际功能取决于服务?
6. PUT——PUTҎ要求所附实体存储在提供的请求URI?
7. DELETE——DELELEҎ要求原服务器释放hURI指向的资?
8. TRACE——TRACEҎ用于调用q程的应用层循环h消息
9. CONNECT——CONNECTҎ用于能动态徏立v隧道的代理服务器
十?状态码定义Qstatus code definitionsQ?
1. 信息1XX—?br>100l箋
101转换协议
2. 成功2XX—?br>200h成功
201创徏
202接受
203非权威信?br>204无内?br>205重置内容
206局部内?
3. 重新定向3XX—?br>300多样选择
301怹Ud
302创立
303观察别的部分
304只读
306(没有用的)
307临时重发
4. 客户错误4xx—?br>400坏请?br>401未授权的
402必需的支?br>403用
404没有扑ֈ
405不被允许的方?br>406不接?br>407代理服务器认证所必需
408h时
409冲突
410停止
411必需的长?br>412预处理失?br>413h实体太大
414h的URIq长
415不被支持的媒体类?br>416h范围不满?br>417期望p|
5. 服务器错?xx—?br>500服务器内部错?br>501不能实现
502坏网?br>503难以获得的服?br>504|关时
505 HTTP版本不支?
十一?讉K验证Qaccess authenticationQ——可选择
十二?内容谈判Qcontent negotiationQ?
HTTPZ"内容谈判"提供了一些机Ӟ卛_有很多种可能的表C时如何选择对于一个请求的最佳的表示?
1. 服务器驱动谈判——一个请求的最佌C的选择由服务器提供的运法则来完成
2. 代理驱动谈判——对于一个应{的最佌C法的选择是在代理从原服务器端收到最初的应答后实现的
3. 透明谈判——透明的判断是服务器驱动和代理驱动谈判的结合体
十三?HTTP中的~存Qcaching in HTTPQ?
HTTP典型应用于能通过采用~存技术而提高性能的分布式信息pȝ
1. ~存—?br>~存正确?br>警告信息
~存控制机制
直接的用户代理警?br>规则和警告的例外情况
由客h制的行ؓ
2. q期模型—?br>服务器指定模?br>启发式过?br>q龄计算
q期计算
澄清q期?br>澄清多重响应
3. 认模型——当~存器想要用一个失时效的条目来相应客户的请?他首先必d源服务器验这一~存条目是否仍然可用
最后修Ҏ?br>标签~存认?br>强弱控制?br>关于何时使用实体标签和最后修Ҏ间的规则
不确认条?
4. 响应的缓存能力——除非被明确限制,~存pȝ可以一成功的响应作为缓存实体一直存?
5. 从缓存构造响应—?br>端到端和Hop-by-hop报头
不可更改报头
联合报头
联合字节范围
6. ~存谈判响应
7. ׃n与非׃n~存
8. 错误和不完全响应~存行ؓ
9. GET?HEAD的副作用
10. h或删除后的无效?
11. 强制写通过
12. ~存替换
13. 历史U录
十四?报头域定义(header field definitionsQ?
1. Accept——Accept = "Accept" ":" #( media-range [ accept-params ] )
media-range = ( "*/*"| ( type "/" "*" )| ( type "/" subtype )) *( ";" parameter )
accept-params = ";" "q" "=" qvalue *( accept-extension )
accept-extension = ";" token [ "=" ( token | quoted-string ) ]
?QAccept: audio/*; q=0.2, audio/basic
?QAccept: text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c
2. Accept-Charset——Accept-Charset = "Accept-Charset" ":" 1#( ( charset | "*" )[ ";" "q" "=" qvalue ] )
例:Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
3. Accept-Encoding——Accept-Encoding = "Accept-Encoding" ":" 1#( codings [ ";" "q" "=" qvalue ] )
codings = ( content-coding | "*" )
例:Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0
4. Accept-Language——Accept-Language = "Accept-Language" ":" 1#( language-range [ ";" "q" "=" qvalue ] )
language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
例:Accept-Language: da, en-gb;q=0.8, en;q=0.7
5. Accept-Range——Accept-Ranges = "Accept-Ranges" ":" acceptable-ranges
acceptable-ranges = 1#range-unit | "none"
例:Accept-Ranges: bytes
6. Age——Age = "Age" ":" age-value
age-value = delta-seconds
7. Allow——Allow = "Allow" ":" #Method
例:Allow: GET, HEAD, PUT
8. Authorization——Authorization = "Authorization" ":" credentials
9. Cache-Control——Cache-Control = "Cache-Control" ":" 1#cache-directive
cache-directive = cache-request-directive| cache-response-directive
cache-request-directive ="no-cache"| "no-store"| "max-age" "=" delta-seconds| "max-stale" [ "=" delta-seconds ]| "min-fresh" "=" delta-seconds| "no-transform"| "only-if-cached"| cache-extension
cache-response-directive ="public"| "private" [ "=" <"> 1#field-name <"> ]| "no-cache" [ "=" <"> 1#field-name <"> ]| "no-store"| "no-transform"| "must-revalidate"| "proxy-revalidate"| "max-age" "=" delta-seconds| "s-maxage" "=" delta-seconds| cache-extension
cache-extension = token [ "=" ( token | quoted-string ) ]
什么是可缓存的
哪些可能被缓存保?br>对基本过期失效机制的改进
~存重新认有效和重载控?br>不得转换的指?br>~存控制扩展
10. Connection——Connection = "Connection" ":" 1#(connection-token)
connection-token = token
例:Connection: close
11. Content-Encoding——Content-Encoding = "Content-Encoding" ":" 1#content-coding
例:Content-Encoding: gzip
12. Content-Language——Content-Language = "Content-Language" ":" 1#language-tag
例:Content-Language: mi, en
13. Content-Length——Content-Length = "Content-Length" ":" 1*DIGIT
Content-Length: 3495
14. Content-Location——Content-Location = "Content-Location" ":"( absoluteURI | relativeURI )
15. Content-MD5——Content-MD5 = "Content-MD5" ":" md5-digest
md5-digest = <base64 of 128 bit MD5 digest as per RFC 1864>
16. Content-Range——Content-Range = "Content-Range" ":" content-range-spec
content-range-spec = byte-content-range-spec
byte-content-range-spec = bytes-unit SP byte-range-resp-spec "/"( instance-length | "*" )
byte-range-resp-spec = (first-byte-pos "-" last-byte-pos) | "*"
instance-length = 1*DIGIT
例:The first 500 bytes:bytes 0-499/1234
17. Content-Type——Content-Type = "Content-Type" ":" media-type
例:Content-Type: text/html; charset=ISO-8859-4
18. Date——Date = "Date" ":" HTTP-date
例:Date: Tue, 15 Nov 1994 08:12:31 GMT
没有旉的原服务器的q作
19. Etag——ETag = "ETag" ":" entity-tag
例:ETag: W/"xyzzy"
20. Expect——Expect = "Expect" ":" 1#expectation
expectation = "100-continue" | expectation-extension
expectation-extension = token [ "=" ( token | quoted-string )*expect-params ]
expect-params = ";" token [ "=" ( token | quoted-string ) ]
21. Expires——Expires = "Expires" ":" HTTP-date
例:Expires: Thu, 01 Dec 1994 16:00:00 GMT
22. From——From = "From" ":" mailbox
例:From: webmaster@w3.org
23. Host——Host = "Host" ":" host [ ":" port ] ; Section 3.2.2
24. If-Match——If-Match = "If-Match" ":" ( "*" | 1#entity-tag )
例:If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
25. If-Modified-Since——If-Modified-Since = "If-Modified-Since" ":" HTTP-date
例:If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
26. If-None-Match ——If-None-Match = "If-None-Match" ":" ( "*" | 1#entity-tag )
例:If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"
27. If-Range ——If-Range = "If-Range" ":" ( entity-tag | HTTP-date )
28. If-Unmodified-Since ——If-Unmodified-Since = "If-Unmodified-Since" ":" HTTP-date
例:If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT
29. Last-Modified ——Last-Modified = "Last-Modified" ":" HTTP-date
例:Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
30. Location ——Location = "Location" ":" absoluteURI
Location: http://www.w3.org/pub/WWW/People.html
31. Max-Forwards ——Max-Forwards = "Max-Forwards" ":" 1*DIGIT
32. Pragma ——Pragma = "Pragma" ":" 1#pragma-directive
pragma-directive = "no-cache" | extension-pragma
extension-pragma = token [ "=" ( token | quoted-string ) ]
33. Proxy-Authenticate ——Proxy-Authenticate = "Proxy-Authenticate" ":" 1#challenge
34. Proxy-Authorization ——Proxy-Authorization = "Proxy-Authorization" ":" credentials
35. Range——字节范?br>范围索请?br>Range = "Range" ":" ranges-specifier
36. Referer——Referer = "Referer" ":" ( absoluteURI | relativeURI )
37. Retry-After ——Retry-After = "Retry-After" ":" ( HTTP-date | delta-seconds )
38. Server ——Server = "Server" ":" 1*( product | comment )
39. TE ——TE = "TE" ":" #( t-codings )
t-codings = "trailers" | ( transfer-extension [ accept-params ] )
例:TE: trailers, deflate;q=0.5
40. Trailer ——Trailer = "Trailer" ":" 1#field-name
41. Transfer-Encoding ——Transfer-Encoding = "Transfer-Encoding" ":" 1#transfer-coding
例:Transfer-Encoding: chunked
42. Upgrade——Upgrade = "Upgrade" ":" 1#product
例:Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
43. User-Agent ——User-Agent = "User-Agent" ":" 1*( product | comment )
例:User-Agent: CERN-LineMode/2.15 libwww/2.17b3
44. Vary ——Vary = "Vary" ":" ( "*" | 1#field-name )
45. Via ——Via = "Via" ":" 1#( received-protocol received-by [ comment ] )
received-protocol = [ protocol-name "/" ] protocol-version
protocol-name = token
protocol-version = token
received-by = ( host [ ":" port ] ) | pseudonym
pseudonym = token
例:Via: 1.0 ricky, 1.1 ethel, 1.1 fred, 1.0 lucy
46. Warning = "Warning" ":" 1#warning-value
warning-value = warn-code SP warn-agent SP warn-text [SP warn-date]
warn-code = 3DIGIT
warn-agent = ( host [ ":" port ] ) | pseudonym
warn-text = quoted-string
warn-date = <"> HTTP-date <">
47. WWW-Authenticate ——WWW-Authenticate = "WWW-Authenticate" ":" 1#challenge
十五?安全考虑Qsecurity considerationsQ?
一些徏议,但是q不包括最l解x?
1. 个h信息
服务器日志信息的滥用
敏感信息的传?br>URI中敏感信息的~码
q接到Accept报头的机要问?
2. Z文g和\径名U的d
3. DNSƺ骗
4. LocationQ位|)报头和欺?
5. 内容們问题
6. 鉴定证书和空闲的客户?
7. 代理服务器和高速缓?br>对代理服务器的拒l服务攻?
十六?感谢
十七?参考文?
十八?作者地址
十九?附录
HTTP使用内容cdQ是指Web服务器向Web览器返回的文g都有与之相关的类型。所有这些类型在MIME Internet邮g协议上模型化Q即Web服务器告诉Web览器该文g所h的种c,是HTML文档、GIF格式囑փ、声x件还是独立的应用E序。大多数Web览器都拥有一pd的可配置的辅助应用程序,它们告诉览器应该如何处理Web服务器发送过来的各种内容cd?
HTTP通信机制是在一ơ完整的HTTP通信q程中,Web览器与Web服务器之间将完成下列7个步骤:
Q?Q?nbsp; 建立TCPq接
在HTTP工作开始之前,Web览器首先要通过|络与Web服务器徏立连接,该连接是通过TCP来完成的Q该协议与IP协议共同构徏InternetQ即著名的TCP/IP协议族,因此Internet又被UC是TCP/IP|络。HTTP是比TCP更高层次的应用层协议Q根据规则,只有低层协议建立之后才能Q才能进行更层协议的q接Q因此,首先要徏立TCPq接Q一般TCPq接的端口号?0
Q?Q?nbsp; Web览器向Web服务器发送请求命?
一旦徏立了TCPq接QWeb览器就会向Web服务器发送请求命?
例如QGET/sample/hello.jsp HTTP/1.1
Q?Q?nbsp; Web览器发送请求头信息
览器发送其h命o之后Q还要以头信息的形式向Web服务器发送一些别的信息,之后览器发送了一I白行来通知服务器,它已l结束了该头信息的发送?
Q?Q?nbsp; Web服务器应{?
客户机向服务器发求后Q服务器会客h回送应{,
HTTP/1.1 200 OK
应答的第一部分是协议的版本号和应答状态码
Q?Q?nbsp; Web服务器发送应{头信息
正如客户端会随同h发送关于自w的信息一P服务器也会随同应{向用户发送关于它自己的数据及被请求的文档?
Q?Q?nbsp; Web服务器向览器发送数?
Web服务器向览器发送头信息后,它会发送一个空白行来表C头信息的发送到此ؓl束Q接着Q它׃Content-Type应答头信息所描述的格式发送用hh的实际数?
Q?Q?nbsp; Web服务器关闭TCPq接
一般情况下Q一旦Web服务器向览器发送了h数据Q它p关闭TCPq接Q然后如果浏览器或者服务器在其头信息加入了q行代码
Connection:keep-alive
TCPq接在发送后仍然保持打开状态,于是Q浏览器可以l箋通过相同的连接发送请求。保持连接节省了为每个请求徏立新q接所需的时_q节U了|络带宽?
HTTPh格式
当浏览器向Web服务器发求时Q它向服务器传递了一个数据块Q也是h信息QHTTPh信息?部分l成Q?
l hҎURI协议/版本
l h?Request Header)
l h正文
下面是一个HTTPh的例子:
GET/sample.jspHTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=jinqiao&password=1234
Q?Q?nbsp; hҎURI协议/版本
h的第一行是“ҎURL?版本”QGET/sample.jsp HTTP/1.1
以上代码?#8220;GET”代表hҎQ?#8220;/sample.jsp”表示URIQ?#8220;HTTP/1.1代表协议和协议的版本?
ҎHTTP标准QHTTPh可以使用多种hҎ。例如:HTTP1.1支持7U请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet应用中,最常用的方法是GET和POST?
URL完整地指定了要访问的|络资源Q通常只要l出相对于服务器的根目录的相对目录即可,因此L?#8220;/”开_最后,协议版本声明了通信q程中用HTTP的版本?
Q?Q h?Request Header)
h头包含许多有关的客户端环境和h正文的有用信息。例如,h头可以声明浏览器所用的语言Q请求正文的长度{?
Accept:image/gif.image/jpeg.*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
Accept-Encoding:gzip,deflate.
Q?Q h正文
h头和h正文之间是一个空行,q个行非帔R要,它表C求头已经l束Q接下来的是h正文。请求正文中可以包含客户提交的查询字W串信息Q?
username=jinqiao&password=1234
在以上的例子的HTTPh中,h的正文只有一行内宏V当Ӟ在实际应用中QHTTPh正文可以包含更多的内宏V?
HTTPhҎ我这里只讨论GETҎ与POSTҎ
GETҎ
GETҎ是默认的HTTPhҎQ我们日常用GETҎ来提交表单数据,然而用GETҎ提交的表单数据只l过了简单的~码Q同时它作为URL的一部分向Web服务器发送,因此Q如果用GETҎ来提交表单数据就存在着安全隐患上。例?
Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB
从上面的URLh中,很容易就可以辩认单提交的内容。(Q之后的内容Q另外由于GETҎ提交的数据是作ؓURLh的一部分所以提交的数据量不能太?
POSTҎ
POSTҎ是GETҎ的一个替代方法,它主要是向Web服务器提交表单数据,其是大扚w的数据。POSTҎ克服了GETҎ的一些缺炏V通过POSTҎ提交表单数据Ӟ数据不是作ؓURLh的一部分而是作ؓ标准数据传送给Web服务器,q就克服了GETҎ中的信息无法保密和数据量太小的缺炏V因此,Z安全的考虑以及对用户隐U的重Q通常表单提交旉用POSTҎ?
从编E的角度来讲Q如果用户通过GETҎ提交数据Q则数据存放在QUERYQSTRING环境变量中,而POSTҎ提交的数据则可以从标准输入流中获取?
HTTP应答与HTTPh怼QHTTP响应也由3个部分构成,分别是:
l 协议状态版本代码描q?
l 响应?Response Header)
l 响应正文
下面是一个HTTP响应的例子:
HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112
<html>
<head>
<title>HTTP响应CZ<title>
</head>
<body>
Hello HTTP!
</body>
</html>
协议状态代码描qHTTP响应的第一行类gHTTPh的第一行,它表C通信所用的协议是HTTP1.1服务器已l成功的处理了客L发出的请求(200表示成功Q?
HTTP/1.1 200 OK
响应?Response Header)响应头也和请求头一样包含许多有用的信息Q例如服务器cd、日期时间、内容类型和长度{:
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:13:33 GMT
Content-Type:text/html
Last-Moified:Mon,6 Oct 2003 13:23:42 GMT
Content-Length:112
响应正文响应正文是服务器返回的HTML面Q?
<html>
<head>
<title>HTTP响应CZ<title>
</head>
<body>
Hello HTTP!
</body>
</html>
响应头和正文之间也必ȝI分隔。
HTTP应答?
HTTP应答码也UCؓ状态码Q它反映了Web服务器处理HTTPh状态。HTTP应答码由3位数字构成,其中首位数字定义了应{码的类型:
1XXQ信息类(Information),表示收到Web览器请求,正在q一步的处理?
2XXQ成功类QSuccessfulQ?表示用户h被正接Ӟ理解和处理例如:200 OK
3XX-重定向类(Redirection),表示h没有成功Q客户必采取进一步的动作?
4XX-客户端错?Client Error)Q表C客L提交的请求有错误 例如Q?04 NOT FoundQ意味着h中所引用的文档不存在?
5XX-服务器错?Server Error)表示服务器不能完成对h的处理:?500
对于我们Web开发h员来说掌握HTTP应答码有助于提高Web应用E序调试的效率和准确性?
安全q接
Web应用最常见的用途之一是电子商务,可以利用Web服务器端E序使h们能够网l购物,需要指ZҎQ缺省情况下Q通过Internet发送信息是不安全的Q如果某人碰巧截获了你发l朋友的一则消息,他就能打开它,假想在里面有你的信用卡号码,q会有多么糟p,q运的是Q很多Web服务器以及Web览器都有创立安全连接的能力Q这样它们就可以安全的通信了?
通过Internet提供安全q接最常见的标准是安全套接?Secure Sockets layer,SSl)协议。SSL协议是一个应用层协议(和HTTP一?Q用于安全方式在Web上交换数据,SSL使用公开密钥~码pȝ。从本质Ԍq意味着业务中每一斚w拥有一个公开的和一个私有的密钥。当一方用另一方公开密钥q行~码Ӟ只有拥有匚w密钥的h才能对其解码。简单来Ԍ公开密钥~码提供了一U用于在两方之间交换数据的安全方法,SSLq接建立之后Q客户和服务器都交换公开密钥Qƈ在进行业务联pM前进行验证,一旦双方的密钥都通过验证Q就可以安全C换数据?
下面q个例子昄了一个HTTPh的Header内容Q这些数据是真正以网lHTTP协议从IE览器传递到Apache服务器上的?/p>
GET /icwork/? search=product HTTP/1.1
Accept:image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/vnd.ms-powerpoint,application/vnd.ms-excel,application/msword,*.*
Accept-Language:en-us
Accept-Encoding:gzip,deflate
User-Agent:Mozilla/4.0(compatible;MSIE 5.01;Windows NT 5.0;DigExt)
Host:www.icconcept.com:8080
Referer:http://www.yoursite.com/header.html
Connection:Keep-Alive
q段E序使用?个HeaderQ还有一些Header没有出现。我们参考这个例子具体解释HTTPh格式?/p>
1.HTTPh行:h行格式ؓMethod Request-URI Protocol。在上面q个例子里,“GET /icwork/? search=pruduct HTTP/1.1”是请求行?/p>
2.Accept:指浏览器或其他客户可以接qMIME文g格式。Servlet可以Ҏ它判断ƈq回适当的文件格式?/p>
3.Accept-CharsetQ指出浏览器可以接受的字W编码。英文浏览器的默认值是ISO-8859-1.
4.Accept-LanguageQ指出浏览器可以接受的语aU类Q如en或en-usQ指p?/p>
5.Accept-EncodingQ指出浏览器可以接受的编码方式。编码方式不同于文g格式Q它是ؓ了压~文件ƈ加速文件传递速度。浏览器在接收到Web响应之后先解码,然后再检查文件格式?/p>
6.AuthorizationQ当使用密码机制时用来标识浏览器?/p>
7.Cache-ControlQ设|关于请求被代理服务器存储的相关选项。一般servlet用不到?/p>
8.ConnectionQ用来告诉服务器是否可以l持固定的HTTPq接。HTTP/1.1使用Keep-Alive为默认|q样Q当览器需要多个文件时(比如一个HTML文g和相关的囑Ş文g)Q不需要每ơ都建立q接?/p>
9.Content-TypeQ用来表名request的内容类型。可以用HttpServletRequest的getContentType()Ҏ取得?/p>
10.CookieQ浏览器用这个属性向服务器发送Cookie。Cookie是在览器中寄存的小型数据体Q它可以记蝲和服务器相关的用户信息,也可以用来实C话功能?/p>
11.ExpectQ表时客户预期的响应状态?/p>
12.FromQ给出客LHTTPh负责人的email地址?/p>
13.HostQ对应网址URL中的Web名称和端口号?/p>
14.If-MatchQ供PUTҎ使用?/p>
15.If-Modified-SinceQ客户用这个属性表明它只需要在指定日期之后更改q的|页。因为浏览器可以使用其存储的文g而不必从服务器请求,q样节省了Web资源。由于Servlet是动态生成的|页Q一般不需要用这个属性?/p>
16.If-None-MatchQ和If-Match相反的操作,供PUTҎ使用?/p>
17.If-Unmodified-SinceQ和If-Match-Since相反?/p>
18.PragmaQ这个属性只有一U|即PragmaQno-cache,表明如果servlet充当代理服务器,即其有已经存储的网,也要请求传递给目的服务器?/p>
19.Proxy-AuthorizationQ代理服务器使用q个属性,Servlet一般用不到?/p>
20.RangeQ如果客h部分|页Q这个属性可以请求剩余部分?/p>
21.RefererQ表明生请求的|页URL。如比从|页/icconcept/index.jsp中点M个链接到|页/icwork/searchQ在向服务器发送的GET/icwork/search中的h中,Referer?a href="http://hostname:8080/icconcept/index.php">http://hostname:8080/icconcept/index.php。这个属性可以用来跟tWebh是从什么网站来的?/p>
22.UpgrageQ客户通过q个属性设定可以用与HTTP/1.1不同的协议?/p>
23.User-AgentQ是客户览器名U?/p>
24.ViaQ用来记录Webhl过的代理服务器或Web通道?/p>
25.WarningQ用来由客户声明传递或存储(cache)错误?/p>
SOAP=RPC+HTTP+XML
SOAP单的理解Q就是这L一个开攑֍议SOAP=RPC+HTTP+XMLQ?font color=#800000>采用HTTP作ؓ底层通讯协议QRPC作ؓ一致性的调用途径QQL作ؓ数据传送的格式Q允许服务提供者和服务客户l过防火墙在INTERNETq行通讯交互?/font>RPC的描叙可能不大准,因ؓSOAP一开始构思就是要实现q_与环境的无关性和独立性,每一个通过|络的远E调用都可以通过SOAP装hQ包括DCEQDistributed Computing Environment Q RPC CALLSQCOM/DCOM CALLS, CORBA CALLS, JAVA CALLSQetc?
SOAP 使用 HTTP 传?XMLQ尽HTTP 不是有效率的通讯协议Q而且 XML q需要额外的文g解析QparseQ,两者得交易的速度大大低于其它Ҏ。但是XML 是一个开放、健全、有语义的讯息机Ӟ?HTTP 是一个广泛又能避免许多关于防火墙的问题,从而SOAP得到了广泛的应用。但是如果效率对你来说很重要Q那么你应该多考虑其它的方式,而不要用 SOAP?