HTTP协议
HTTP1.0和HTTP1.1的区别
超文本的传输协议,是基于TCP/UDP协议(底层)
HTTP/1.0
一次用户请求,服务端响应后,立即断开
在HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源。
HTTP/1.1
一次用户请求,服务端响应后,会保持一定的时间,在该一定时间后,用户可以再次请求
允许客户端与web服务器建立连接后,在一个连接上获取多个web资源
浏览器与服务器交互图
HTTP协议特点
1)客户端->服务端(请求request)有三部份
a)请求行
b)请求头
c)请求的内容,如果没有,就是空白字符
2)服务端->客户端(响应response)有三部份
a)响应行
b)响应头
c)响应的内容,如果没有,就是空白字符
3HTTP请求头和响应头含义
1)请求(客户端->服务端[request])
GET(请求的方式) /books/java.html(请求的目标资源) HTTP/1.1(请求采用的协议和版本号)
Accept: */*(客户端能接收的资源类型)
Accept-Language: en-us(客户端接收的语言类型)
Connection: Keep-Alive(维护客户端和服务端的连接关系)
Host: localhost:8080(连接的目标主机和端口号)
Referer: http://localhost/links.asp(从来于哪里)
User-Agent: Mozilla/4.0(客户端版本号的名字)
Accept-Encoding: gzip, deflate(客户端能接收的压缩数据的类型)
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT(缓存时间)
Cookie(客户端暂存服务端的信息)
Date: Tue, 11 Jul 2000 18:23:51 GMT(客户端请求服务端的时间)
2)响应(服务端->客户端[response])
HTTP/1.1(响应采用的协议和版本号) 200(状态码) OK(描述信息)
302(客户端请求服务端,但服务端没有对应的资源,服务端要客户端再次请求找其它的服务端,即客户端二次请求,重定向)
307(客户端请求服务端,但服务端没有对应的资源,服务端自行再次请求找其它的服务端,即客户端一次请求,转发)
304(客户端请求服务端,此时客户端缓存中有,无需再从服务端下载新的内容,服务端叫客户端自行找缓存,优化)
500(客户端请求的资源,服务端存在,但在执行时出错)
Location: http://www.baidu.com(服务端需要客户端访问的页面路径)
Server:apache tomcat(服务端的Web服务端名)
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: 1;url=http://www.it315.org(服务端要求客户端1秒钟后,刷新,然后访问指定的页面路径)
Content-Disposition: attachment; filename=aaa.zip(服务端要求客户端以下载文件的方式打开该文件)
Transfer-Encoding: chunked(分块传递数据到客户端)
Set-Cookie:SS=Q0=5Lb_nQ; path=/search(服务端发送到客户端的暂存数据)
Expires: -1//3种(服务端禁止客户端缓存页面数据)
Cache-Control: no-cache(服务端禁止客户端缓存页面数据)
Pragma: no-cache(服务端禁止客户端缓存页面数据)
Connection: close(1.0)/(1.1)Keep-Alive(维护客户端和服务端的连接关系)
Date: Tue, 11 Jul 2000 18:23:51 GMT(服务端响应客户端的时间)
3)总结
想让浏览器有何种行为,服务端只能通过响应头的方式来设置
想让服务器知道何种行为,浏览器只能通过请求头的方式来设置
2)常用的提交方式
a)GET
特点:请求参数无论多少,都会根着URL后传递到服务端,以明文方式传递
GET方式传递有大小限制
GET方式传递信息不安全
b)POST
特点:
请求参数无论多少,都不会根着URL后传递到服务端,而是以参数形式在请求体中传递到服务端
POST方式传递无大小限制
POST方式传递信息相对安全
4 状态行
格式: HTTP版本号 状态码 原因叙述<CRLF>
举例:HTTP/1.1 200 OK
状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,如下所示:
状态码 |
含义 |
100~199 |
表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程 |
200~299 |
表示成功接收请求并已完成整个处理过程,常用200 |
300~399 |
为完成请求,客户需进一步细化请求。例如,请求的资源已经移动一个新地址,常用302(重定向)、307(转发)和304 |
400~499 |
客户端的请求有错误,常用404 |
500~599 |
服务器端出现错误,常用 500 |
5代码验证HTTP协议
web。xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>day004</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Demo1</servlet-name>
<servlet-class>cn.feihzou.web.http.Demo1</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet>
<servlet-name>Demo2</servlet-name>
<servlet-class>cn.feihzou.web.http.Demo2</servlet-class>
</servlet>
<servlet>
<servlet-name>Demo3</servlet-name>
<servlet-class>cn.feihzou.web.http.Demo3</servlet-class>
</servlet>
<servlet>
<servlet-name>Demo4</servlet-name>
<servlet-class>cn.feihzou.web.http.Demo4</servlet-class>
</servlet>
<servlet>
<servlet-name>Demo5</servlet-name>
<servlet-class>cn.feihzou.web.http.Demo5</servlet-class>
</servlet>
<servlet>
<servlet-name>Demo6</servlet-name>
<servlet-class>cn.feihzou.web.http.Demo6</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo1</servlet-name>
<url-pattern>/Demo1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Demo2</servlet-name>
<url-pattern>/Demo2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Demo3</servlet-name>
<url-pattern>/Demo3</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Demo4</servlet-name>
<url-pattern>/Demo4</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Demo5</servlet-name>
<url-pattern>/Demo5</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Demo6</servlet-name>
<url-pattern>/Demo6</url-pattern>
</servlet-mapping>
</web-app>
验证
//重定向302+location响应头(服务端->客户端)
public class Demo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response){
//服务端通知客户端重定向
response.setStatus(302);
//服务端通知客户端重定向的目标资源
response.setHeader("location","/index.html");
}
}
public class Demo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String data = "以下代码完成将String类型压缩到byte以下代码完成将S"
+ "tring类型压缩到byte以下代码完成将String类型"
+ "压缩到byte以下代码完成将String类型压缩到byte以下"
+ "代码完成将String类型压缩到byte以下代码完成将String类型压缩到byte";
System.out.println("压缩前" + data.length());
//以下代码完成将String类型压缩到byte[]中
ByteArrayOutputStream bout = new ByteArrayOutputStream();
GZIPOutputStream gout = new GZIPOutputStream(bout);
gout.write(data.getBytes());
gout.flush();
gout.close();
//取出压缩后的数据
byte[] buf = bout.toByteArray();
System.out.println("压缩后" + buf.length);
//将压缩后的数据输出到浏览器
response.setHeader("content-encoding","gzip");
response.setHeader("content-length",buf.length+"");
//服务端以字节方式输出
response.getOutputStream().write(buf);
}
}
结果
压缩前132
压缩后61
public class Demo3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//通知浏览器打开一副图片
response.setHeader("content-type","image/jpeg");
InputStream is = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\pic\\2.png"));
OutputStream os = response.getOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while( (len=is.read(buf))>0 ){
os.write(buf,0,len);
}
is.close();
os.close();
}
}
public class Demo4 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//服务端通知浏览器以下载的方式打开图片
response.setHeader("content-disposition","attachment;filename=d1.jpg");
InputStream is = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\pic\\2.png"));
OutputStream os = response.getOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while( (len=is.read(buf))>0 ){
os.write(buf,0,len);
}
is.close();
os.close();
}
}
public class Demo5 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//服务端通知浏览器3秒后转到目标页面
response.setHeader("refresh","3;url=/index.html");
}
}
public class Demo6 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//服务端控制各种浏览器禁止缓存页面资源
response.setHeader("expires","-1");
response.setHeader("cache-control","no-cache");
response.setHeader("pragma","no-cache");
//服务端向浏览器输出内容
response.getWriter().write("haha");
}
}
扩展
DNS(Domain Name Service)电信内部的一个域名和IP地址的映射关系.
在查询DNS之前,先查看本地操作系统对应的HOSTS文件,是否能找到对应的IP,如果能找到,不会查DNS了,只有在
查找不到的情况下,再连网找DNS服务器
CS结构:程序和数据分离在不同的端
BS结构:程序和数据绑定在服
上一篇: 老公天冷了,我给你买了双手套
推荐阅读
-
Telnet是什么意思又是什么协议 Telnet有什么作用及功能
-
在Nginx中增加对OAuth协议的支持的教程
-
Nginx中使用gzip_http_version解决CDN只支持http 1.0问题
-
Nginx HTTP:413 Request Entity Too Large解决方法
-
https协议是什么?有哪些优点?
-
nginx: [warn] "log_format" directive used only on "http" level 解决方法
-
Node.js http.createServer 简单服务配置
-
渗透测试 域名状态码协议讲解
-
生态协议 引领农业生态实现价值回归
-
微信小程序 http请求封装详解及实例代码