HttpServletRequest的應用(一)


HttpServletRequest簡介

WEB客戶端發送給WEB服務器的HTTP請求消息分為三個部分:

請求行 POST /demo/login HTTP/1.1

請求消息頭

消息正文(也叫實體內容) username=xxxx&password=1234

Servlet API中定義的ServletRequest接口類用於封裝請求消息。

HttpServletRequest是專用於HTTP協議的ServletRequest子接口,它用於封裝HTT請求消息。

在service()方法內部調用HttpServletRequest對象的各種方法來獲取請求消息。

獲取請求行的相關信息

HTTP請求消息的請求行包括請求方式、資源路徑和HTTP協議版本:

                            GET/it315/servlet/RequestURI?param1=a&param2=b HTTP/1.1

getMethod方法返回HTTP請求消息中的請求方式。

getRequestURI方法返回請求行中的資源名部分。

getQueryString 方法返回請求行中的參數部分。

getProtocol方法返回請求行中的協議名和版本。

getContextPath方法返回請求資源所屬於的WEB應用程序的路徑。

getPathInfo方法返回請求URL中的額外路徑信息。額外路徑信息是請求URL中的位於Servlet的路徑之后和查詢參數之前的內容,它以“/”開頭。

getPathTranslated方法返回URL中的額外路徑信息所對應的資源的真實路徑。

getServletPath方法返回Servlet的名稱或Servlet所映射的路徑。

獲取網絡連接信息

getRemoteAddr方法返回發出請求的客戶機的IP地址,其格式為“192.168.0.3”這種形式的字符文本。 (*)

getRemoteHost方法返回發出請求的客戶機的完整主機名,即“pc1.it315.org”這種格式。

getRemotePort方法返回發出請求的客戶機所使用的網絡接口的端口號。

getLocalAddr方法返回WEB服務器上接收當前請求的網絡接口的IP地址。

getLocalName方法返回WEB服務器上接收當前請求的網絡接口的IP地址所對應的主機名。

getLocalPort方法返回WEB服務器上接收當前請求的網絡接口的端口號。

getServerName方法返回當前請求所指向的主機名。

getServerPort方法返回當前請求所連接的服務器端口號。

getScheme方法返回請求的協議名,例如http、https或ftp。

getRequestURL方法返回客戶端發出請求時的完整URL。 

獲取請求頭信息的各種方法

   getHeader方法

getHeaders方法

getHeaderNames方法

getIntHeader方法

getDateHeader方法

getContentType方法

getContentLength方法

getCharacterEncoding方法

         獲取所有請求頭的編程例子

                   Enumeration headerNames =request.getHeaderNames();

while(headerNames.hasMoreElements())

{

         String headerName =(String)headerNames.nextElement();

         out.print(headerName + " : "+ request.getHeader(headerName) + "<br>");

         /*如果要考慮同一個請求頭名可能出現多次,

         那么應該用下面的代碼段代替上面一行程序代碼*/

         /*Enumeration values =request.getHeaders(headerName);

         while(values.hasMoreElements())

          {

                   out.print(headerName + ": " + (String)values.nextElement() + "<br>");

         }*/

}

利用Referer請求頭阻止“盜鏈”

Stringreferrer = request.getHeader("referer");

StringsitePart = "http://" + request.getServerName();

if(referrer!=null&& referrer.startsWith(sitePart))

{

         //處理正當的下載請求,這里只進行示意

         out.println("dealing download...");

}

else

{

         //非法下載請求跳轉到本站的下載說明頁

         RequestDispatcher rd =request.getRequestDispatcher("/down.html");

         rd.forward(request,response);

}

利用Referer請求頭隱藏JavaScript源碼

Stringreferrer = request.getHeader("referer");

StringsitePart = "http://" + request.getServerName();

if(referrer!=null&& referrer.startsWith(sitePart))

{

         //向客戶端輸出javascript的document.write(...)語句

         out.println(

                   "document.write('假設這是很多重要的Javascript代碼的執行結果');");

}

客戶端身份認證實踐

StringencodedAuth = request.getHeader("Authorization");

//要求客戶端發送身份認證信息,並且只能是BASIC認證方式中

if(encodedAuth == null ||!encodedAuth.toUpperCase().startsWith("BASIC"))

{

     response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);

     response.setHeader("WWW-Authenticate","BASICrealm=\"it315\"");

     //當用戶單擊登錄框中的“取消”按鈕時,將輸出下面的內容

     out.println("沒有傳遞用戶身份!");

     return ;

}

使用GET方式傳遞參數

   在瀏覽器地址欄中輸入某個URL地址或單擊網頁上的一個超鏈接時,瀏覽器發出的HTTP請求消息的請求方式為GET。

如果網頁中的<form>表單元素的method屬性被設置為了“GET”,瀏覽器提交這個FORM表單時生成的HTTP請求消息的請求方式也為GET。

使用GET請求方式給WEB服務器傳遞參數的格式:

                   http://www.vshoping.tk/counter.jsp?name=zhangsan&password=123

使用GET方式傳送的數據量一般限制在1KB以下。

使用POST方式傳遞參數

   POST請求方式主要用於向WEB服務器端程序提交FORM表單中的數據。

POST方式將各個表單字段元素及其數據作為HTTP消息的實體內容發送給WEB服務器,傳送的數據量要比使用GET方式傳送的數據量大得多。

<form>表單元素的enctype屬性用於指定瀏覽器使用哪種編碼方法將表單中的數據傳送給WEB服務器,該屬性可以有兩種取值:

application/x-www-form-urlencoded

multipart/form-data

POST請求消息的格式:

POST /counter.jspHTTP/1.1

referer:http://localhost:8080/Register.html

content-type: application/x-www-form-urlencoded

host: localhost:8080

content-length: 43

name=zhangsan&password=123

提交、重置、普通按鈕如何傳送參數

在一個FORM表單中可以有多個提交按鈕,單擊任何一個提交按鈕都可以提交表單,只有被單擊的提交按鈕的名稱和值才被作為參數傳遞,其它提交按鈕的信息不會作為參數傳遞。

表單中的普通按鈕與重置按鈕的名稱和值不會作為參數傳遞。

沒有設置name屬性的表單字段元素的信息不會作為參數傳遞。

單行與多行文本輸入框如何傳送參數

           不管單行和多行文本輸入框中是否有內容,設置了name屬性的文本輸入框的信息總是會作為參數傳遞。如果文本框中沒有輸入內容,可以認為其內容為一個空字符串(“”),其參數形式為“text1=”。

單選按鈕與復選框如何傳送參數

只有被選中的復選框和單選按鈕的信息才會作為參數傳遞,未被選中的復選框和單選按鈕的信息不會作為參數傳遞。

對於多個名稱相同的復選框,它們可以同時被選中;對於多個名稱相同的單選按鈕,只能同時選中其中的任意一個。

對於被選中的多個同名復選框,它們的信息將以多個名稱相同的參數進行傳遞,即參數列表中會出現多個名稱相同的參數。

對於沒有設置value屬性的單選按鈕和復選框,當它們被選中時,它們傳遞的默認參數值為“on”。

使用Javascript防止重復提交表單

         <script>

varisCommitted = false;

functioncheckPost()

{

         if(!isCommitted)

         {

                   isCommitted = true;

                   return true;

         }

         else

         {

                   alert("不能重復提交表單");

                   return false;

         }

}

</script>

<formaction="servlet/RepeateFormServlet" method="POST"onsubmit="return checkPost()">

分析文件上傳的請求消息結構

ServletInputStreamsis = request.getInputStream();

StringfilePath = getServletContext().getRealPath("/body.out");

FileOutputStreamfos = new FileOutputStream(filePath);

byte[]buf = new byte[1024];

intlen = sis.read(buf,0,1024);

while(len!= -1)

{

     fos.write(buf,0,len);

     len = sis.read(buf,0,1024);

}

fos.close();

sis.close();

了解中文字符的URL編碼

publicstatic String encode(String s,String enc)  throwsUnsupportedEncodingException

publicstatic String decode(String s,String enc)  throwsUnsupportedEncodingException

getInputStream與getReader方法

getInputStream 方法用於返回的一個代表實體內容的輸入流對象,其類型為javax.servlet.ServletInputStream。

getReader方法用於返回的一個代表實體內容的BufferedReader對象,返回的BufferedReader對象將實體內容中的字節數據按照請求消息中指定的字符集編碼轉換成文本字符串。

在調用getReader方法之前,可以調用ServletRequest的setCharacterEncoding方法指定其返回的BufferedReader對象所使用的字符集編碼。

最后一些注意的事項:

如果提交FORM表單的頁面與處理表單請求的Servlet程序都是由同一個人或同一個項目組開發的,那么只要在處理表單提交的Servlet程序中將傳遞給setCharacterEncoding方法的字符集編碼設置為該表單所在頁面的字符集編碼即可。

如果Servlet程序可以接收來自多個其他站點的FORM表單提交的數據,而每個其他站點的頁面所采用的字符集編碼可能各不一樣,要想讓Servlet程序知道FORM表單內容的字符集編碼,可以在FORM表單中增加一個隱藏字段來傳遞當前FORM內容的字符集編碼名稱。

只要超鏈接、FORM表單的action屬性設置、請求轉發和重定向的URL等任何一種請求路徑中要包含參數,就必須對參數部分進行URL編碼。對參數進行URL編碼時所選擇的字符集編碼應盡量與當前頁面的字符集編碼保持一致,也可以用一個參數來指定URL編碼內容的字符集編碼名稱。

所有標准的瀏覽器和客戶機終端都支持UTF-8編碼,如果WEB服務器要能兼容處理各個國家和地區版本的瀏覽器所傳遞的FORM表單信息,網頁文檔應當使用UTF-8編碼格式。

在編寫應用程序時應該注意一些隱性的字符編碼錯誤。有些程序在輸出時有編碼轉換錯誤,在讀取輸入時返回的字符串也有轉換錯誤,當該程序輸出它所讀取到的有問題的字符串時,顯示的結果可能是正常的中文字符


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM