传智播客学习视频之HTTP协议详解(二)

1.TCP/IP协议与HTTP协议之间的关系?

 Internet的基本协议是TCP/IP协议,然而在TCP/IP模型最上层的是应用层(Application layer),它包含所有高层的协议。高层协议有:文件传输协议FTP、电子邮件传输协议SMTP、域名系统服务DNS、网络新闻传输协议NNTP和HTTP协议等,实际他们的区别类似于一个中国人和一个英国人通电话一样,TCP/IP只是保证两个人能通上电话,但是他们是否能听懂彼此的语言就不一定了,至于他们需要说什么样的语言,有什么标准,保证彼此能听懂,这就需要类似HTTP协议来规定了。

2.什么是HTTP协议?

HTTP是Hypertext Transfer Protocol(超文本传输协议)的英文简称,是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等,Web客户端和Web服务器端之间的通信依赖于HTTP协议,它支持简单的请求和响应会话。

3.请求消息

格式:一个请求行 若干消息头 实体内容

4..响应消息

格式:一个状态行 若干消息头 实体内容

注:

1)请求消息中get方式不能包括实体内容

2)http含实体内容,没有chuncked传输编码,消息头部分必须含内容长度的字段

3)简单请求消息(只用于get)终不能指定http版本号,返回简单响应消息,简单响应消息没有状态行,响应头。

 

5.消息头

消息头分为通用头,请求头,响应头和实体头。

1)通用头

通用头包含请求和响应消息都支持的消息头,与被传实体内容没有联系,通用头包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。

2)请求头

请求头允许客户端向服务器传递关于请求或者关于客户机的附加信息(数据类型,压缩方法,语言以及发出请求的超链接所属网页的url地址等信息)。请求头可能包含下列字段Accept、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。

3)响应头

 响应头允许服务器传递不能放在状态行的附加信息,这些消息头主要描述服务器的信息和Request-URI进一步的信息。响应头域包含Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW-Authenticate。

4)实体头

实体头用作实体内容元信息,描述实体内容属性(数据类型,压缩方法,最后一次修改时间,数据有效期等)。实体头包括Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、Etag、Expires、Last-Modified、extension-header。

 

 

禁止浏览器缓存当前文档内容 

只要增加如下的响应头字段: 

response.setDateHeader("Expires",0); 
response.setHeader("Cache-Control","no-cache"); 
response.setHeader("Pragma","no-cache"); 

不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面三个响应头,只有浏览器能支持其中任何一种,就能可靠地禁止浏览器缓存当前页面。 

还可以在HTML文档中利用<meta>标签的http-equiv属性来达到这一效果。 
<meta http-equiv="Expires" content="0"> 
<meta http-equiv="Cache-Control" content="no-cache"> 
<meta http-equiv="Pragma" content="no-cache"> 

实现动态文件内容下载 

1.Servlet程序必须告诉浏览器其说输出的内容的类型不是普通的文本文件或HTML文件,而是一个要保存到本地的下载文件,这就需要通过 HttpServletResponse.setContentType方法设置Content-Type头字段的值为浏览器无法使用某种方式或激活某个 程序来处理的MIME类型,例如:“application/octet-stream”或"application/x-msdownload"等。 
2.需要通过HttpServletResponse.setHeader方法设置Content-Disposition头的值为"attachment;filename=文件名"。 
3.因为附件文件可以是各种类型的文件,要讲附件文件中的内容传送给客户端,其中的内容应被当做二进制处理,所以应该调用 HttpServletResponse.getOutputStream方法返回的ServletOutputStream对象来向客户端写入附件文件 内容,而不应使用Http 
ServletResponse.getWriter方法返回的PrintWriter对象。 

利用Referer请求头阻止“盗链” 

防止盗链,需要检查请求的来路,只接受本站内的页面链接进来的下载请求,而阻止其他站点的页面链接进来的下载请求。要实现这样的功能,就需要检查请求消息的referer头字段是否与本站匹配。 

代码片段: 
String referrer = request.getHeader("referer"); 
String sitePart = "http://" + request.getServerName(); 
if(referrer!=null && referrer.startsWith(sitePart)) 

//处理下载请求... 

else 

//非法下载请求跳转到本站的下载说明页 
RequestDispatcher rd = request.getRequestDispatcher("/down.html"); 
rd.forward(request,response); 


利用Referer请求头隐藏JavaScript源代码 

利用JavaScript可以实现许多网页特效功能,但是,访问者可以轻松查看到所有的JavaScript源代码,即使是把代码放在js文件中 也无法保密。如果让js文件通过一个服务器端程序动态创建,结合使用Referer请求头字段就可以防止他人查看到JavaScript源码。 

大致原理和上面的防盗链类似 
在servlet中加入下面的代码块: 

String referrer = request.getHeader("referer"); 
String sitePart = "http://" + request.getServerName(); 
response.setContentType("text/javascript;charset=utf-8"); 
PrintWriter out = response.getWriter(); 
if(referrer!=null && referrer.startsWith(sitePart)) 

out.println( 
//向客户端输出JavaScript的代码块 
); 



在显示页面中要加入JavaScript代码的时候这样设置: 
<script type="text/javascript" src="servlet的访问路径"> 
</script> 
有些浏览器在有缓存网页的情况下,还是可以看到JavaScript源码的,只要在servlet代码里加上防止缓存的代码即可。 

posted @ 2012-04-18 23:02  磊,go  阅读(964)  评论(0编辑  收藏  举报