閱讀135 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Web之HTTP協議

一、HTTP協議

1、當請求的資源中含有:img link <script src=""/>瀏覽器都會自動發出請求
     瀏覽器訪問多圖網頁
    在一個HTML頁麵中如果包含<img>標記的話,當瀏覽器解析到這些標記時,還會向服務器請求訪問標記中指定的文件,即再次建立連接並發出HTTP請求
     *http 1.0和http 1.1的區別:
         a. 1.0中鏈接是無狀態的,瀏覽器與WEB服務器的連接過程是短暫的,每次連接隻處理一個請求和響應。對每一個頁麵的訪問,
          瀏覽器與WEB服務器都要建立一次單獨的連接。
     b.1.1中鏈接是有狀態的。在一個TCP連接上可以傳送多個HTTP請求和響應。增加了更多的請求頭和響應頭
     
2、組成
     請求部分:客戶端連上服務器後,向服務器請求某個web資源,稱之為客戶端向服務器發送了一個HTTP請求。
     一個完整的HTTP請求包括 一個請求行、若幹消息頭、以及請求正文,其中的一些消息頭和正文都是可選的,隻有當請求以post方式時,才會有請求征文          
               常用的請求方式:
               GET:默認的請求方式。https://localhost:8080/hello/4.html?username=abc&password=456
                    如果有表單數據,會出現在地址欄中,實際上是作為請求資源路徑的一部分出現的。
                    不安全。長度有限製,一般情況下不能超過1k
               POST:使用表單的method屬性來指定。POSt方式的請求正文會出現
                    username=abc&password=456。木有長度限製。(建議使用的方式)
           *常用的響應碼:
               200 表示一切正常,返回的是正常請求結果
               302、307 (臨時重定向) 
 指出被請求的文檔已被臨時移動到別處,此文檔的新的URLLocation響應頭中給出
              
               304   (未修改)表示客戶機緩存的版本是最新的,客戶機可以繼續使用它,無需到服務器請求。
               404   (找不到)服務器上不存在客戶機所請求的資源。
               500   (服務器內部錯誤)一般情況下是代碼錯誤服務器端的程序發生錯誤
           *消息頭的作用:用戶客戶端和服務器端之間互相傳遞附加信息(枕邊細雨)。
               請求消息頭:
                    Accept:告知服務器,瀏覽器可接受的MIME類型
                         MIME類型:文件係統文件類型用文件的擴展名區別的。
                              MIME類型由大類型/小類型組成的。比如:text/html. text/css text/js.image/bmp;image/jpeg;(參考Tomcat\conf\web.xml)
                    Accept-Charset: 告知服務器,瀏覽器通過這個頭告訴服務器,它支持哪種字符集
                    *Accept-Encoding:告知服務器,瀏覽器支持的壓縮格式,瀏覽器能夠進行解碼的數據編碼方式,比如gzip
                    Accept-Language:告知服務器,瀏覽器所希望的語言種類
                    *Referer:告知服務器,當前請求的URL來自哪個地址。(防盜鏈)
                         ** Referer表示該頁麵來自哪一個頁麵
               Referer請求頭是比較有用的一個請求頭,它可以用來做統計工作,也可以用來做防盜鏈。
統計工作
:我公司網站在百度上做了廣告,但不知道在百度上做廣告對我們網站的訪問量是否有影響,那麼可以對每個請求中的
 Referer 進行分析,如果 Referer為百度的很多,那麼說明用戶都是通過百度找到我們公司網站的。
防盜鏈
:我公司網站上有一個下載鏈接,而其他網站盜鏈了這個地址,例如在我網站上的 index.html 頁麵中有一個鏈接,點擊即可下載 JDK7.0 ,但有某個人的微博中盜鏈了這個資源,它也有一個鏈接指向我們網站的 JDK7.0 ,也就是說登錄它的微博,點擊鏈接就可以從我網站上下載 JDK7.0 ,這導致我們網站的廣告沒有看,但下載的卻是我網站的資源。這時可以使用 Referer 進行防盜鏈,在資源被下載之前,我們對 Referer 進行判斷,如果請求來自本網站,那麼允許下載,如果非本網站,先跳轉到本網站看廣告,然後再允許下載。
                    *Content-Type: application/x-www-form-urlencoded表單的數據類型,說明會使用url格式編碼數據;url編碼的數據都是以“%”為前     綴,後麵跟隨兩位的16進製,例如“傳智”這兩個字使用UTF-8url編碼用為“%E4%BC%A0%E6%99%BA”;
                    If-Modified-Since: Wed, 02 Feb 2011 12:04:56 GMT利用這個頭與服務器的文件進行比對,如果一致,則從緩存中直接讀取文件。
                    User-Agent:瀏覽器類型.
                    Content-Length:表示請求消息正文的長度
                    *****Cookie:這是最重要的請求頭信息之一 ,會話有關
               響應消息頭:
                    *Location: https://www.it315.org/index.jsp告知瀏覽器,新的資源的位置(結合302響應碼來用,實現請求重定向)
                eg: //設置狀態碼,302/307表示重新定向
                       response.setStatus(302);
                       //設置頭,Location屬性,使其重定向
                       response.setHeader( "Location""/Test_day07_httpWatchTest//servlet/ServletDemo2" );
                    *Content-Encoding: 告知瀏覽器,服務器發送的數據采用的編碼類型gzip
                    *Content-Length: 80 告訴瀏覽器正文的長度
                    *Content-Type: text/html; charset=GB2312告訴瀏覽器,服務器發送的正文內容的MIME類型
                    *Refresh:1  告訴瀏覽器,刷新頻率。單位是秒
                    *Content-Disposition: attachment; filename=aaa.zip告訴瀏覽器,以下載的形式打開數據
                    eg:            
          //告訴瀏覽器以下載的方式打開
          response.setHeader("Content-Disposition", "attachment;filename=1.gif") ;
                    *****Set-Cookie會話有關
                    *//告訴客戶端不要緩存
                    Expires: -1    (有效時間,單位是毫秒值。取值隻要比當前時間小)
                    Cache-Control: no-cache (1.1) 
                    Pragma: no-cache   (1.0)
                
  




二、Servlet入門
1、Servlet的編寫步驟:
a、建立一個標準的JavaWeb應用的目錄結構
b、在WEB-INF\classes目錄下建立一個HelloServlet.java,內容如下:
package com.itheima.servlet;
import javax.servlet.*;
import java.io.*;

public class HelloServlet extends GenericServlet{
     public void service(ServletRequest req,ServletResponse res)
                      throws ServletException,IOException{
          res.getWriter().write("Hello Servlet");
     }
}
c、進入WEB-INF\classes目錄,編譯。
注意:要把servlet-api.jar加入到構建路徑中。set classpath=%classpath%;C:\apache-tomcat-6.0.37\lib\servlet-api.jar
編譯,注意有包名。javac -d . HelloServlet.java
d、修改應用中的web.xml,給Servlet類一個映射地址:
<?xml version="1.0" encoding="GBK"?>
<web-app xmlns="https://java.sun.com/xml/ns/javaee"
    xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
     <servlet>
          <!--給你的Servlet類取一個名字-->
          <servlet-name>HelloServlet</servlet-name>
          <servlet-class>com.itheima.servlet.HelloServlet</servlet-class>
     </servlet>
     <servlet-mapping>
          <!--給Servlet一個映射地址-->
          <servlet-name>HelloServlet</servlet-name>
          <url-pattern>/hello</url-pattern>
     </servlet-mapping>
</web-app>
e、部署到Tomcat中。訪問https://localhost:8080/firstServlet/hello即可看到程序的輸出內容

三、Servlet的生命周期
Servlet的生命周期:
Servlet對象默認情況下是用戶第一次訪問時由容器創建。
日後就駐留Tomcat內存了。
針對用戶的每次請求,Tomcat都會調用service方法為客戶端服務。
當應用被卸載了,或者TOmcat掛了,會調用destory方法。

     <servlet>
          <!--給你的Servlet類取一個名字-->
          <servlet-name>HelloServlet</servlet-name>
          <servlet-class>com.itheima.servlet.HelloServlet</servlet-class>
          <load-on-startup>2</load-on-startup><!--啟動順序,應用被服務器加載時就完成了初始化-->
     </servlet>

四、Servlet的配置
     Servlet的映射<url-pattern/>可以使用通配符(*)
          使用通配符有2中形式:
          a、以*開頭,以其他什麼東西結尾。如*.do
          b、以/開頭,必須以*結尾。如 /action/*
          /*匹配任意的東東
         
          注意:
          使用通配符有2中形式,絕對匹配最高-------》b優先級比a高-----》從前往後找對相近的
         
          注意:(知道)
          如果一個servlet的映射路徑為一個/,那麼它就是默認的Servlet。該Servlet會處理沒有映射路徑的所有請求。
         
     更改MyEclipse10.6生成的Servlet模板:
     1、關閉MyEclipse
     2、找到MyEclipse的安裝目錄的上級目錄。
     3、搜索com.genuitec.eclipse.wizards*.jar
     4、打開,找到templates\Servlet.java,這就是模板文件。(做好備份,再修改)
     5、替換jar包中的Servlet.java
     6、重啟MyEclipse,生效

最後更新:2017-04-03 05:40:04

  上一篇:go Console/File IO
  下一篇:go 在Google Drive上建立免費靜態網站