URI结构
格式: [scheme:][//host:port][path][?query][#fragment]
例子:http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic
对应:
scheme:http
scheme-specific-part://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4
fragment:harvic
authority:www.java2s.com:8080
query:stove=10&path=32&id=4
path:/yourpath/fileName.htm
host:www.java2s.com
port:8080
Request
HTTP的请求包括:请求行(request line)、请求头部(header)、空行 和 请求数据 四个部分组成。
举例:
Host: www.cnblogs.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Proxy-Connection: keep-alive Cookie: ASP.NET_SessionId=ey5drq45lsomio55hoydzc45 Cache-Control: max-age=0
-
请求行以一个方法符号开头,以空格分开,后面跟着请求的URL和协议的版本。
-
请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息
-
空行,请求头部后面的空行是必须的。即使第四部分的请求数据为空,也必须有空行。
-
请求数据也叫主体,可以添加任意的其他数据。
HTTP请求方法
首部字段
-
通用首部字段(General Header Fields)
代表请求报文和响应报文都会使用的字段
-
请求首部字段(Request Header Fields)
是客户端向服务端发送请求时使用的首部字段。包含请求的附加内容、客户端信息、响应内容相关优先级等信息。
-
响应首部字段(Response Header Fields)
是服务端向客户端返回响应时使用的首部字段,包含响应的附加内容,可能也会要求客户端附加额外的内容信息。
-
实体首部字段(Entity Header Fields)
是针对请求报文和响应报文的实体部分使用的首部。包含资源内容更新时间等和实体有关的信息。
-
其他首部字段
Cookie、Set-Cookie、Content-Disposition、Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Trailer、TE、Transfer-Encoding、Upgrade etc...
Response
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
-
状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
-
消息报头,用来说明客户端要使用的一些附加信息
-
空行,消息报头后面的空行是必须的
-
响应正文,服务器返回给客户端的文本信息。
HTTP之状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态码:
200:请求被正常处理 204:请求被受理但没有资源可以返回 206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源。 301:永久性重定向 302:临时重定向 303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上 304:发送附带条件的请求时,条件不满足时返回,与重定向无关 307:临时重定向,与302类似,只是强制要求使用POST方法 400:请求报文语法有误,服务器无法识别 401:请求需要认证 403:请求的对应资源禁止被访问 404:服务器无法找到对应资源 500:服务器内部错误 503:服务器正忙
HTTPS
HTTP的server端口号为80,HTTPS的为443
HTTPS工作原理
1、首先HTTP请求服务端生成证书,客户端对证书的有效期、合法性、域名是否与请求的域名一致、证书的公钥(RSA加密)等进行校验;
2、客户端如果校验通过后,就根据证书的公钥的有效, 生成随机数,随机数使用公钥进行加密(RSA加密);
3、消息体产生的后,对它的摘要进行MD5(或者SHA1)算法加密,此时就得到了RSA签名;
4、发送给服务端,此时只有服务端(RSA私钥)能解密。
5、解密得到的随机数,再用AES加密,作为密钥(此时的密钥只有客户端和服务端知道)。
具体的参考: 链接
常见问题
Cookie和Session的区别和联系
Cookie和Session都是为了保存客户端和服务端之间的交互状态,实现机制不同,各有优缺点。首先一个最大的区别就是Cookie是保存在客户端而Session就保存在服务端的。Cookie是客户端请求服务端时服务器会将一些信息以键值对的形式返回给客户端,保存在浏览器中,交互的时候可以加上这些Cookie值。用Cookie就可以方便的做一些缓存。Cookie的缺点是大小和数量都有限制;Cookie是存在客户端的可能被禁用、删除、篡改,是不安全的;Cookie如果很大,每次要请求都要带上,这样就影响了传输效率。Session是基于Cookie来实现的,不同的是Session本身存在于服务端,但是每次传输的时候不会传输数据,只是把代表一个客户端的唯一ID(通常是JSESSIONID)写在客户端的Cookie中,这样每次传输这个ID就可以了。Session的优势就是传输数据量小,比较安全。但是Session也有缺点,就是如果Session不做特殊的处理容易失效、过期、丢失或者Session过多导致服务器内存溢出,并且要实现一个稳定可用安全的分布式Session框架也是有一定复杂度的。在实际使用中就要结合Cookie和Session的优缺点针对不同的问题来设计解决方案。
GET和POST的区别
A. 从字面意思和HTTP的规范来看,GET用于获取资源信息而POST是用来更新资源信息。
B. GET提交请求的数据实体会放在URL的后面,用?来分割,参数用&连接,举个栗子:/index.html?name=wang&login=1。POST方法是把提交的数据放在HTTP包的Body中.
C. GET提交的数据长度是有限制的,因为URL长度有限制,具体的长度限制视浏览器而定。而POST没有。
D. GET提交的数据不安全,因为参数都会暴露在URL上。