一、request獲取客戶機信息html
//1.獲取客戶端請求的完整URL String url = request.getRequestURL().toString(); System.out.println(url); //2.獲取客戶端請求的資源部分的名稱 String uri = request.getRequestURI(); System.out.println(uri); //3.獲取請求行中參數部分 (即url地址?後面部分) String qStr = request.getQueryString(); System.out.println(qStr); //4.獲取請求客戶端的ip地址 String ip = request.getRemoteAddr(); System.out.println(ip); //5.獲取客戶機的請求方式 String method = request.getMethod(); System.out.println(method); //6.獲取當前web應用的名稱 String name = request.getContextPath(); System.out.println(name); response.sendRedirect(request.getContextPath()+"/index.jsp");
二、request獲取請求頭信息 —— 防盜鏈java
// 獲取請求 是 哪一個頁面連接過來的 能夠用來作防盜鏈 String ref = request.getHeader("Referer"); //若是 連接過來頁面是空 或者不是本地站點,則重定向到本站首頁。 if (ref == null || "".equals(ref) || !ref.startsWith("http://localhost")) { response.sendRedirect(request.getContextPath() + "/index.html"); return; } System.out.println(ref); // 獲取全部請求頭 Enumeration<String> enumeration = request.getHeaderNames(); while (enumeration.hasMoreElements()) { String name = enumeration.nextElement(); String value = request.getHeader(name); System.out.println(name + ":" + value); }
三、request獲取請求參數(參數亂碼)web
// --通知服務器以什麼編碼解碼http請求中的實體內容,因此這行代碼只能解決post提交的亂碼 // 此處明確指定utf-8 是由於服務器通知瀏覽器使用utf-8解析,是服務器控制的 // request.setCharacterEncoding("utf-8"); // 對於get提交只能手動解決請求參數中的亂碼 String username = request.getParameter("username"); username = new String(username.getBytes("iso8859-1"), "utf-8"); System.out.println(username); // getParameter(name) --- String 經過name得到值 // getParameterValues --- String[ ] 經過name得到多值 checkbox // getParameterNames --- Enumeration<String> 得到全部name // getParameterMap --- Map<String,String[ ]> key :name value: 多值 Enumeration<String> enumeration = request.getParameterNames(); while (enumeration.hasMoreElements()) { String name = enumeration.nextElement(); String value = request.getParameter(name); System.out.println(name + ":" + value); }
四、利用請求域傳遞對象
做用範圍:整個請求鏈上
生命週期:當服務器收到一個請求,建立出表明請求的request對象,request開始.當請求結束,服務器銷燬表明請求的request對象,request域結束.
做用:在整個請求鏈範圍內共享數據,一般咱們在Servlet中處理好的數據會存入request域後請求轉發到jsp頁面來進行展現
setAttribute
getAttribute
removeAttribute瀏覽器
五、實現請求轉發和請求包含服務器
A、請求轉發:jsp
this.getServletContext().getRequestDispatcher("").forward(request,response);
request.getRequestDispatcher("").forward(request,response);
~請求轉發是但願將請求交給另一個資源執行,因此應該保證只有最後真正要執行的資源纔可以輸出數據,因此:佈局
*請求轉發時,若是已經有數據被寫入到了response的緩衝區,可是這些數據尚未被髮送到客戶端,則請求轉發時,這些數據將會被清空.可是清空的只是響應中的實體內容部分,頭信息並不會被清空.post
*而請求轉發時已經有數據被打給了瀏覽器,那麼再進行請求轉發,不能成功,會拋出異常,緣由是響應已經結束了,再轉發交給其餘人沒意義了this
*在最終輸出數據的Servlet執行完成後,response實體內容中的數據將會被設置爲已提交的狀態,再往裏寫數據也不會起做用編碼
-------使用以上三條,就保證了最終只有一個Servlet可以向瀏覽器輸出數據,因此 *一個Servlet裏兩次請求轉發也是不能夠的,一次請求交給兩人處理天然也是不行. B、請求包含:將兩個資源的輸出進行合併後輸出 this.getServletContext().getRequestDispatcher("").include(request,response); request.getRequestDispatcher("").include(request,response); *被包含的Servlet程序不能改變響應消息的狀態碼和響應頭,若是它裏面存在這樣的語句,這些語句的執行結果將被忽略 *常被用來進行頁面佈局 C、三種資源處理方式的區別 請求重定向 response.sendRedirect(); 請求轉發 request.getRequestDispatcher().forward(); 請求包含 request.getRequestDispatcher().include(); 請求重定向和請求轉發的區別: 請求重定向地址欄會發生變化.請求轉發地址欄不發生變化. 請求重定向兩次請求兩次響應.請求轉發一次請求一次響應. 若是須要在資源跳轉時利用request域傳遞域屬性則必須使用請求轉發 若是但願資源跳轉後修改用戶的地址欄則使用請求重定向 若是使用請求轉發也能夠重定向也能夠,則優先使用請求轉發,減小瀏覽器對服務器的訪問次數減輕服務器的壓力.