(3) HTTP

来源:互联网 发布:linux php log 编辑:程序博客网 时间:2024/06/06 06:42

HTTP 简介:
HTTP:HyperText Transfer Protocol (超文本传输协议)
是工作在 TCP/IP 协议基础上的,所有的 WWW 文件都必须遵守
这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。
① HTTP 协议 是建立在 TCP/IP 协议基础上的
② HTTP 协议 1.0 1.1 版本,目前使用的是 1.1
1.0 短连接  会话结束后,就挂断
1.1 长连接  会话结束后,会保留一段时间

HTTP 请求部分:

基本结构:
请求行 : GET /LoginDemo/LoginServlet HTTP/1.1
消息头: Accept : text/html, application/xhtml+xml, /
     Accept-Language : zh-CN
     Accept-Encoding : gzip, deflate
     Host : localhost:8080
     Connection : Keep-Alive
(空行)
内容体:

请求方式:
常用的 GET POST

详解 HTTP 响应头:

Accept:text/html,image/*    [ 告诉服务器,我可以接收,文本,网页,图片 ]Accept-Charset:ISO-8859-1[ 接收字符编码 ISO-8859-1 ]Accept-Encoding:gzip,compress[ 可以接收 gzip,compress 压缩后的数据 告诉浏览器我可以接收什么样的压缩格式,节省带宽 ]Accept-Language:en-us,zh-cn[ 浏览器支持 中,英文 ]Host:www.sohu.com:80[ 要找的主机是 www.sohu.com:80 ]If-Modified-Since:Tue,11 Jul 2000 16:16:16[ 告诉服务器,我的缓存中有这个资源文件,该文件的时间是....如上.. 如果服务器上的文件有修改,就给我。没修改,就不要给我了。]Referer:http://www.sowu.com[ 告诉服务器,我来自哪里。该消息头常用于防止盗链 ]User-Agent:Mozilla/4.0(compat...........)[ 告诉服务器,浏览器内核 ]Cookie[ 后续 ]Connection:close/Keep-Alive[ 保持连接,发完数据后,我不关闭连接 ]Date:Tue,11 Jul.......[ 浏览器发送该 HTTP 请求的时间 ]

HTTP 响应部分:

基本结构:
状态行: HTTP 版本号 状态码 原因叙述
消息头:
(空行)
内容 :

状态行:
格式:HTTP 版本号 状态码 原因叙述
例子:HTTP/1.1 200 OK
状态码 ( status ) 是用于表示服务器对请求的处理结果,它是一个三位的十进制数。
响应状态码分为 5 类:

状态码 含义 100~199 表示成功接收请求,要求客户端继续提交,下一次请求才能完成整个处理过程 200~299 表示成功接收请求并已完成整个处理过程,常见 200 300~399 为完成请求,客户需要进一步细化请求。例如,请求的资源已经移动一个新地址,常用 302、307 400~499 客户端请求有错误,常见 404 500~599 服务器端出现错误,常用 500

注:每个范围内的所有数字并不是都有含义,例如 100~199 并不是这个区间的状态码全部存在。
模拟 302 状态码:

response.setStatus(302);response.setHeader("Location","/webapp.servlet");// 上两行等价于下一行 ↓response.sendRedirect("/webapp.servlet");

响应头详解:

Location:http://www.baidu.com [ 让浏览器重新定位到URL ]Server:apache tomcat [ 告诉浏览器,我是 Tomcat ]Content-Encoding:gzip[ 告诉浏览器,这个数据是 gzip 压缩数据 ]Content-Length80[ 告诉浏览器发送的数据大小是 80 字节 ]Content-Type:text/html; charset=GB2313[ 内容格式 text/html; 编码gb2312 ]Content-Language:zh-cn[ 支持中文 ]Last-Modified:tue,11 jul 2001-2-2[ 告诉浏览器,该资源上次的更新时间,和缓存比较,如果资源修改了,及时更新 ]Refresh1;url=http://www.baidu.com[ 过多久,刷新到此 URL 。如果 URL 写自己的页面,就是定时刷新]Content-Disposition:attachment;filename=aaa.zip[ 告诉浏览器,有文件要下载 ]下载的过程:① 服务器先读取 web 应用的资源文件进服务器内存② 然后在把数据传输给浏览器客户端Transfer-Encoding:chunked[ 传输编码 ]SetCookie:ss=Q0; path=/search[ 后续 ]Expires:-1  -1 是数字,response.setDateHeader("Expires",-1);[ 告诉浏览器,如何缓存页面 ] IE 浏览器 ↑Cache-Control:no-cache[ 告诉浏览器,如何缓存页面 ] 其他浏览器 ↑Pragma:no-cache[ 告诉浏览器,如何缓存页面 ] 其他浏览器 ↑Connection:close/KeepAlive[ 连接方式,长连接 ]Date:tue,11.......[ 传回来的时间 ]

文件下载案例(防盗链):

需求:
① 防盗链
② 一个 Servlet 文件支持多个文件下载

View 页面:
// 在View页面,使用 ?来传递参数
URL:………. / DownloadServlet ? filename=myeclipse1.jpg

Servlet 页面:

// 获取 URLString url = request.getHeader("Referer");// 判断 URL 是否符合标准if (url == null||!=     (url.startsWith("http://localhost:8080/DownloadDemo"))) {     response.sendRedirect("/DownloadDemo/Error");}String filename = request.getParameter("filename");response.setHeader("Content-Disposition", "attachment;filename=" + filename);// 获取真实路径String realPath = this.getServletContext().getRealPath("/" + filename);FileInputStream fis = new FileInputStream(realPath);OutputStream os = response.getOutputStream();byte[] buffer = new byte[1024];int length = -1;while ((length = fis.read(buffer)) > 0) {    os.write(buffer, 0, length);}os.close();fis.close();
0 0