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-Length:80
[ 告诉浏览器发送的数据大小是 80 字节 ]
Content-Type:text/html; charset=GB2313
[ 内容格式 text/html; 编码gb2312 ]
Content-Language:zh-cn
[ 支持中文 ]
Last-Modified:tue,11 jul 2001-2-2
[ 告诉浏览器,该资源上次的更新时间,和缓存比较,如果资源修改了,及时更新 ]
Refresh:1;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 页面:
// 获取 URL
String 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();