打个广告,帮朋友卖点东西,东西超便宜的哟【衣服鞋子等】,厂家直接出货,绝对低于市场价!!! 一般都比市场价便宜3—7折【都是牌子货】,如果您感兴趣,可以扫描屏幕下方的二维码,感谢关注!!!

一、概念
1、基础概念
客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。
2、协议版本
HTTP协议的版本:HTTP/1.0、HTTP/1.1
1.HTTP/1.0
客户端与web服务器建立连接后,只能获得一个web资源。即拿到资源后即断开连接。
2.HTTP/1.1
允许客户端与web服务器建立连接后,在一个连接上获取多个web资源,一般采用超时断开连接。
附:
1.可以在cmd中启动telnet程序来实现一个请求与响应的详细过程,如启动连接localhost服务器的程序,并获取web应用mail下的a.html:
telnet localhost 8080
#=》
GET /mail/a.html
Host:localhost
2.假设a.html中有如下代码:
asdafsdfas
<img src="1.img"/>
<img src="2.img"/>
<img src="3.img"/>
在获取资源时要访问多少次服务器?
第一次:获取a.html文件
第二次:遇到img标签,向服务器要取1.img
第三次:遇到img标签,向服务器要取2.img
第四次:遇到img标签,向服务器要取3.img
二、HTTP请求
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。一个完整的HTTP请求包括:一个请求行、若干消息头、以及实体内容,举例:
//请求行
GET /books/java.html HTTP/1.1
//请求头
Accept: */*
Accept-Language: en-us
Connection: Keep-Alive
Host: localhost
Referer: http://localhost/links.asp
User-Agent: Mozilla/4.0
Accept-Encoding: gzip, deflate
//请求实体
1、请求行
请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT
常用的有: GET、 POST
注意:
1.用户如没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。
2.不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:如请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:
GET /mail/1.html?name=abc&password=xyz HTTP/1.1
如请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据
3.GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。
Post方式的特点:传送的数据量无限制。
2、请求头
- accept:浏览器通过这个头告诉服务器,它所支持的数据类型(text/html,image/* )
- Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集,即编码方式(ISO-8859-1,UTF-8)
- Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式(gzip,compress)
- Accept-Language:浏览器通过这个头告诉服务器,它的语言环境(en-us,zh-cn )
- Host:浏览器通过这个头告诉服务器,想访问哪台主机(www.it315.org:80)
- If-Modified-Since: 浏览器通过这个头告诉服务器,上次缓存数据的时间(Tue, 11 Jul 2000 18:23:51 GMT)
- Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链(http://www.it315.org/index.jsp)
- Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接(close【断开】/Keep-Alive 【保持】 )
- User-Agent:客户机的环境(Mozilla/4.0 (compatible; MSIE 5.5; Windows 2003))
- Cookie:
- Date: 当前访问的时间(Tue, 11 Jul 2000 18:23:51 GMT)
三、HTTP响应
一个HTTP响应代表服务器向客户端回送的数据,它包括:一个状态行、若干消息头、以及实体内容 。
举例:
//状态行
HTTP/1.1 200 OK
//响应头
Server: Microsoft-IIS/5.0
Date: Thu, 13 Jul 2000 05:46:53 GMT
Content-Length: 2291
Content-Type: text/html
Cache-control: private
//空格
//实体内容
<HTML>
<BODY>
1、状态行
格式: HTTP版本号 状态码 原因叙述<CRLF>
举例:HTTP/1.1 200 OK
其中状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,如下所示:
状态码 |
含义 |
100~199 |
表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程 |
200~299 |
表示成功接收请求并已完成整个处理过程,常用200 |
300~399 |
为完成请求,客户需进一步细化请求。例如,请求的资源已经移动一个新地址,常用302(跳转到其他页面,重定向)、307和304(清理缓存) |
400~499 |
客户端的请求有错误,常用404 |
500~599 |
服务器端出现错误,常用 500 |
2、响应头
- Location: 服务器通过这个头,来告诉浏览器跳到哪里(http://www.sax.org/index.jsp )
- 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:23:51 GMT)
- Refresh:服务器通过这个头,告诉浏览器定时刷新,(并跳转到指定页面)( 3,1;url=http://www.it315.org)
- Content-Disposition: 服务器通过这个头,告诉浏览器以下载方式打开数据(attachment; filename=aaa.zip)
- Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的,数据太多( chunked)
- Expire:控制浏览器不要缓存(-1表示不缓存,5表示缓存5秒)
- Cache-Control:控制浏览器不要缓存 (no-cache)
- Pragma:控制浏览器不要缓存 (no-cache )
- Date: 响应时间(Tue, 11 Jul 2000 18:23:51 GMT)
-
Connection: 是否断开连接(close/Keep-Alive)
注意:控制浏览器不缓存有三个是因为有些浏览器可能不支持某方法
3、程序演示
WebRoot下有a.html,1.jpg
package com.shen;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.zip.GZIPOutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
test5(request,response);
}
//location头的应用
public void test1(HttpServletRequest request, HttpServletResponse response){
response.setStatus(302);//返回302错误
response.setHeader("location", "/day04/1.html");//请求重定向
}
//数据压缩
public void test2(HttpServletRequest request, HttpServletResponse response) throws IOException{
String data = "abcdabcdabcdabcdabcdabcd";
System.out.println("原始数据的大小为:" + data.getBytes().length);
ByteArrayOutputStream bout = new ByteArrayOutputStream();//字节数组流
GZIPOutputStream gout = new GZIPOutputStream(bout); //2.将压缩流中数据写入到字节数组中
gout.write(data.getBytes());//data.getBytes()将数据转换为字节,1.将其写入到压缩流
gout.close();//压缩流自带Buffer,故只有关闭资源后才会立即显示出来
//得到压缩后的数据
byte g[] = bout.toByteArray();
response.setHeader("Content-Encoding", "gzip");
response.setHeader("Content-Length",g.length +"");
response.getOutputStream().write(g);
}
//指定回送数据类型
public void test3(HttpServletRequest request, HttpServletResponse response) throws IOException{
//.jpg文件对应的类型为"image/jpeg",可在tomcat_8.5\conf\web.xml中找【Ctrl+F=》输入>jpg(表示后缀为jpg)】
response.setHeader("content-type", "image/jpeg");
InputStream in = this.getServletContext().getResourceAsStream("/1.jpg");
byte buffer[] = new byte[1024];
int len = 0;
OutputStream out = response.getOutputStream();
while((len=in.read(buffer))>0){//将图片输出
out.write(buffer, 0, len);
}
}
//指定浏览器定时刷新
public void test4(HttpServletRequest request, HttpServletResponse response) throws IOException{
response.setHeader("refresh", "3");//每隔3秒刷新一次
response.setHeader("refresh", "3;url='http://www.sina.com'");//三秒后跳到指定页面
response.getWriter().write("abcd");
}
//指定浏览器下载
public void test5(HttpServletRequest request, HttpServletResponse response) throws IOException{
response.setHeader("content-disposition", "attachment;filename=xxx.jpg");//下载.jpg文件
InputStream in = this.getServletContext().getResourceAsStream("/1.jpg");
byte buffer[] = new byte[1024];
int len = 0;
OutputStream out = response.getOutputStream();
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
}
//指定浏览器缓存时间(即在缓存时间内,浏览器取本地数据不请求服务器(如果是刷新则向服务器请求))
public void test6(HttpServletRequest request, HttpServletResponse response) throws IOException{
String data="abcdda"
response.setDateHeader("expires", System.currentTimeMillis() + 24*3600*1000);//数据缓存一天
response.getOutputStream().write(data.getBytes());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}