欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HTTP协议

程序员文章站 2022-06-28 15:53:16
...


HTTP1.0和HTTP1.1的区别

超文本的传输协议,是基于TCP/UDP协议(底层)

HTTP/1.0
一次用户请求,服务端响应后,立即断开

在HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源。

HTTP/1.1
一次用户请求,服务端响应后,会保持一定的时间,在该一定时间后,用户可以再次请求

允许客户端与web服务器建立连接后,在一个连接上获取多个web资源

 

浏览器与服务器交互图

HTTP协议

 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");
	}
}


 

 

HTTP协议

 

 

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

HTTP协议

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();
		
	}
}

 

HTTP协议

 

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();
	}
}

HTTP协议

 

 

 

 

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结构:程序和数据绑定在服