day10_17——request

;Request - ->封裝了客戶端所有的請求數(shù)據(jù)

1、獲取常用的信息

(1) 獲取客戶端IP——requset.getRemoteAddr(); ??案例:封IP

(2) 請求方式——request.getMethod(); ??

2、獲取HTTP請求頭

(1) *****String getHeader(String name),適合單值頭

(2)int getIntHeader(String name),適合單值int類型的請求頭

(3) long getDateHeader(String name),適合單值毫秒類型的請求頭

(4) Enumeration getHeader(String name),適合用于多值請求頭

案例:

/**

*獲取客戶端的IP地址、請求方式、獲取User-Agent,得到客戶端信息

?*/

public?void?doGet(HttpServletRequest request, HttpServletResponse response)

throws?ServletException, IOException {

//獲取IP

String addr = request.getRemoteAddr();

System.out.println("IP:"?+ addr);

//獲取請求方式

System.out.println("請求方式:"?+ request.getMethod());

//獲取名為User-Agent的請求頭

String useragent = request.getHeader("User-Agent");

// System.out.println(useragent);

// Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36

if(useragent.toLowerCase().contains("chrome")){

System.out.println("你好"+addr+",你用的瀏覽器是谷歌");

}else?if(useragent.toLowerCase().contains("firefox")){

System.out.println("你好"+addr+",你用的瀏覽器是火狐");

}else?if(useragent.toLowerCase().contains("msie")){

System.out.println("你好"+addr+",你用的瀏覽器是IE");

}

}

3、獲取請求URL

http://localhost:8080/RequseDemo/AServlet?username=xxx&password=yyy

(1) String getScheme():獲取協(xié)議,http

(2) String getServerName():獲取服務(wù)器名,localhost

(3) String getServerPort():獲取服務(wù)器端口,8080

(4) String getContextPath():獲取項(xiàng)目名,/RequseDemo

(5) String getServletPath():獲取Servlet路徑,/AServlet

(6) String getQueryString():獲取參數(shù)部分問號后面的部分username=xxx&password=yyy

(7) String getRequestURI():獲取請求URL,項(xiàng)目名+Servlet路徑/RequseDemo/AServlet

(8) String getRequestURL():獲取請求REL,http://localhost:8080/RequseDemo/AServlet

案例一:

/**

*獲取URL的信息

?*

?* @author趙奇

?*/

public?void?doGet(HttpServletRequest request, HttpServletResponse response)

throws?ServletException, IOException {

response.getWriter().print("<br/>"?+ request.getScheme() + "<br/>");//獲取協(xié)議名

response.getWriter().print(request.getServerName() + "<br/>");//獲取服務(wù)器名

response.getWriter().print(request.getServerPort() + "<br/>");//獲取端口名

response.getWriter().print(request.getContextPath() + "<br/>");//獲取項(xiàng)目名

response.getWriter().print(request.getServletPath() + "<br/>");//獲取Servlet路徑

response.getWriter().print(request.getQueryString() + "<br/>");//獲取獲取問好后面

response.getWriter().print(request.getRequestURI() + "<br/>");//請求URI

response.getWriter().print(request.getRequestURL() + "<br/>");//請求URL

}


案例二:Referer防盜鏈(Referer請求頭表示請求的來源)

/**

*演示Referer防盜鏈

?* @author趙奇

?*/

public?void?doGet(HttpServletRequest request, HttpServletResponse response)

throws?ServletException, IOException {

String s = request.getHeader("Referer");

// System.out.println(s);

if?(s == null?|| !s.contains("localhost")) {

response.sendRedirect("http://www.baidu.com");

} else?{

System.out.println("hello");

}

}

4、獲取請求參數(shù)

請求參數(shù)是由客戶端發(fā)送給服務(wù)器的,有可能是在請求體中POST,也可能是在URL之后GET

請求參數(shù):有一個(gè)參數(shù)一個(gè)值的,還有一個(gè)參數(shù)多個(gè)值的

> ***** String ?getParameter(String name):獲取指定名稱的請求參數(shù),適合單值請求參數(shù)

> String[] ?getParameterValues(String name):獲取指定名稱的請求參數(shù)值,用于多值請求參數(shù)

>Enumeration ?getParameterNames():獲取所有請求參數(shù)名稱

>***** Map ?getParameterMap():獲取所有請求參數(shù)。

案例:

/**

*演示Request獲取請求參數(shù)

?*

?* @author趙奇

?*/

public?void?doGet(HttpServletRequest request, HttpServletResponse response)

throws?ServletException, IOException {

System.out.println("GET: "?+ request.getParameter("xxx"));

System.out.println("GET: "?+ request.getParameter("yyy"));

}

public?void?doPost(HttpServletRequest request, HttpServletResponse response)

throws?ServletException, IOException {

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

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

String[] hobby = request.getParameterValues("hobby");


System.out.println(username + ","?+ password + ","

+ Arrays.toString(hobby));

/*

*測試獲取所有請求參數(shù)的名稱

?*/

Enumeration<String> e = request.getParameterNames();

while?(e.hasMoreElements()) {

System.out.println(e.nextElement());

}

/*

*獲取所有請求參數(shù)并存到Map中

?*/

Map<String, String[]> map = request.getParameterMap();

for?(String name : map.keySet()) {

String[] values = map.get(name);

System.out.println(name + "-"?+ Arrays.toString(values));

}

}


5、請求轉(zhuǎn)發(fā)和請求包含

RequestDispatcher rd = request.getRequestDispatcher(“/MyServlet”);

使用request獲取RequestDispatcher對象,方法的參數(shù)是被轉(zhuǎn)發(fā)或包含的Servlet的Servlet路徑

請求轉(zhuǎn)發(fā):rd.forward(request,response);(重點(diǎn))

請求包含:rd.include(request,response);

有時(shí)一個(gè)請求需要多個(gè)Servlet協(xié)作才能完成,所有需要在一個(gè)Servlet跳到另外一個(gè)Servlet

>一個(gè)請求跨多個(gè)Servlet,需要使用轉(zhuǎn)發(fā)和包含

>請求轉(zhuǎn)發(fā):由下一個(gè)Servlet完成響應(yīng)體,當(dāng)前Servlet可以設(shè)置響應(yīng)頭(留頭不留體)

>請求包含:由兩個(gè)Servlet共同完成響應(yīng)體(都留)

>無論是請求轉(zhuǎn)發(fā)還是請求包含,都在一個(gè)請求范圍內(nèi)使用request和response

6、Request域

Servlet中三大域?qū)ο螅簉equest、session、application,都有如下三個(gè)方法:

(1) void setAttribute(String name,Object value)

(2) Object getAttribute(String name)

(3) Void removeAttribute(String name)

**同一個(gè)請求范圍內(nèi)使用request.setAttribute()、request.getAttribute()來傳值,前一個(gè)Servlet調(diào)用setAttribute()保存值,后一個(gè)Servlet調(diào)用getAttribute()獲取值。


7、請求轉(zhuǎn)發(fā)和重定向的區(qū)別

(1) 請求轉(zhuǎn)發(fā)是一個(gè)請求一次響應(yīng),而重定向是兩次請求兩次響應(yīng)

(2) 請求轉(zhuǎn)發(fā)地址欄不變化,重定向后顯示后一個(gè)請求的地址

(3) 請求轉(zhuǎn)發(fā)只能轉(zhuǎn)發(fā)到本項(xiàng)目的其他Servlet,而重定向不只能重定向到本項(xiàng)目

的其他Servlet,還能定向到其他項(xiàng)目。

(4) 請求轉(zhuǎn)發(fā)是服務(wù)器端行為,只需要給出轉(zhuǎn)發(fā)的Servlet路徑,而重定向需要給出

requestURL,即包含項(xiàng)目名。

(5) 請求轉(zhuǎn)發(fā)和重定向效率是轉(zhuǎn)發(fā)高,因?yàn)槭且粋€(gè)請求

① 需要地址欄發(fā)生變化時(shí)必須使用重定向

② 需要在下一個(gè)Servlet中獲取request域中的數(shù)據(jù)時(shí)必須使用轉(zhuǎn)發(fā)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容