<Web> Web开发都应该知道HTTP

前言

  做java web的,怎么能不熟悉http。可以说这是对web开发最重要的一条协议,面试的时候也难免会被问到这个问题,所以必须深刻了解这个协议。

HTTP简单介绍

  首先我们要知道什么是协议,协议就是一系列的信息交换规则。只有完全符合规则,两个相互独立的系统才能交互。显然http也是这样的。

  它中文叫做超文本传输协议,它是无状态的协议,它是属于七层结构里的最上层--应用层的协议,它的默认端口是80,它的目前版本是HTTP/1.1,它是本质上也是基于文本流的(当然有时候也会有一些Media类型的)。

URL简介

  

  URL是用来唯一确定网上资源的,它的格式如上图所示。

  http中,分Client和Server,所以说HTTP是基于TCP的。一般来说是Client发起请求,Server相应。具体来说:一般是用于用户给浏览器发请求,然后浏览器将请求组成一个符合http协议的报文发送给服务器,服务器根据http规则来解析出请求报文,然后再将返回信息同样组织成http响应报文,发送给浏览器,最后浏览器呈现给用户。

HTTP一般介绍

  

  上图是chrome-F12下可以看到的内容,先看request head,http的消息分为消息头,和消息体,一般消息体是空的。消息头包含都是一些元数据(不是用户相关的),比如编码信息等,在REST风格下,请求头比请求体重要。那么可以看到第一句就是"GET /yl0822/ HTTP/1.1",GET指的是请求方法:

  ① GET:这是最简单的http请求方法,点击连接的时候默认使用的就是GET,它就是让Server把请求的资源给客户端,并且不做任何修改,也就是说是只读的,所以对于资源操作来说,它是安全的。而且GET有很明显的一点就是query String会显示在url里面,这是非常不安全的,所以安全性要求不高的可以用GET。

  ② POST:用于你想要在服务器处理请求,它将请求数据写在消息体里面,所以是比较安全的。

  ③ DELETE、PUT:不做介绍,可以用POST代替,所以从来没用过。

  /yl0822/是路由,指向请求目标,HTTP/1.1是协议版本。

  Host是主机地址,实际上是IP地址,为方便记忆才用cnblogs、baidu、google啥的,没写端口是因为默认就是80。其他键值对都是客户端对请求的约束。

  再看response,和请求不一样,对响应来说响应体是非常重要的,因为它就是你看到的网页,响应头中有两个要注意的,其一就是stateCode,各种状态码代表着什么意思,网上有很多了,这里就不赘述了。另外一个就是Content-Type,表示请求的返回类型,一般的有"text/html"、"text/plain"、"image/gif"、"image/jpeg"、"video/mpeg"等等。

  

  标准的Http请求和响应中间都是隔着一行空行的,叫Blank Line。以这个来识别head和body。

实现一个简单的Server

  说的很简单,实现起来其实也简单,下面实现一个简单的Http服务器。

 1 import java.io.BufferedReader;
 2 import java.io.InputStreamReader;
 3 import java.io.PrintWriter;
 4 import java.net.ServerSocket;
 5 import java.net.Socket;
 6 
 7 public final class SimpleServer {
 8     public static void main(String[] args) throws Exception{
 9         //a port is needed
10         int port = 80;
11         //Establish the listen socket
12         ServerSocket serverSocket = new ServerSocket(port);
13         //Process HTTP Service requests in an infinite loop
14         System.out.println("waiting for connect...");
15         while (true){
16             //listen for a tcp connection request
17             Socket socket = serverSocket.accept();
18             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
19             PrintWriter out = new PrintWriter(socket.getOutputStream());
20             /**
21              * 读取请求head信息,
22              * */
23             String str = ".";
24             while (!str.equals("")){
25                 str = in.readLine();
26                 System.out.println(str);
27             }
28 
29             //返回请求响应
30             String response = "<html><head>" +
31                     "<title>Simpl Web Page</title></head>\n" +
32                     "<h1>Congratulations!!!</h1>\n" +
33                     "<h3>This page was returned by " + "localhost" + "</h3>\n" +
34                     "<p>This is the first page hosted by your web server.\n</p>" +
35                     "Visit <A HREF=\"http://www.techwiki.ordak.org\"> http://www.techwiki.ordak.org</A> for more sample codes.\n" +
36                     "</html>\n";
37             out.println("HTTP/1.1 200 OK");
38             out.println("Content-Type: text/html");
39             out.println("Server: SimpleServer");
40             out.println("Content-length: "+response.length());
41             //this blank line signals the end of the headers
42             out.println("");
43             out.println(response);
44             out.flush();
45             socket.close();
46          }
47     }
48 }

  然后在浏览器输入localhost即可看到响应了。如果有时间的话,大家可以看下tomcat或jetty的源码,里面对http协议的解析做的非常到位,也给了许多接口来获取和修改http的设置。

HTTPS是什么

  HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。

https和http的区别

  https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如网银支付方面。

  一、https协议需要到ca申请证书,一般免费证书很少,需要交费。https 可以是按单个域名购买费用,如果全站都做https费用会比较高。

  二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

  三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

  四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

  五、https是在外网传输节点上进行加密已防止信息被第三方窃听或篡改。HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

posted @ 2015-04-07 13:36  丶千纸鸢  阅读(259)  评论(0编辑  收藏  举报