最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

HttpServletRequest對象常用功能_動力節(jié)點Java學(xué)院整理

 更新時間:2017年07月25日 10:54:41   作者:fjdingsd  
這篇文章主要為大家詳細(xì)介紹了HttpServletRequest對象常用功能的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

  使用HttpServletRequest可以防止盜鏈行為,什么是盜鏈行為,比如說在一個別的網(wǎng)站上超鏈接,指向我們的網(wǎng)頁中的某個數(shù)據(jù),這樣從他的網(wǎng)頁上就可以直接進(jìn)入到我的某個頁面,無需從我的指定路口進(jìn)入:

例如在一個簡單的1.html文件中加入了我的【myservlet】web應(yīng)用下的某個Servlet訪問的超鏈接:

如果我的Servlet中代碼僅僅為為訪問輸出數(shù)據(jù),例如:

response.setContentType("text/html;charset=utf-8");
String data ="銀魂真是一部好動漫";
response.getWriter().write(data);

那么點擊這個超鏈接肯定會訪問到這個Servlet:

那么我們?nèi)绻幌氡槐热酥苯油ㄟ^地址訪問或者超鏈接訪問怎么辦呢:

記得學(xué)習(xí)HTTP協(xié)議中的“referer”請求頭嗎,這個請求頭是告訴服務(wù)器該請求是從哪個URL發(fā)來的,那么我們就可以根據(jù)這個URL來判斷是否是我們允許的請求地址來控制服務(wù)器是否將響應(yīng)發(fā)送回去。

代碼如下:

String reqUrl = request.getHeader("referer");
 if(reqUrl==null || !reqUrl.startsWith("http://localhost:8080/myservlet/index.jsp")){
 response.sendRedirect("/myservlet/index.jsp");
 return ;
 }
 
 response.setContentType("text/html;charset=utf-8");
 String data ="銀魂真是一部好動漫";
 response.getWriter().write(data);

在if判斷中判斷是否為空是防止直接將該web資源以輸入URL地址直接訪問,而另一個判斷是防止訪問該web資源不是從指定的地方來訪問進(jìn)來。

通過該代碼,如果我們繼續(xù)在1.html頁面中點擊超鏈接,則會自動跳轉(zhuǎn)到我們設(shè)置好的index.jsp中:

而如果我們直接在瀏覽器中訪問Servlet也是會跳到這個頁面的。

只有在index.jsp中點擊我們設(shè)置好的超鏈接,才能訪問到:

接下來,我們來討論的使用HttpServletRequest響應(yīng)對象來獲取表單數(shù)據(jù),這是非常重要的知識點,表單提交的數(shù)據(jù)根據(jù)提交方式的不同會放置在不同位置,例如采用POST方式則會將這些數(shù)據(jù)放置在HTTP請求數(shù)據(jù)實體中,無論采用哪種方式,都是可以用響應(yīng)對象的getParameter(String)等等方式獲取,這點在《Servlet的學(xué)習(xí)(十)》中已經(jīng)介紹。

現(xiàn)在,我們在需要新創(chuàng)建一個HTML頁面編寫我們的表單代碼,和一個Servlet作為服務(wù)器端接收表單提交的數(shù)據(jù),將Servlet命名為ServletRequest,而表單的傳送服務(wù)器和選擇HTTP方式如下:

<form action="/myservlet/servlet/ServletRequest" method="post">

先來看

<input type="text" name="user" /> 
<input type="password" name="password" /> 

這兩種常見的輸入字符情況。

當(dāng)然還需要在表單中提供具有提交功能的標(biāo)簽才能提交,我們選擇

<input type="submit" value="提交" >

這樣的提交方式,效果如下:

在表單中這兩個都可以直接通過getParameter(String)方法獲取用戶輸入的數(shù)據(jù),代碼如下:

String username = request.getParameter("user");
String password = request.getParameter("password");

只要我們在用戶名和密碼中輸入數(shù)據(jù),再點擊提交,就可以將用戶名和密碼中的數(shù)據(jù)傳遞給服務(wù)器:

同時,由原來的表單的HTML頁面會自動跳轉(zhuǎn)到該Servlet的頁面上。

對于text和password兩種表單方式的健壯性判斷:

依據(jù):

1、如果表單中用戶名和密碼不填,那么直接提交后會是傳遞給服務(wù)器空字符串。

2、如果不是在表單,而是知道了平常表單提交后會跳轉(zhuǎn)的Servlet頁面,那么直接輸入該Servlet地址則是傳遞Null給服務(wù)器

因此必須加入健壯性語句:

String username = request.getParameter("user");
if(username!=null && !username.trim().equals("")) {
System.out.println("user:"+username);

}

password部分代碼同理。

接下來是單選按鈕,比如性別選擇:

性別 <input type="radio" name="gender" value="male"/>男
<input type="radio" name="gender" value="female"/>女 

只有<input type=”radio”>標(biāo)簽中的”name”屬性一樣,才能具有單選的功能,同時”name”屬性也是在Servlet中獲取用戶單選數(shù)據(jù)的重要參數(shù),代碼:

String gender = request.getParameter("gender");

如果單選沒有選擇任何選項,則提交會返回null,所以需加入健壯性語句:

String gender = request.getParameter("gender");
if(gender != null) {
System.out.println(gender);

}

接下來是下拉列表,下拉列表可以是作為選擇城市,如:

城市<select name="city">
 <option value="none">--選擇城市--</option>
 <option value="beijing">北京</option>
 <option value="shanghai">上海</option>
 <option value="hangzhou">杭州</option>
 <option value="amoy">廈門</option>
</select>

由<select>標(biāo)簽中的”name”屬性作為Servlet中服務(wù)器獲取客戶端發(fā)來的下來列表數(shù)據(jù)的重要參數(shù),代碼如下:

String city = request.getParameter("city");
System.out.println(city);

由于下拉列表會默認(rèn)選擇其第一個<option>標(biāo)簽的內(nèi)容,所有即使我們沒有進(jìn)行任何選擇,也是會傳遞值得,這里可以無需健壯性判斷。

接下來是復(fù)選框,復(fù)選框可以是一些所學(xué)技能,或者興趣愛好,如:

<input type="checkbox" name="hobby" value="sing">唱歌
<input type="checkbox" name="hobby" value="surf">沖浪 
<input type="checkbox" name="hobby" value="swim">游泳

由<input type=”checkbox”>標(biāo)簽中的name屬性決定了這些復(fù)選框是否屬于同一個復(fù)選框組,也是同時也是作為Servlet中獲取表單復(fù)選框的數(shù)據(jù)的重要參數(shù),由于多個參數(shù)使用同一個參數(shù)名,所以必須使用getParameterValues(String)方法來獲取所有的被勾選的復(fù)選框,代碼如下(包含健壯性):

String[] hobbies = request.getParameterValues("hobby");
for(int i=0;hobbies!=null&&i<hobbies.length;i++) {
System.out.println(hobbies[i]);

 }

如果沒有勾選任何一個復(fù)選框,則不會向服務(wù)器Servlet傳送任何數(shù)據(jù)。所以如果直接接收可能會發(fā)生空指針異常,必須判斷是否接收到的字符串?dāng)?shù)組有數(shù)據(jù)(hobbies!=null)。

重要:

現(xiàn)在,我們再重新回到<input type="text" name="user" /> 上,如果我們輸入的是中文數(shù)據(jù),點擊提交之后會是怎樣?

在控制臺看到的結(jié)果:

結(jié)果就是出現(xiàn)了中文亂碼問題。這是瀏覽器在發(fā)送時通常要看當(dāng)時的編碼,如:

或者:

但是?。?/p>

在Servlet收到request請求對象發(fā)來的數(shù)據(jù)時,通過getParameter方法是默認(rèn)查詢“ISO-8859-1”碼表的,所以造成了編碼不一致!

解決方式也很簡單,只要在Servlet中將獲取的request對象選擇正確的解碼方式即可,只要在代碼前添加一句:

request.setCharacterEncoding("UTF-8");

就可以獲取表單中正確的中文數(shù)據(jù)了:

注意,對于響應(yīng)對象的setCharacterEncoding方法只對HTTP協(xié)議的POST方式有效,對GET方式無效。

如果我們將表單提交方式改為GET,那么提交表單中有中文數(shù)據(jù)的話依然在Servlet中會出現(xiàn)亂碼。

如果想使GET方式也不會出現(xiàn)中文亂碼,并沒有好的捷徑方法。先要通過getParameter獲取請求數(shù)據(jù)(這時在Servlet中以ISO8859碼表進(jìn)行解碼),然后再通過ISO8859進(jìn)行編碼成字節(jié)數(shù)組,最后通過創(chuàng)建字符串對象的方式選擇UTF-8解碼表解出最開始客戶端編碼的數(shù)據(jù)。

代碼如下:

String userTemp = request.getParameter("user");
String username = new String(userTemp.getBytes("ISO8859-1"),"utf-8");

即可。

當(dāng)然這種方式對POST方式也是有效的。

另外一種對GET方式是修改Tomcat中的配置文件(這種方式只適合GET方式,用POST方式還是會亂碼)。通過Tomcat服務(wù)器的首頁,選擇“Configuration”查看配置文檔,選擇“Connector”下的“HTTP”:

在這個文檔中有一個URIEncoding屬性,是指可以在server.xml文件中配置這個屬性,如果沒有這個屬性,則Tomcat默認(rèn)采用ISO8859-1編碼:

通過在server.xml文件中的<connector>標(biāo)簽中添加設(shè)置即可:

由于是在Tomcat中修改server.xml文件,所以服務(wù)器需要重啟。

經(jīng)過這種方式,就無需在代碼中再設(shè)置任何編碼表,所有在服務(wù)器端都會采用“URIEncoding”屬性設(shè)置的碼表。但這個方式不建議使用。

同樣在“Configuration”的配置文檔中的“Connector”下的“HTTP”說明文檔中,有useBodyEncodingForURI這么個屬性:

當(dāng)在server.xml文件中的<connector>標(biāo)簽中添加設(shè)置了這個屬性,還未完成:

還必須在Servlet中同時調(diào)用了響應(yīng)對象的setCharacterEncoding方法,就能再次使GET方式不會出現(xiàn)亂碼:

request.setCharacterEncoding("utf-8");
String username = request.getParameter("user");

同樣,這種配置server.xml文件的方式依然不建議采用。

最后說明一點,在HTML編程中,我們也可以使用超鏈接來提交數(shù)據(jù),當(dāng)然這樣的方式屬于HTTP中的GET方式,原理類似于在瀏覽器地址URL后手動添加參數(shù),比如如下代碼:

<a href="/myservlet/servlet/ServletRequest?user=銀魂" >用戶名為中文</a>

跟隨的參數(shù)為中文!!

兩種解決方式:

1、在這個超鏈接上必須將這個中文進(jìn)行URL編碼,必須在JSP中進(jìn)行編寫(在后面的篇章中會介紹如何使用);

2、或者使用上述GET處理中文亂碼的第一種方式,進(jìn)行雙次編碼:

String userTemp = request.getParameter("user");
String username = new String(userTemp.getBytes("ISO8859-1"),"utf-8");

也是可以的。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java如何通過SSE實現(xiàn)消息推送詳解

    Java如何通過SSE實現(xiàn)消息推送詳解

    這篇文章主要介紹了Java如何通過SSE實現(xiàn)消息推送的相關(guān)資料,SSE是一種服務(wù)器向客戶端推送數(shù)據(jù)的技術(shù),基于HTTP協(xié)議,利用長連接特性,它適用于單向數(shù)據(jù)流場景,如股票價格更新、新聞實時推送等,需要的朋友可以參考下
    2025-04-04
  • 從?PageHelper?到?MyBatis?Plugin執(zhí)行概要及實現(xiàn)原理

    從?PageHelper?到?MyBatis?Plugin執(zhí)行概要及實現(xiàn)原理

    這篇文章主要為大家介紹了從?PageHelper?到?MyBatis?Plugin執(zhí)行概要及實現(xiàn)原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Spring Security @PreAuthorize注解分析

    Spring Security @PreAuthorize注解分析

    本教程介紹了如何使用 Spring 方法級安全和 @PreAuthorize 注解來保護(hù) RestController 方法,通過這些步驟,您可以確保只有具有適當(dāng)角色或權(quán)限的用戶才能訪問特定的 REST API,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Spring之AOP兩種代理機(jī)制對比分析(JDK和CGLib動態(tài)代理)

    Spring之AOP兩種代理機(jī)制對比分析(JDK和CGLib動態(tài)代理)

    這篇文章主要介紹了Spring之AOP兩種代理機(jī)制對比分析(JDK和CGLib動態(tài)代理),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • spring中@value注解需要注意的問題

    spring中@value注解需要注意的問題

    本篇文章主要介紹了spring中@value注解需要注意的問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • spring?cloud?gateway中配置uri三種方式

    spring?cloud?gateway中配置uri三種方式

    gateway?組件是SpringCloud?組件中的網(wǎng)關(guān)組件,主要是解決路由轉(zhuǎn)發(fā)的問題,跟nginx有點類似,區(qū)別是nginx多用在前端上,gateway用在后端上,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-08-08
  • Spring Boot配置攔截器及實現(xiàn)跨域訪問的方法

    Spring Boot配置攔截器及實現(xiàn)跨域訪問的方法

    這篇文章主要介紹了Spring Boot配置攔截器及實現(xiàn)跨域訪問的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 詳解Java如何優(yōu)雅的處理異常

    詳解Java如何優(yōu)雅的處理異常

    在編寫 Java 程序的過程中,有一種異常幾乎每個開發(fā)者都會遇到——空指針異常(NullPointerException),那么我們應(yīng)該如何有效且優(yōu)雅的處理空指針異常呢,下面小編就來詳細(xì)介紹這個處理方案吧
    2023-08-08
  • 淺談關(guān)于Java的GC垃圾回收器的一些基本概念

    淺談關(guān)于Java的GC垃圾回收器的一些基本概念

    這篇文章主要介紹了關(guān)于Java的GC垃圾回收器的一些基本概念,牽扯倒JVM內(nèi)存模型的一些知識,需要的朋友可以參考下
    2015-11-11
  • Zookeeper中如何解決zookeeper.out文件輸出位置問題

    Zookeeper中如何解決zookeeper.out文件輸出位置問題

    這篇文章主要介紹了Zookeeper中如何解決zookeeper.out文件輸出位置問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評論

札达县| 大名县| 乌兰浩特市| 广饶县| 磐安县| 加查县| 望奎县| 赤壁市| 巩留县| 黄山市| 台前县| 华蓥市| 会宁县| 肥城市| 桂林市| 红安县| 遂溪县| 剑川县| 马边| 大连市| 鹤岗市| 桦川县| 娱乐| 通辽市| 神池县| 新平| 宝鸡市| 杭锦后旗| 静海县| 黄大仙区| 宁河县| 三穗县| 宜良县| 肇东市| 六盘水市| 永定县| 吐鲁番市| 奈曼旗| 彭阳县| 无为县| 左贡县|