<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协议安全。