作java web的,怎么能不熟悉http。能够说这是对web开发最重要的一条协议,面试的时候也不免会被问到这个问题,因此必须深入了解这个协议。html
首先咱们要知道什么是协议,协议就是一系列的信息交换规则。只有彻底符合规则,两个相互独立的系统才能交互。显然http也是这样的。java
它中文叫作超文本传输协议,它是无状态的协议,它是属于七层结构里的最上层--应用层的协议,它的默认端口是80,它的目前版本是HTTP/1.1,它是本质上也是基于文本流的(固然有时候也会有一些Media类型的)。web
URL是用来惟一肯定网上资源的,它的格式如上图所示。面试
http中,分Client和Server,因此说HTTP是基于TCP的。通常来讲是Client发起请求,Server相应。具体来讲:通常是用于用户给浏览器发请求,而后浏览器将请求组成一个符合http协议的报文发送给服务器,服务器根据http规则来解析出请求报文,而后再将返回信息一样组织成http响应报文,发送给浏览器,最后浏览器呈现给用户。chrome
上图是chrome-F12下能够看到的内容,先看request head,http的消息分为消息头,和消息体,通常消息体是空的。消息头包含都是一些元数据(不是用户相关的),好比编码信息等,在REST风格下,请求头比请求体重要。那么能够看到第一句就是"GET /yl0822/ HTTP/1.1",GET指的是请求方法:浏览器
① GET:这是最简单的http请求方法,点击链接的时候默认使用的就是GET,它就是让Server把请求的资源给客户端,而且不作任何修改,也就是说是只读的,因此对于资源操做来讲,它是安全的。并且GET有很明显的一点就是query String会显示在url里面,这是很是不安全的,因此安全性要求不高的能够用GET。tomcat
② 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。
说的很简单,实现起来其实也简单,下面实现一个简单的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(全称: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之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通信方法,如今它被普遍用于万维网上安全敏感的通信,例如网银支付方面。
1、https协议须要到ca申请证书,通常免费证书不多,须要交费。https 能够是按单个域名购买费用,若是全站都作https费用会比较高。
2、http是超文本传输协议,信息是明文传输,https 则是具备安全性的ssl加密传输协议。
3、http和https使用的是彻底不一样的链接方式,用的端口也不同,前者是80,后者是443。
4、http的链接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
5、https是在外网传输节点上进行加密已防止信息被第三方窃听或篡改。HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。