整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          十分鐘能看清-HTTP詳解-請求、響應、緩存

          . HTTP請求格式

          做過Socket編程的人都知道,當我們設計一個通信協議時,“消息頭/消息體”的分割方式是很常用的,消息頭告訴對方這個消息是干什么的,消息體告訴對 方怎么干。HTTP協議傳輸的消息也是這樣規定的,每一個HTTP包都分為HTTP頭和HTTP體兩部分,消息體是可選的,而消息頭是必須的。每當我們打 開一個網頁,在上面點擊右鍵,選擇“查看源文件”,這時看到的HTML代碼就是HTTP的消息體,那么消息頭可以通過瀏覽器的開發工具或者插件可以看到, 如果火狐的Firebug,IE的Httpwatch。

          客戶端通過發送 HTTP 請求向服務器請求對資源的訪問。 它向服務器傳遞了一個數據塊,也就是請求信息,HTTP 請求由三部分組成:請求行、 請求頭和請求正文。

          請求行:請求方法 URI 協議/版本

          請求頭(Request Header)

          請求正文

          下面是一個HTTP請求的數據:

          POST /index.php HTTP/1.1

          Host: localhost

          User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2

          Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

          Accept-Language: zh-cn,zh;q=0.5

          Accept-Encoding: gzip, deflate

          Connection: keep-alive

          Referer: http://localhost/

          Content-Length:25

          Content-Type:application/x-www-form-urlencoded

          username=aa&password=1234

          1、請求行:請求方法URI協議/版本

          請求的第一行是“方法 URL 協議/版本”,并以 回車換行作為結尾。請求行以空格分隔。格式如下:

          POST /index.php HTTP/1.1

          以上代碼中“GET”代表請求方法,“//ndex.php”表示URI,“HTTP/1.1代表協議和協議的版本。

          根據HTTP標準,HTTP請求可以使用多種請求方法。例如:HTTP1.1支持7種請求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet應用中,最常用的方法是GET和POST。

          URL完整地指定了要訪問的網絡資源,通常只要給出相對于服務器的根目錄的相對目錄即可,因此總是以“/”開頭,最后,協議版本聲明了通信過程中使用HTTP的版本。

          請求方法

          在 HTTP 協議中,HTTP 請求可以使用多種請求方法,這些方法指明了要以何種方式來訪問 Request-URI 所標識的資源。HTTP1.1 支持的請求方法如下表所示:

          HTTP1.1 中的請求方式:

          方法

          作用

          GET

          請求獲取由 Request-URI 所標識的資源

          POST

          請求服務器接收在請求中封裝的實體,并將其作為由 Request-Line 中的 Request-URI 所標識的資源的一部分

          HEAD

          請求獲取由 Request-URI 所標識的資源的響應消息報頭

          PUT

          請求服務器存儲一個資源,并用 Request-URI 作為其標識符

          DELETE

          請求服務器刪除由 Request-URI 所標識的資源

          TRACE

          請求服務器回送到的請求信息,主要用于測試或診斷

          CONNECT

          保留將來使用

          OPTIONS

          請求查詢服務器的性能,或者查詢與資源相關的選項和需求

          重點介紹 GET、POST 和 HEAD 三個方法:

          (1)GET

          GET 方法用于獲取由 Request-URI 所標識的資源的信息,常見的形式是:

          GET Request-URI HTTP/1.1

          GET方法是默認的HTTP請求方法,例如當我們通過在瀏覽器的地址欄中直接輸入網址的方式去訪問網頁的時候,瀏覽器采用的就是 GET 方法向服務器獲取資源。

          我們可以使用GET方法來提交表單數據,用GET方法提交的表單數據只經過了簡單的編碼,同時它將作為URL的一部分向服務器發送,因此,如果使用GET方法來提交表單數據就存在著安全隱患上。例如:

          Http://localhost/login.php?username=aa&password=1234

          從上面的URL請求中,很容易就可以辯認出表單提交的內容。(?之后的內容)另外由于GET方法提交的數據是作為URL請求的一部分所以提交的數據量不能太大。這是因為瀏覽器對url的長度有限制

          各種瀏覽器也會對url的長度有所限制,下面是幾種常見瀏覽器的url長度限制:(單位:字符)

          IE : 2803

          Firefox:65536

          Chrome:8182

          Safari:80000

          Opera:190000

          (2)POST

          POST方法是GET方法的一個替代方法,它主要是向Web服務器提交表單數據,尤其是大批量的數據。 在請求頭信息結束之后的兩個回車換行之后(實際是空一行),就是表單提交的數據。如上面提到的post表單數據:

          username=aa&password=1234

          POST方法克服了GET方法的一些缺點。通過POST方法提交表單數據時,數據不是作為URL請求的一部分而是作為標準數據傳送給Web服務器,這就克 服了GET方法中的信息無法保密和數據量太小的缺點。因此,出于安全的考慮以及對用戶隱私的尊重,通常表單提交時采用POST方法。

            從編程的角度來講,如果用戶通過GET方法提交數據,則數據存放在QUERY_STRING環境變量中,而POST方法提交的數據則可以從標準輸入流中獲取。

          GET與POST方法有以下區別:

          1、 在客戶端,Get方式在通過URL提交數據,數據在URL中可以看到;POST方式,數據放在HTTP包的body中。

          2、 GET方式提交的數據大小有限制(因為瀏覽器對URL的長度有限制),而POST則沒有此限制。

          3、安全性問題。正如在(1)中提到,使用 Get 的時候,參數會顯示在地址欄上,而 Post 不會。所以,如果這些數據是中文數據而且是非敏感數據,那么使用 get;如果用戶輸入的數據不是中文字符而且包含敏感數據,那么還是使用 post為好。

          4.、服務器取值方式不一樣。GET方式取值,如php可以使用$_GET來取得變量的值,而POST方式通過$_POST來獲取變量的值。

          (3)HEAD

          HEAD 方法與 GET 方法幾乎是相同的,它們的區別在于 HEAD 方法只是請求消息報頭,而不是完整的內容。對于 HEAD 請求的回應部分來說,它的 HTTP 頭部中包含的信息與通過 GET 請求所得到的信息是相同的。利用這個方法,不必傳輸整個資源內容,就可以得到 Request-URI 所標識的資源的信息。這個方法通常被用于測試超鏈接的有效性,是否可以訪問,以及最近是否更新。

          要注意的是,在 HTML 文檔中,書寫 get 和 post,大小寫都可以,但在 HTTP 協議中的 GET 和 POST 只能是大寫形式。

          2. 請求頭

          每個頭域由一個域名,冒號(:)和域值三部分組成。域名是大小寫無關的,域值前可以添加任何數量的空格符,頭域可以被擴展為多行,在每行開始處,使用至少一個空格或制表符。

          HTTP最常見的請求頭如下:

          Transport 頭域

          Connection:

          作用:表示是否需要持久連接。

          如果服務器看到這里的值為“Keep-Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認進行持久連接),它就可以利用持久連接的優點,當頁面包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。要實現這一點,服務器需要在應答中發送一個Content-Length頭,最簡單的實現方法是:先把內容寫入 ByteArrayOutputStream,然后在正式寫出內容之前計算它的大小;

          例如: Connection: keep-alive 當一個網頁打開完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的 網頁,會繼續使用這一條已經建立的連接

          例如: Connection: close 代表一個Request完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接會關閉, 當客戶端再次發送Request,需要重新建立TCP連接。

          Host(發送請求時,該報頭域是必需的)

          Host請求報頭域主要用于指定被請求資源的Internet主機和端口號,它通常從HTTP URL中提取出來的。

          eg:http://;localhost/index.html

          瀏覽器發送的請求消息中,就會包含Host請求報頭域,如下:

          Host:localhost

          此處使用缺省端口號80,若指定了端口號8080,則變成:Host:localhost:8080

          Client 頭域

          Accept:

          作用:瀏覽器可以接受的媒體類型(MIME類型),

          例如: Accept: text/html 代表瀏覽器可以接受服務器回發的類型為 text/html 也就是我們常說的html文檔, 如果服務器無法返回text/html類型的數據,服務器應該返回一個406錯誤(non acceptable)。

          通配符 * 代表任意類型。例如 Accept: */* 代表瀏覽器可以處理所有類型,(一般瀏覽器發給服務器都是發這個)

          Accept-Encoding:

          作用: 瀏覽器申明自己接收的編碼方法,通常指定壓縮方法,是否支持壓縮,支持什么壓縮方法(gzip,deflate),(注意:這不是只字符編碼);

          例如: Accept-Encoding: gzip, deflate。Server能夠向支持gzip/deflate的瀏覽器返回經gzip或者deflate編碼的HTML頁面。 許多情形下這可以減少5到10倍的下載時間,也節省帶寬。

          Accept-Language:

          作用: 瀏覽器申明自己接收的語言。

          語言跟字符集的區別:中文是語言,中文有多種字符集,比如big5,gb2312,gbk等等;

          例如: Accept-Language:zh-cn 。如果請求消息中沒有設置這個報頭域,服務器假定客戶端對各種語言都可以接受。

          User-Agent:

          作用:告訴HTTP服務器, 客戶端使用的操作系統和瀏覽器的名稱和版本.

          我們上網登陸論壇的時候,往往會看到一些歡迎信息,其中列出了你的操作系統的名稱和版本,你所使用的瀏覽器的名稱和版本,這往往讓很多人感到很神 奇,實際上, 服務器應用程序就是從User-Agent這個請求報頭域中獲取到這些信息User-Agent請求報頭域允許客戶端將它的操作系統、瀏覽 器和其它屬性告訴服務器。

          例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)

          Accept-Charset:

          作用:瀏覽器申明自己接收的字符集,這就是本文前面介紹的各種字符集和字符編碼,如gb2312,utf-8(通常我們說Charset包括了相應的字符編碼方案);

          例如:Accept-Charset:iso-8859-1,gb2312.如果在請求消息中沒有設置這個域,缺省是任何字符集都可以接受。

          Authorization:授權信息,通常出現在對服務器發送的WWW-Authenticate頭的應答中;

          Authorization請求報頭域主要用于證明客戶端有權查看某個資源。當瀏覽器訪問一個頁面時,如果收到服務器的響應代碼為401(未授權),可以發送一個包含Authorization請求報頭域的請求,要求服務器對其進行驗證。

          Cookie/Login 頭域

          Cookie:

          作用: 最重要的header, 將cookie的值發送給HTTP 服務器

          Entity頭域

          Content-Length

          作用:發送給HTTP服務器數據的長度。即請求消息正文的長度;

          例如: Content-Length: 38

          Content-Type:

          作用:

          例如:Content-Type: application/x-www-form-urlencoded

          Miscellaneous 頭域

          Referer:

          作用: 提供了Request的上下文信息的服務器,告訴服務器我是從哪個鏈接過來的,比如從我主頁上鏈接到一個朋友那里, 他的服務器就能夠從HTTP Referer中統計出每天有多少用戶點擊我主頁上的鏈接訪問 他的網站。

          例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT

          Cache 頭域

          If-Modified-Since:

          作用: 把瀏覽器端緩存頁面的最后修改時間發送到服務器去,服務器會把這個時間與服務器上實際文件的最后修改時間進行對比。如果時間一致,那么返回304,客戶端 就直接使用本地緩存文件。如果時間不一致,就會返回200和新的文件內容。客戶端接到之后,會丟棄舊文件,把新文件緩存起來,并顯示在瀏覽器中。

          例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT。

          If-None-Match:

          作用: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 當用戶再次請求該資源時,將在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服務器驗證資源的ETag沒有改變(該資源沒有更新),將返回一個304狀態告訴客戶端使用 本地緩存文件。否則將返回200狀態和新的資源和Etag. 使用這樣的機制將提高網站的性能

          例如: If-None-Match: "03f2b33c0bfcc1:0"

          Pragma:

          作用: 防止頁面被緩存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一樣

          Pargma只有一個用法, 例如: Pragma: no-cache

          注意: 在HTTP/1.0版本中,只實現了Pragema:no-cache, 沒有實現Cache-Control

          Cache-Control:

          作用: 這個是非常重要的規則。 這個用來指定Response-Request遵循的緩存機制。各個指令含義如下

          Cache-Control:Public 可以被任何緩存所緩存()

          Cache-Control:Private 內容只緩存到私有緩存中

          Cache-Control:no-cache 所有內容都不會被緩存

          2. HTTP響應格式

          在接收和解釋請求消息后,服務器會返回一個 HTTP 響應消息。與 HTTP 請求類似,HTTP 響應也是由三個部分組成,分別是:狀態行、消息報頭和響應正文。如:

          HTTP/1.1 200 OK

          Date: Sun, 17 Mar 2013 08:12:54 GMT

          Server: Apache/2.2.8 (Win32) PHP/5.2.5

          X-Powered-By: PHP/5.2.5

          Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/

          Expires: Thu, 19 Nov 1981 08:52:00 GMT

          Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

          Pragma: no-cache

          Content-Length: 4393

          Keep-Alive: timeout=5, max=100

          Connection: Keep-Alive

          Content-Type: text/html; charset=utf-8

          <html>

          <head>

          <title>HTTP響應示例<title>

          </head>

          <body>

          Hello HTTP!

          </body>

          </html>

          1、狀態行

          狀態行由協議版本、數字形式的狀態代碼,及相應的狀態描述組成,各元素之間以空格分隔,結尾時回車換行符,格式如下:

          HTTP-Version Status-Code Reason-Phrase CRLF

          HTTP-Version 表示服務器 HTTP 協議的版本,Status-Code 表示服務器發回的響應代碼,Reason-Phrase 表示狀態代碼的文本描述,CRLF 表示回車換行。例如:

          HTTP/1.1 200 OK (CRLF)

          狀態代碼與狀態描述

          狀態代碼由 3 位數字組成, 表示請求是否被理解或被滿足,狀態描述給出了關于狀態碼的簡短的文字描述。狀態碼的第一個數字定義了響應類別,后面兩位數字沒有具體分類。第一個數字有 5 種取值,如下所示。

          • 1xx:指示信息——表示請求已經接受,繼續處理
          • 2xx:成功——表示請求已經被成功接收、理解、接受。
          • 3xx:重定向——要完成請求必須進行更進一步的操作
          • 4xx:客戶端錯誤——請求有語法錯誤或請求無法實現
          • 5xx:服務器端錯誤——服務器未能實現合法的請求。

          常見狀態代碼、狀態描述、說明:

          200 OK //客戶端請求成功

          400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解

          401 Unauthorized //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用

          403 Forbidden //服務器收到請求,但是拒絕提供服務

          404 Not Found //請求資源不存在,eg:輸入了錯誤的URL

          500 Internal Server Error //服務器發生不可預期的錯誤

          503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間后可能恢復正常

          2、響應正文

          響應正文就是服務器返回的資源的內容,響應頭和正文之間也必須用空行分隔。如:

          1. <html>
          2. <head>
          3. <title>HTTP響應示例<title>
          4. </head>
          5. <body>
          6. Hello HTTP!
          7. </body>
          8. </html>

          3 、響應頭信息

          HTTP最常見的響應頭如下所示:

          Cache頭域

          Date:

          作用:生成消息的具體時間和日期,即當前的GMT時間。

          例如: Date: Sun, 17 Mar 2013 08:12:54 GMT

          Expires:

          作用: 瀏覽器會在指定過期時間內使用本地緩存,指明應該在什么時候認為文檔已經過期,從而不再緩存它。

          例如: Expires: Thu, 19 Nov 1981 08:52:00 GMT  

          Vary

          作用:

          例如: Vary: Accept-Encoding

          Cookie/Login 頭域

          P3P

          作用: 用于跨域設置Cookie, 這樣可以解決iframe跨域訪問cookie的問題

          例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

          Set-Cookie

          作用: 非常重要的header, 用于把cookie 發送到客戶端瀏覽器, 每一個寫入cookie都會生成一個Set-Cookie.

          例如: Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/

          Entity實體頭域:

          實體內容的屬性,包括實體信息類型,長度,壓縮方法,最后一次修改時間,數據有效性等。

          ETag:

          作用: 和If-None-Match 配合使用。 (實例請看上節中If-None-Match的實例)

          例如: ETag: "03f2b33c0bfcc1:0"

          Last-Modified:

          作用: 用于指示資源的最后修改日期和時間。(實例請看上節的If-Modified-Since的實例)

          例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT

          Content-Type:

          作用:WEB服務器告訴瀏覽器自己響應的對象的類型和字符集,

          例如:

          Content-Type: text/html; charset=utf-8

            Content-Type:text/html;charset=GB2312

            Content-Type: image/jpeg

          Content-Length:

          指明實體正文的長度,以字節方式存儲的十進制數字來表示。在數據下行的過程中,Content-Length的方式要預先在服務器中緩存所有數據,然后所有數據再一股腦兒地發給客戶端。

            例如: Content-Length: 19847

          Content-Encoding:

          作用:文檔的編碼(Encode)方法。一般是壓縮方式。

          WEB服務器表明自己使用了什么壓縮方法(gzip,deflate)壓縮響應中的對象。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載時間。

          例如:Content-Encoding:gzip

          Content-Language:

          作用: WEB服務器告訴瀏覽器自己響應的對象的語言者

          例如: Content-Language:da

          Miscellaneous 頭域

          Server:

          作用:指明HTTP服務器的軟件信息

          例如:Apache/2.2.8 (Win32) PHP/5.2.5

          X-Powered-By:

          作用:表示網站是用什么技術開發的

          例如: X-Powered-By: PHP/5.2.5

          Transport頭域

          Connection:

          例如: Connection: keep-alive 當一個網頁打開完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接

          例如: Connection: close 代表一個Request完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接會關閉, 當客戶端再次發送Request,需要重新建立TCP連接。

          Location頭域

          Location:

          作用: 用于重定向一個新的位置, 包含新的URL地址

          實例請看304狀態實例

          HTTP協議是無狀態的和Connection: keep-alive的區別

            無狀態是指協議對于事務處理沒有記憶能力,服務器不知道客戶端是什么狀態。從另一方面講,打開一個服務器上的網頁和你之前打開這個服務器上的網頁之間沒有任何聯系。

            HTTP是一個無狀態的面向連接的協議,無狀態不代表HTTP不能保持TCP連接,更不能代表HTTP使用的是UDP協議(無連接)。

            從HTTP/1.1起,默認都開啟了Keep-Alive,保持連接特性,簡單地說,當一個網頁打開完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接。

            Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的服務器軟件(如Apache)中設定這個時間。

          3. 瀏覽器緩存

          瀏覽器緩存:包括頁面html緩存和圖片js,css等資源的緩存。如下圖,瀏覽器緩存是基于把頁面信息保存到用戶本地電腦硬盤里。

          1、緩存的優點:

          1)服務器響應更快:因為請求從緩存服務器(離客戶端更近)而不是源服務器被相應,這個過程耗時更少,讓服務器看上去響應更快。

          2)減少網絡帶寬消耗:當副本被重用時會減低客戶端的帶寬消耗;客戶可以節省帶寬費用,控制帶寬的需求的增長并更易于管理。

          2、緩存工作原理

          頁面緩存狀態是由http header決定的,一個瀏覽器請求信息,一個是服務器響應信息。主要包括Pragma: no-cache、Cache-Control、 Expires、 Last-Modified、If-Modified-Since。其中Pragma: no-cache由HTTP/1.0規定,Cache-Control由HTTP/1.1規定。

          工作原理圖:

          從圖中我們可以看到原理主要分三步:

          1. 第一次請求:瀏覽器通過http的header報頭,附帶Expires,Cache-Control,Last-Modified/Etag向服務器請求,此時服務器記錄第一次請求的Last-Modified/Etag
          2. 再次請求:當瀏覽器再次請求的時候,請求頭附帶Expires,Cache-Control,If-Modified-Since/Etag向服務器請求
          3. 服務器根據第一次記錄的Last-Modified/Etag和再次請求的If-Modified-Since/Etag做對比,判斷是否需要更新,服務器通過這兩個頭判斷本地資源未發生變化,客 戶端不需要重新下載,返回304響應。常見流程如下圖所示:

          與緩存相關的HTTP擴展消息頭

          Expires:設置頁面過期時間,格林威治時間GMT

          Cache-Control:更細致的控制緩存的內容

          Last-Modified:請求對象最后一次的修改時間 用來判斷緩存是否過期 通常由文件的時間信息產生

          ETag:響應中資源的校驗值,在服務器上某個時段是唯一標識的。ETag是一個可以 與Web資源關聯的記號(token),和Last-Modified功能才不多,也是一個標識符,一般和Last-Modified一起使用,加強服務器判斷的準確度。

          Date:服務器的時間

          If-Modified-Since:客戶端存取的該資源最后一次修改的時間,用來和服務器端的Last-Modified做比較

          If-None-Match:客戶端存取的該資源的檢驗值,同ETag。

          Cache-Control的主要參數

          Cache-Control: private/public Public 響應會被緩存,并且在多用戶間共享。 Private 響應只能夠作為私有的緩存,不能再用戶間共享。

          Cache-Control: no-cache:不進行緩存

          Cache-Control: max-age=x:緩存時間 以秒為單位

          Cache-Control: must-revalidate:如果頁面是過期的 則去服務器進行獲取。

          2、關于圖片,css,js,flash的緩存

          這個主要通過服務器的配置來實現這個技術,如果使用apache服務器的話,可以使用mod_expires模塊來實現:

          編譯mod_expires模塊:

          Cd /root/httpd-2.2.3/modules/metadata

          /usr/local/apache/bin/apxs -i -a -c mod_expires.c //編譯

          編輯httpd.conf配置:添加下面內容

          <IfModule mod_expires.c>

          ExpiresActive on

          ExpiresDefault "access plus 1 month"

          ExpiresByType text/html "access plus 1 months"

          ExpiresByType text/css "access plus 1 months"

          ExpiresByType image/gif "access plus 1 months"

          ExpiresByType image/jpeg "access plus 1 months"

          ExpiresByType image/jpg "access plus 1 months"

          ExpiresByType image/png "access plus 1 months"

          EXpiresByType application/x-shockwave-flash "access plus 1 months"

          EXpiresByType application/x-javascript "access plus 1 months"

          #ExpiresByType video/x-flv "access plus 1 months"

          </IfModule>

          解釋:第一句--開啟服務

          第二句--默認時間是一個月

          在下面是關于各種類型的資源的緩存時間設置

          什么定位問題如此重要?

          • 可以明確一個問題是不是真的“bug”
          • 很多時候,我們找到了問題的原因,結果發現這根本不是bug。原因明確,誤報就會降低
          • 多個系統交互,可以明確指出是哪個系統的缺陷,防止“踢皮球”,提高問題解決的效率
          • 增強開發對測試的信任度,溝通更有效,配合得更好,開發修改bug時效增強
          • 更有效地了解系統的內部邏輯、數據流處理流程,更能提高測試人員的水平,缺陷修復后,影響的測試范圍評估更精準,復測更準確
          • 可以降低缺陷率
          • 這個可以說是最重要的。在bug系統中,會要求開發人員記錄bug產生的原因。只有我們自己對bug有一個較全面的認識,才會判別出開發寫的是不是真正的原因,也才能有助于我們后續對bug進行分析歸類,根據bug分析,有針對性地未雨綢繆,進而提升產品質量,降低缺陷

          一、定位原因之前

          遇到問題時,先別急著去定位原因。

          1、保存bug產生的記錄:

          首先要做的是保存bug產生的記錄,保證可以復現。

          為什么要保存記錄?因為如果以后不能復現,那就不能證明bug的存在。

          2、排除低級問題:

          然后是排除QA的低級問題,常見的低級問題:

          • 【hosts不對】
          • hosts文件主要是加快某個域名或者網站的解析速度,從而達到快速訪問的作用,也可以屏蔽網站。
          • hosts異常可能會導致部分網頁無法訪問,能夠加載,但是網頁無法正常顯示。
          • 【網絡不通】:抓包、ping
          • 工具的影響導致的,例如fiddler
          • 以及操作姿勢不正確等。

          3、排除數據問題(臟數據):

          有時候會遇到服務端報500錯誤,查看日志后,報空指針,那么很有可能就是數據庫中關聯表的數據被人為刪掉導致的。

          • 臟數據:從目標中取出的數據已經過期、錯誤或者沒有意義,這種數據就叫做臟數據
          • 臟讀:讀取出來的臟數據就叫臟讀

          二、定位問題的思路

          排查順序:

          用戶環境層面 -> 展示層面 -> 邏輯控制層面 -> 服務層面 -> 數據庫層面


          1、用戶環境層面

          主要是指基礎環境是否可以使用。比如:

          • 網絡是否ping通
          • ip和端口配置是否正確
          • jdk版本是否符合標準
          • 有可能是由于jdk版本不兼容導致系統運行異常,這種問題根據實際情況來決定要不要兼容。
          • 網絡設了代理
          • 弱網(如js/css未加載完全、請求超時)
          • 瀏覽器不支持
          • 系統版本不支持
          • 數據庫被刪除
          • 測試環境臟數據
          • 項目配置開關
          • 測試環境切了分支等

          檢查完成后,可以轉到第二步

          2、用戶展示層

          用戶在使用過程中,通過查看等操作發現的一些問題:

          • 頁面樣式(css樣式問題)
          • 交互過程中js的提示(js交互問題)
          • 終端控制的提示信息
          • 文本的展示(html文本問題)

          3、邏輯控制層

          用戶操作過程中,業務的處理邏輯有沒有按照前期的設計實施。或者中間環節出現異常,比如緩存服務器(如redis)、消息中間件(如rabbitMQ)、數據存取中間件等。

          4、服務層

          服務層往往檢查服務器的配置,如可能是tomcat配置、nginx配置、jdbc配置等的問題。測試人員最好能夠了解下它們的各項配置。

          5、數據庫層

          可能出現測試環境和正式環境數據庫版本不同,前后端數據格式、長度限制不同。用戶操作完成后,交易流程非常順暢,這樣也不代表整個交易沒有問題,還需要測試人員檢查數據庫登記的表和字段是否正確

          • 如果發現登記的字段與預期的結果不一致,則可以查看日志,檢查請求報文送的字段是否正確,是否與前臺填寫的一致
          • 有的一個操作會登記多張表,所以要檢查多張表登記或者更新的是否正確,測試人員也需要對被測系統的數據表結構熟悉

          6、經驗法則

          有經驗的測試人員對于有部分bug已經見過多次,能夠很快找到根源,直奔主題,迅速報告或者解決bug

          7、其他

          常見的bug可能還有構建方面的原因

          • 比如代碼本身沒錯,但是合并代碼到主干后出現了問題
          • 比如代碼存在沖突時手動解決的情況

          三、定位問題的方法

          1、常用的定位策略:

          常用的定位策略分為三類:原始類(brute force)、回溯類(backtracking)、排除類(causeeliminations)

          • 原始類定位方法

          原始類定位方法是最常用也是最低效的方法,只有在萬般無奈的情況下才使用它,主要思想是“通過計算機找錯”。

          • 回溯法

          回溯法能成功地用于程序的排錯

          方法是從出現bug征兆處開始,人工地沿控制流程往回追蹤,直至發現出錯的根源,不幸的是程序變大后,可能的回溯路線顯著增加,以致人工進行完全回溯到望而不可及。

          • 排除法

          基于歸納和演繹原理,采用“分治”的概念

          首先確定所有與bug出現有關的所有數據,設想一個導致bug的原因,用這些數據證明或反駁它。或者一次列出所有可能的原因,通過測試一一排除。只要某次測試結果說明某種假設已呈現倪端,則立即精化數據,乘勝追擊

          2、查看狀態碼

          4xx狀態碼:一般表示是客戶端問題(當然也有可能是服務器端配置問題),比如:

          • 發生了401,那么要看下是否帶了正確的身份驗證信息
          • 發生了403則要看下是否有權限訪問
          • 404則要看下對應的URL是否真實存在

          5xx狀態碼:一般表示服務端出現問題。比如:

          • 發生了500錯誤,則表明是服務器內部錯誤,這個時候要配合服務器log進行定位
          • 發生了502錯誤則可能是服務器掛了導致的問題
          • 發生503錯誤可能是由于網絡過載導致的問題
          • 發生504錯誤則可能是程序執行時間過長導致超時

          3、查看服務器日志

          如果發生5xx問題,或者需要檢查后端接口執行的sql是否正確,我們最常見的排查方法就是去看服務器日志,比如tomcat日志。開發人員一般會打出關鍵信息和報錯信息,從而找到問題所在,所以,測試人員也要養成看日志的習慣。

          4、檢查配置

          很多時候,bug不是代碼的問題,而是tomcat配置nginx配置jdbc配置等的問題。在這個層面上,測試人員最好能夠了解下它們的各項配置,在發現問題后可能就會想到這方面的問題。

          5、查看需求文檔

          有時候,前端和服務端的交互都正確,但是從測試的角度看不合理。這個時候,我們應該翻翻需求文檔。如果和需求文檔不符,那么就要看下改什么比較合理,是改前端,還是改服務端,或者兩者都要改。

          這里有一個原則,就是前端盡可能少地去承擔邏輯,只負責渲染展現。當然,不要以為需求文檔就全部正確,它也可能會有錯誤,我們也應該去發現需求文檔的bug,然后再去協調PM,敦促FE或者RD進行修改。

          6、向開發尋求可測性支持

          有時候,涉及到開發過程的一些測試,也需要開發提供可測性支持。

          比如,要查看接口給另一個接口發的請求是否正確,可以讓開發打印出完整的請求log,還有一些邏輯開關、修改頁面數據條數等,都屬于可測性支持的范疇。

          四、bug定位常用工具

          Firefox——firebug、web developer、live http - headers、http fox

          IE插件——httpwatch

          第三方工具——fiddler

          慢速網模擬工具——firefox throttle

          五、如何區分前端/后端bug

          為什么要區分前端/后端BUG?

          • 如果是一個多人開發的系統,不能明確定位到這個bug是誰造成的,容易提交給錯誤的開發人員。
          • 同時提交給前后端開發人員,每個人都會有依賴心理,bug會像皮球一樣被開發踢來踢去,耽誤開發解決bug的時間。
          • 另外,如果團隊規模較大,或者由各地的項目組拼湊而成,勢必會增加溝通成本,這更需要我們在類似禪道或者Jira等項目管理軟件中提交bug時,先指明是誰的bug,避免互相踢皮球的現象。
          • 所以測試必須要自己學會區分出是前端還是后端bug,經過bug分類處理,整個團隊的效率都會有所提高。

          前后端BUG各有什么樣的特點?

          1、利用抓包工具來進行分析

          一般有httpwatch,firebug,fiddler,charles等抓包(數據包)工具。

          • httpwatchfirebug都是瀏覽器的插件,需要額外下載
          • fiddlercharles也需要額外下載安裝包另行安裝
          • 還有一個簡單實用的抓包工具,那就是瀏覽器的F12調試

          2、定位前端的bug

          前端的bug通常是功能、界面和兼容性等有關,涉及到jstljspjscsshtml方面比較多。bug主要有兩塊:

          • JS相關
          • 頁面

          3、定位后端的bug

          后臺涉及到servletjmsejb,還有很多框架strutshibernatespringibatis

          bug 比較難改,但是好找,主要就是看控制臺報錯,然后定位錯誤行號。如果配置文件沒有問題,那么一般的報錯就是空指針,或者是數組下標越界。看附近變量,看方法的參數基本上都可以定位錯誤。

          六、定位完問題后

          在發現問題或者定位到問題原因后,一定要進行一步,就是再次確認問題。所謂確認問題,就是弄清楚問題是否每次都發生,還是概率事件,或者是工具相關的問題:

          • 比如換個瀏覽器是否依然出現?如果換個瀏覽器不出現的話,很可能就是前端的兼容性問題
          • 比如翻頁控件,待測的系統有很多頁面都有翻頁控件,那么就要看下是否每個頁面都會出現這個問題,進而在報bug時進行統一說明,也更加方便開發人員批量處理,防止漏改。

          最后,如果你對軟件測試感興趣,歡迎百度搜索“特斯汀軟件測試騰訊課堂”或關注公眾號“特斯汀軟件測試”,里面涵蓋很多精彩免費視頻或干貨知識

          irebug動態執行JavaScript


          Firebug 官網宣布已停止繼續開發、更新維護 Firebug 的通知,邀請大家使用 Firefox 內置工具 DevTools。

          您可以使用Firebug來編寫并實時執行一個JavaScript。

          這是為了測試,并確保該腳本工作正常,這是將JavaScript代碼部署在生產環境前的好方法。

          打開Firebug > Script(腳本) > 顯示命令行,代碼如下所示:

          alert("w3cschool.cc")

          按Enter鍵后,馬上你就能看到代碼的輸出。


          主站蜘蛛池模板: 久久99精品免费一区二区| 久久久精品日本一区二区三区| 在线精品一区二区三区电影| 久久亚洲中文字幕精品一区四| 日本一区视频在线播放| 国产在线一区二区三区av| 国产精品特级毛片一区二区三区| 国产高清不卡一区二区| 波多野结衣电影区一区二区三区| 亚洲综合色自拍一区| 一区二区三区内射美女毛片| 亚洲av无码不卡一区二区三区| 国产微拍精品一区二区| 人妻无码第一区二区三区| 国产精品毛片一区二区| 精品国产免费观看一区| 亚洲欧美国产国产一区二区三区| 日本精品一区二区久久久| 亚洲视频一区二区三区四区| 亚洲av无码一区二区三区乱子伦| 国产一区二区在线观看视频 | 韩国福利一区二区三区高清视频| 极品尤物一区二区三区| 日本在线一区二区| 高清一区二区三区日本久| 国产在线精品一区二区夜色 | 国产微拍精品一区二区| 亚洲AV一区二区三区四区| 性色A码一区二区三区天美传媒 | 日韩精品区一区二区三VR| 精品一区二区三区中文字幕| 亚洲成AV人片一区二区密柚| 久久免费区一区二区三波多野| 水蜜桃av无码一区二区| 色偷偷久久一区二区三区| 亚洲欧美日韩国产精品一区| 无码国产精品久久一区免费| 精品人妻一区二区三区四区| 91一区二区三区| 亚洲av无一区二区三区| 精品一区二区三区四区在线|