Http知識總結


原創itcats_cn 最後發佈於2018-09-02 16:10:37 閱讀數 386 收藏
展開
請求部分:
Http請求行分析:
Request URL: https://zhidao.baidu.com/ ------請求的url地址
Request Method: GET ------請求方式
Status Code: 200 OK ------響應狀態碼
Remote Address: 180.149.131.245:443 ------請求的ip地址與端口號
Referrer Policy: no-referrer-when-downgrade ------僅當發生協議降級
如 HTTPS 頁面引入 HTTP 資源,從 HTTPS 頁面跳到 HTTP 等)時不發送 Referrer 信息。這個規則是如今大部分瀏覽器默認所採用的;
 html

Http請求頭分析:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 ------接受的請求類型
Accept-Encoding: gzip, deflate, br ------壓縮格式
Accept-Language: zh-CN,zh;q=0.9 ------語言編碼格式
Connection: keep-alive ------Http1.1默認是長鏈接,Http1.0默認是短鏈接
Cookie: BAIDUID=6F807D31BA059DA4BE0DE2416FB5838B:FG=1; BDUSS=xtYVhLb35adUhnREtFTFIwZ2ltUjNMOXRITFNNVUY3TGUwWnMwdERMdzQxNTliQVFBQUFBJCQAAAAAAAAAAAEAAAA-1LOmx9q33LXEwtyyt9Prv9MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADhKeFs4SnhbN2; cflag=15%3A3; BIDUPSID=6F807D31BA059DA4BE0DE2416FB5838B; PSTM=1535862900; H_PS_PSSID=1463_21100_26350_22159
Host: zhidao.baidu.com ------host名稱
Referer: http://news.baidu.com/ ------請求來源 企業用做白名單黑名單、防盜鏈
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
 
HttpServletRequest對象
//HttpServletRequest對象做用是用於獲取請求數據。
//核心的API:
//請求行:
request.getMethod(); //請求方式
request.getRequetURI() //request.getRequetURL() 請求資源
request.getProtocol() //請求http協議版本

//請求頭:
request.getHeader("名稱") //根據請求頭獲取請求值
request.getHeaderNames() //獲取全部的請求頭名稱

//實體內容:
request.getInputStream() //獲取實體內容數據
 java

 

請求資源
  URL:  統一資源定位符。http://localhost:8080/mall/login.html。只能定位互聯網資源。是URI的子集。nginx

 URI: 統一資源標記符。/mall/login.html。用於標記任何資源。能夠是本地文件系統,局域網的資源(//192.168.4.65/myweb/index.html),能夠是互聯網資源。web

 

什麼是時間戳?
不少網站在發佈版本以前,都會在URL請求地址後面加上一個實現戳進行版本更新,使用時間戳防止瀏覽器緩存。apache

由於一些靜態資源在初次訪問時候先會從服務器中獲取資源(JS、圖片、Css等),狀態碼爲200。當第二次訪問一樣的資源時,若靜態資源在本地瀏覽器已緩存(經過靜態資源的請求地址來判斷是否已緩存),返回狀態碼304。且第二次訪問速度要比第一次快不少,由於省去了獲取靜態資源的時間,這是瀏覽器端的優化,它提升了響應速度,但也帶來一些問題。當你發佈新版本靜態資源的時候,如你更新圖片,但圖片的名稱與以前圖片名稱一致的話,瀏覽器不會向服務端獲取圖片,而是從本地緩存中獲得圖片。那麼會致使用戶沒法查看到最新的圖片資源。固然,能夠經過清理緩存處理,更合適的作法是在靜態資源後加入時間戳,那麼每次發佈後因爲更新先後時間戳不一樣,最新的資源總會從服務器端獲取。如<img src = "imgs/ads.png?t=2018-9-2"></img>跨域

 

防止非法連接(referer)——防盜鏈
防止A網站經過非法連接,盜用B網站的資源。如B網站有一個圖片資源爲: www.b.com/imgs/a.png,那麼經過設置防盜鏈後A網站不能直接訪問盜用www.b.com/imgs/a.png資源。瀏覽器

 

以上就是從b.b.com中盜用了a.a.com的資源。緩存

發生盜用的本質緣由就是:Referer來源地址與Request URL請求地址不一致。tomcat

解決辦法——防盜鏈機制安全

一、使用Java代碼控制請求來源資源判斷Referer,使用過濾器獲取請求頭的來源字段,判斷Referer是否爲a.a.com。

二、使用nginx反向代理解決防盜鏈

 

具體代碼實現:

package cn.itcats;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyFilter implements Filter{
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("MyFilter被初始化了");
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("------------------doFilter------------------");
HttpServletRequest req = (HttpServletRequest) request ;
HttpServletResponse res = (HttpServletResponse) response;
//獲取Referer
String referer = req.getHeader("Referer");
//獲取請求的服務名稱 a.a.com
String serverName = req.getServerName();
System.out.println("Referer:"+referer+" serverName:"+serverName);
//referer狀況爲不經過網站,直接訪問圖片,如 a.a.com/imgs/a.png
if(referer == null || ! referer.contains(serverName)){
//referer不包含serverName,爲盜用,顯示/imgs/error.png
req.getRequestDispatcher("error.png").forward(req, res);
return ;
}
//放行
chain.doFilter(req, res);
}

public void destroy() {

}

}
web.xml配置filter

<!-- 配置Filter -->
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>cn.itcats.MyFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/imgs/*</url-pattern>
</filter-mapping>
 

 

響應部分:
常見的響應頭
Location: http://www.itcats.cn/index.jsp   -表示重定向的地址,該頭和302的狀態碼一塊兒使用。

Server:apache tomcat                                 ---表示服務器的類型

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.itcats.cn              --表示定時刷新

Content-Disposition: attachment; filename=aaa.zip --表示告訴瀏覽器如下載方式打開資源(下載文件時用到)

Transfer-Encoding: chunked

Set-Cookie:SS=Q0=5Lb_nQ; path=/search   --表示服務器發送給瀏覽器的cookie信息(會話管理用到)

Expires: -1                                                      --表示通知瀏覽器不進行緩存

Cache-Control: no-cache

Pragma: no-cache

Connection: close/Keep-Alive           -       -表示服務器和瀏覽器的鏈接狀態。close:關閉鏈接 keep-alive:保存鏈接

 

狀態碼: 服務器處理請求的結果(狀態)
常見的狀態:

200:  表示請求處理完成並完美返回

302:   重定向

304:   讀取本地緩存

403: 參數錯誤

404:   表示客戶訪問的資源找不到。

500:   表示服務器的資源發送錯誤。(服務器內部錯誤)

502: 正在發佈
 

經常使用的響應API

//HttpServletResponse對象修改響應信息:
//響應行:
response.setStatus(int status) //設置狀態碼
//響應頭:
response.setHeader("name","value") //設置響應頭
//實體內容:
response.getWriter().writer(); // 發送字符實體內容
response.getOutputStream().writer() //發送字節實體內容
 

重定向實現原理
重定向的API:response.sendRedirect("ToServlet");本質上能夠替換成下面這兩句代碼:

response.setStatus(302);
response.setHeader("Location", "ToServlet");
服務器設置狀態碼爲302,且響應體中爲key爲"Location",瀏覽器經過判斷狀態碼爲302,尋找響應體中爲"Location"的key,發送二次請求到ToServlet,完成重定向。本質上對服務器端進行了兩次請求。

 

重定向與轉發的區別:
request.getRequestDispatcher()是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向後的地址;服務器內部轉發,整個過程處於同一個請求當中。
response.sendRedirect()則是徹底的跳轉,瀏覽器將會獲得跳轉的地址,並從新發送請求連接。這樣,從瀏覽器的地址欄中能夠看到跳轉後的連接地址。不在同一個請求。重定向,實際上客戶端會向服務器端發送兩個請求。
因此轉發中數據的存取能夠用request做用域:request.setAttribute(), request.getAttribute(),重定向是取不到request中的數據的。只能用session。

forward()更加高效,在能夠知足須要時,儘可能使用RequestDispatcher.forward()方法。

RequestDispatcher是經過調用HttpServletRequest對象的getRequestDispatcher()方法獲得的,是屬於請求對象的方法。
sendRedirect()是HttpServletResponse對象的方法,即響應對象的方法,既然調用了響應對象的方法,那就代表整個請求過程已經結束了,服務器開始向客戶端返回執行的結果。

重定向能夠跨域訪問,而轉發是在web服務器內部進行的,不能跨域訪問。
 

Http與Https區別
    一、https 協議須要到CA (Certificate Authority)申請證書,通常免費證書較少,於是須要必定費用。

 二、http 是超文本傳輸協議,信息是明文傳輸,https 則是具備安全性的 ssl 加密傳輸協議。

 三、http 和 https 使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是 80,後者是 443。

 四、http 的鏈接很簡單,是無狀態的;HTTPS 協議是由 SSL+HTTP 協議構建的可進行加密傳輸、身份認證的網絡協議,比 http 協議安全。

 

https工做原理?
咱們都知道 HTTPS 可以加密信息,以避免敏感信息被第三方獲取,因此不少銀行網站或電子郵箱等等安全級別較高的服務都會採用 HTTPS 協議。

 客戶端在使用 HTTPS 方式與 Web 服務器通訊時有如下幾個步驟,如圖所示。

  (1)客戶使用 https 的 URL 訪問 Web 服務器,要求與 Web 服務器創建 SSL 鏈接。

  (2)Web 服務器收到客戶端請求後,會將網站的證書信息(證書中包含公鑰)傳送一份給客戶端。

  (3)客戶端的瀏覽器與 Web 服務器開始協商 SSL 鏈接的安全等級,也就是信息加密的等級。

  (4)客戶端的瀏覽器根據雙方贊成的安全等級,創建會話密鑰,而後利用網站的公鑰將會話密鑰加密,並傳送給網站。

  (5)Web 服務器利用本身的私鑰解密出會話密鑰。

  (6)Web 服務器利用會話密鑰加密與客戶端之間的通訊。

 

 
https優缺點?
 雖說 HTTPS 有很大的優點,但其相對來講,仍是存在不足之處的:

  (1)HTTPS 協議握手階段比較費時,會使頁面的加載時間延長近 50%,增長 10% 到 20% 的耗電;

  (2)HTTPS 鏈接緩存不如 HTTP 高效,會增長數據開銷和功耗,甚至已有的安全措施也會所以而受到影響;

  (3)SSL 證書收費,功能越強大的證書費用越高,我的網站、小網站沒有必要通常不會用。

    (4)SSL 證書一般須要綁定 IP,不能在同一 IP 上綁定多個域名,IPv4 資源不可能支撐這個消耗。

  (5)HTTPS 協議的加密範圍也比較有限,在黑客攻擊、拒絕服務攻擊、服務器劫持等方面幾乎起不到什麼做用。最關鍵的,SSL 證書的信用鏈體系並不安全,特別是在某些國家能夠控制 CA 根證書的狀況下,中間人攻擊同樣可行。

 

 

http長鏈接與短鏈接
長鏈接與短鏈接的操做過程 


一般的短鏈接操做步驟是: 
鏈接(三次握手)→數據傳輸→關閉鏈接(四次揮手);

而長鏈接一般就是: 
鏈接(三次握手)→數據傳輸→保持鏈接(心跳)→數據傳輸→保持鏈接(心跳)→……→關閉鏈接(四次揮手); 

這就要求長鏈接在沒有數據通訊時,定時發送數據包(心跳),以維持鏈接狀態,
短鏈接在沒有數據傳輸時直接關閉就好了

長鏈接何時關閉?
一、配置失效心跳檢測時間,客戶端沒有繼續創建鏈接,直接關閉。

二、客戶端主動關閉

三、tomcat服務器配置長鏈接超時時間20分鐘

四、設置響應頭Keep-Alive: timeout。這個值可以讓一些瀏覽器主動關閉鏈接,這樣服務器就沒必要要去關閉鏈接了。

長鏈接和短鏈接的使用場景
長鏈接:Http1.1默認使用長鏈接,通常網址都是用長鏈接、rpc遠程調用——dubbo底層經過netty使用長鏈接、移動端APP消息推送等。

短鏈接:調用別人的接口,使用不是特別頻繁,通常使用短鏈接————————————————版權聲明:本文爲CSDN博主「itcats_cn」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。原文連接:https://blog.csdn.net/itcats_cn/article/details/82314541

相關文章
相關標籤/搜索