1.http協議
http協議也叫作超文本傳輸協議,定義了瀏覽器向怎樣向服務器請求資源和服務器怎樣將資源傳給瀏覽器。http協議是面向事務的應用層協議,是萬維網能夠傳遞資源的可靠保障。
目前http協議有1.0和1.1兩個版本。
http協議的組成可以分為兩部分,分別為http請求協議和http響應協議,http請求協議定義了瀏覽器向服務器請求資源的方式和規則,由請求行、請求頭、請求體組成,http相應協議定義服務器如何將資源傳回瀏覽器端的規定,包括響應頭、響應行、響應體。
http請求行主要包括三個信息,http協議版本、請求資源的方式、請求的資源是什么,其中http協議版本區別是
協議版本:
HTTP/1.0,發送請求,創建一次連接,獲得一個web資源,連接斷開。
HTTP/1.1,發送請求,創建一次連接,獲得多個web資源,保持連接。
請求頭代表着客戶端發送給瀏覽器端的一些信息,用鍵值對表示,比如客戶端瀏覽器使用的語言,是否使用cookie技術,連接狀態是什么等等。
常見請求頭 |
描述 (紅色掌握,其他了解) |
Referer |
瀏覽器通知服務器,當前請求來自何處。如果是直接訪問,則不會有這個頭。常用於:防盜鏈 |
If-Modified-Since |
瀏覽器通知服務器,本地緩存的最后變更時間。與另一個響應頭組合控制瀏覽器頁面的緩存。 |
Cookie |
與會話有關技術,用於存放瀏覽器緩存的cookie信息。 |
User-Agent |
瀏覽器通知服務器,客戶端瀏覽器與操作系統相關信息 |
Connection |
保持連接狀態。Keep-Alive 連接中,close 已關閉 |
Host |
請求的服務器主機名 |
Content-Length |
請求體的長度 |
Content-Type |
如果是POST請求,會有這個頭,默認值為application/x-www-form-urlencoded,表示請求體內容使用url編碼 |
Accept: |
瀏覽器可支持的MIME類型。文件類型的一種描述方式。 MIME格式:大類型/小類型[;參數] 例如: text/html ,html文件 text/css,css文件 text/javascript,js文件 image/*,所有圖片文件 |
Accept-Encoding |
瀏覽器通知服務器,瀏覽器支持的數據壓縮格式。如:GZIP壓縮 |
Accept-Language |
瀏覽器通知服務器,瀏覽器支持的語言。各國語言(國際化i18n) |
響應信息:
Location |
指定響應的路徑,需要與狀態碼302配合使用,完成跳轉。 |
Content-Type |
響應正文的類型(MIME類型) 取值:text/html;charset=UTF-8 |
Content-Disposition |
通過瀏覽器以下載方式解析正文 取值:attachment;filename=xx.zip |
Set-Cookie |
與會話相關技術。服務器向瀏覽器寫入cookie |
Content-Encoding |
服務器使用的壓縮格式 取值:gzip |
Content-length |
響應正文的長度 |
Refresh |
定時刷新,格式:秒數;url=路徑。url可省略,默認值為當前頁。 取值:3;url=www.itcast.cn //三秒刷新頁面到www.itcast.cn |
Server |
指的是服務器名稱,默認值:Apache-Coyote/1.1。可以通過conf/server.xml配置進行修改。<Connector port="8080" ... server="itcast"/> |
Last-Modified |
服務器通知瀏覽器,文件的最后修改時間。與If-Modified-Since一起使用。 |
至於請求體,如果我們請求的方式是get,那么我們請求資源時的參數就會出現在url后面,如果是post,參數就出現在請求體中。
http響應協議的響應行包括協議版本和狀態碼,不同的狀態碼代表不同的信息。常見的狀態碼有404,500,200,304。
響應頭將服務器端的信息傳遞給瀏覽器,如上所示。
響應體:
響應體是服務器回寫給客戶端的頁面正文,瀏覽器將正文加載到內存,然后解析渲染 顯示頁面內容
2.HttpServletResponse和HttpServletRequest對象
HttpServletRequest和HttpServletResponse分別代表資源請求和資源響應對象。HttpServletRequest對象代表客戶端的請求,當客戶端通過HTTP協議訪問服務器時,HTTP請求頭中的所有信息都會封裝在這個對象中,通過這個對象提供的方法,可以獲得客戶端的所有信息。HttpServletResponse則可以獲得服務器端的信息。
Requset常用方法:
1.獲取客戶端信息 getRequestUrl();
2.獲得客戶機請求頭getHeader();
3.獲得客戶端的參數getParameter(String name);
Request接收表單中文參數亂碼問題,之所以會產生亂碼,是因為瀏覽器的編碼方式和服務器編碼方式不一樣導致的,因此解決方式是在瀏覽器和服務器中設置一個統一的編碼,之后就按照統一的編碼進行傳輸,客戶端一般以UTF-8編碼將表單數據提交到服務器,因此服務器要設置以UTF-8編碼方式進行接收,方法為request.setCharacterEncoding("UTF-8")。
請求轉發:請求轉發是指一個web資源收到客戶端的請求后,通知服務器去掉用另一個web資源進行處理。
轉發的方式有兩種:
1.通過ServletContext的getRequestDispatcher(String path)方法,該方法返回一個RequestDispatcher對象,這個對象調用forward方法實現請求轉發。
RequestDispatcher reqDispatcher=this.getServletContext().getRequestDispatcher("/test.jsp"); reqDispatcher.forward(request,reponse);
2.通過request對象提供的getRequestDispatcher(String path)方法,該方法返回一個RequestDispatcher對象,調用其forward方法。
request對象是一個域對象,可以通過Request對象在實現轉發時,把Request對象帶給其他web資源處理。但是只能作用一次請求中。
轉發和重定向的區別:
轉發:一個web資源收到客戶端請求后,通知服務器調用另外一個web資源進行處理,稱之為請求轉發307。
重定向:一個web資源收到客戶端請求后,通知瀏覽器調用另外一個web資源進行處理,稱之為請求重定向302。
HttpServletReponse對象reponse也有自己常用的方法,再次不在累贅,常見應用向客戶端輸出數據,可以實現文件下載功能。
下載思路:
1.獲取下載路徑
2.獲取下載的文件名
3.設置響應頭控制瀏覽器以下載形式打開文件
4.獲得下載文件流
5.創建緩沖區
6.通過response獲得OutputStream流
7.將輸入流寫到緩沖區
7.將緩沖區的內容輸出到客戶端
reponse對象能夠完成重定向
reponse.sendRedirect("");
3.cookie和session技術
兩者都是會話技術,cookie作用在客戶端,session作用在服務器端。從打開一個瀏覽器訪問某個站點,到關閉這個瀏覽器的整個過程,成為一次會話。會話技術就是記錄這次會話中客戶端的狀態與數據的。會話技術幫助區分客戶端。
cookie技術:服務器端向瀏覽器端發送一個cookie,首先創建一個cookie
Cookie cookie = new Cookie(String cookieName,String cookieValue);
向客戶端發送cookie
response.addCookie(Cookie cookie);
這樣瀏覽器端就能有一個cookie信息了。服務器端怎樣接受cookie哪
1)通過request獲得所有的Cookie:
Cookie[] cookies = request.getCookies();
2)遍歷Cookie數組,通過Cookie的名稱獲得我們想要的Cookie
for(Cookie cookie : cookies){
if(cookie.getName().equal(cookieName)){
String cookieValue = cookie.getValue();
}
}
session會話技術
Session技術是將數據存儲在服務器端的技術,會為每個客戶端都創建一塊內存空間 存儲客戶的數據,但客戶端需要每次都攜帶一個標識ID去服務器中尋找屬於自己的內 存空間。所以說Session的實現是基於Cookie,Session需要借助於Cookie存儲客 戶的唯一性標識JSESSIONID
怎樣獲得屬於本客戶端的session對象(內存區域)?
HttpSession session = request.getSession();
對象會創建一個新的Session返回,如果已經有了屬於該會話的Session直接將已有 的Session返回(實質就是根據JSESSIONID判斷該客戶端是否在服務器上已經存在 session了)
怎樣向session中存取數據(session也是一個域對象)?
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
session對象的生命周期?
創建:第一次執行request.getSession()時創建
銷毀:
1)服務器(非正常)關閉時
2)session過期/失效(默認30分鍾)
問題:時間的起算點 從何時開始計算30分鍾?
從不操作服務器端的資源開始計時
可以在工程的web.xml中進行配置
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3)手動銷毀session
session.invalidate();
默認在一次會話中,也就是說在,一次會話中任何資源公用一個session對象