HTTP协议
HTTP协议:用于定义客户端与WEB服务器通讯的格式,尽量减少HTTP的请求数目。
http请求:请求行,请求头,请求正文
请求行:GET,POST,HEAD,OPTIONS,DELETE,TRACE,PUT,
常用的是GET,POST.如果没有设置,则默认向服务器发送的都是get请求。超链接都是get,用户想把请求方式改为post,可通过更改表单的提取方式实现
GET方式:可以在请求的URL地址后以?的形式带上交给服务器的数据(超链接也可以这样),多个数据之间以&进行分割(数据容量通常不能超过1K)---密码提交不用这个。
POST方式:可以在请求的实体内容中向服务器发送数据,(数据量无限大)
eg:GET /aa/1,html HTTP/1.1 请求头 请求数据 请求协议
请求头:
Accept:image/gif.image/jpeg.*/* --告诉服务器,客户机支持的数据类型*/*什么类型都支持
Accept-Charset:IOS-8859-1 -- 客户机采用的编码
Accept-Encoding:gzip,deflate.compress --客户机支持的数据压缩格式
Accept-Language:zh-cn,en-us --客户机的语言环境
Host:www.it315.org:80,localhost --客户机告诉服务器想访问的主机名
if-Modified-Since:True,11 Jul 2000 18:23:51 GMT --客户机告诉服务器,资源的缓存路径
Rsferer: http://www.it315.org/index.jsp --客户机告诉服务器,它是从那个资源访问服务器的(用在防盗链上)
User-Agent:Mozila/4.0(compatiable;MSIE 5.5;Windows NT5.0) --客户机的操作系统
Cookie --客户机向服务器传送数据
Connection:Keep-Alive/close --是否保持链接
Date:Tue, 11 Jul 2000 18:23:51 GMT --时间值
http响应:一个http响应代表服务器向客户端回送的数据,包括一个状态行,若干个消息头,以及实体内容。
状态行:格式:HTTP版本号 状态码 原因级数
状态码:用于表示服务器请求的处理结果,是一个三位的十进制数。
1xx: 表示服务器成功接收接收,客户端继续提交下一次请求才能完成整个处理过程。
2xx: 表示服务器请成功接收请求并完成整个处理过称。 200-一切ok。显示的是OK
3xx: 要完成请求客户必须进行更进一步的操作。 302-去找别个处理你的请求,304,307-都是让去找缓存
4xx: 客户端请求有语法错误或请求无法实现。 404-Not Found请求地址出错,就是服务器端没有这个资源,403-Forbidden有资源,没有权限
5xx: 服务器端错误—服务器未能实现合法的请求。 500- Internal Server Error服务器处理出错
响应头:
Location:http://www.it315.org/index.jsp --这个头和302实现请求重定向(登录里面用)
Server:apache tomcat --服务器通过这个头,告诉浏览器服务器的类型
Content-Encoding:gzip --服务器通过这个头,数据的压缩格式
Content-Length:80 --服务器通过这个头,告诉浏览器回送数据的长度
Content-language:zh-cn
Content-Type:text/html;charset=gb2312 --服务器通过这个头,告诉浏览器回送数据的类型
Last-Modified:Tue, 11 Jul 2000 18:00:00 GMT --服务器通过这个头,告诉浏览器资源缓存的最后时间
Rsferer:1;url=http://www.it315.org --服务器通过这个头,告诉浏览器各多少时间刷新一次
Content-Disposition:attachment;filename=aa.zip --服务器通过这个头,告诉浏览器以下载方式打开数据
Transfer-Encoding:chunked --服务器通过这个头,告诉浏览器数据的传送格式,(这里是块块传送的)
Set-Cookie:SS=QQ=5Lb_nQ;path=/search
ETag:W/‘7777-1242234904000‘ --和缓存相关的头
Expires:-1 --服务器通过这个头,告诉浏览器吧回送的资源缓存多少时间,-1或0表示不缓存
Cache-Control:no-cache Pragma:no-cache --浏览器不要缓存
Connection:close/Keep-Alive
Date:Tue, 11 Jul 2000 18:00:00 GMT
http请求字段:
Range头指示服务器只能传输一部分web资源,自然个人资源可以实现断点下载
格式:
Range: bytes=1000-2000,传输范围从1000到2000字节
Range: bytes=1000-,传输web资源中第1000个字节以后的所有内容
Range: bytes=1000,传输最后的1000个字节。
Http响应消息字段:
Accept-Ranges:这个字段说明web服务器是否支持Range支持,则返回Accept-Ranges:bytes,如果不支持则返回Accept-Ranges:none
Content-Range:指定了返回的web资源的字节范围,这个字节范围值的格式:eg:Content-Range:1000-3000/5000
package cn.lcp.web.servlet;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
【range】
private void test6() throws MalformedURLException, IOException,
FileNotFoundException {
//代表下载资源
URL url = new URL("http://localhost:8088/day4_http2/a.txt");
//打开资源链接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//发送一个带range的头
conn.setRequestProperty("Range", "bytes=5-");
//读取资源数据
InputStream in = conn.getInputStream();
int len = 0;
byte buffer [] = new byte[1024];
//写入到的文件,
FileOutputStream out = new FileOutputStream("c:\\a.txt", true);
//读到buffer里面去
while((len = in.read(buffer)) > 0){
out.write(buffer, 0, len);
}
in.close();
out.close();
}
【"Content-Disposition", "attachment;filename=1.jpg"】
private void test5(HttpServletResponse response) throws IOException {
//告诉浏览器以何种方式打开回送数据
response.setHeader("Content-Disposition", "attachment;filename=1.jpg");
InputStream in = this.getServletContext().getResourceAsStream("/1.jpg");
int len = 0;
byte buffer[] = new byte[1024];
//浏览器相关联的流,把数据写给浏览器
OutputStream out = response.getOutputStream();
while((len = in.read(buffer)) > 0){
out.write(buffer, 0, len);
}
}
地址更新【"refresh", "5;url=‘http://www.sina.com‘"】
private void test4(HttpServletResponse response) throws IOException {
response.setHeader("refresh", "5;url=‘http://www.sina.com‘");
//response.setHeader("refresh", "5");
String data = "qqq";
response.getOutputStream().write(data.getBytes());
}
何种方式打开数据【"Content-Type", "image/jpeg"】
private void test3(HttpServletResponse response) throws IOException {
//告诉浏览器以何种方式打开回送数据
response.setHeader("Content-Type", "image/jpeg");
InputStream in = this.getServletContext().getResourceAsStream("/1.jpg");
int len = 0;
byte buffer[] = new byte[1024];
//浏览器相关联的流,把数据写给浏览器
OutputStream out = response.getOutputStream();
while((len = in.read(buffer)) > 0){
out.write(buffer, 0, len);
}
}
压缩【"Content-Encoding", "gzip"】
public void test2(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data = "dededededededededededededededed";
System.out.println("原始数据大小:" + data.getBytes().length);
//缓存流,把压缩的数据-往字节数组里面写数据
ByteArrayOutputStream bout = new ByteArrayOutputStream();
//包装流里面有缓存,要把它关上,数据就进入底层流
GZIPOutputStream gout = new GZIPOutputStream(bout);
gout.write(data.getBytes());
gout.close();
//得到压缩后的数据
byte gzip[] = bout.toByteArray();
System.out.println("压缩后的大小:" + gzip.length);
//告诉浏览器数据的压缩格式
response.setHeader("Content-Encoding", "gzip");
//告诉浏览器压缩的长度
response.setHeader("Content-Length", gzip.length + "") ;
response.getOutputStream().write(gzip);
}
重定向【"location", "/day4_http2/1.html"】
public void test1(HttpServletResponse response){
response.setStatus(302);
response.setHeader("location", "/day4_http2/1.html");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。