首先說一下Http協議
一.Http協議的概念及作用
1.什么是HTTP協議?
(HTTP,HyperText Transfer Protocol)超文本傳輸協議, 是互聯網上應用最為廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標准。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。1960年美國人Ted Nelson構思了一種通過計算機處理文本信息的方法,並稱之為超文本(hypertext),這成為了HTTP超文本傳輸協議標准架構的發展根基。Ted Nelson組織協調萬維網協會(World Wide Web Consortium)和互聯網工程工作小組(Internet Engineering Task Force )共同合作研究,最終發布了一系列的RFC,其中著名的RFC 2616定義了HTTP 1.1。
2.HTTP協議的作用
HTTP協議規范了傳輸信息的內容和格式
二..HTTP,查看瀏覽器的傳輸過程
1).啟動瀏覽器;
2).按F12,啟動:調試模式,網絡(NetWork)
3).刷新網頁,重新發送請求。
4).可以查看請求信息:
三.HTTP協議_瀏覽器請求信息的組成
請求行
GET /資源路徑 HTTP/1.1
請求頭
請求頭:一堆內容,作為了解即可
Host: localhost:9090 (服務器的域名) Connection: keep-alive (網絡連接是持久的) Content-Length: 12 (發送數據的大小,單位字節) Cache-Control: max-age=0 (設置緩存數據的存活時間,單位秒) Origin: http://localhost:9090 (指示了請求來自於哪個站點——服務器名稱) Upgrade-Insecure-Requests: 1 (如果存在更安全的響應,客戶端優先選擇加密及帶有身份驗證的響應) Content-Type: application/x-www-form-urlencoded (發送數據的媒體類型——發揮作用類似后綴名:.mp3 .avi) User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 (當前系統和瀏覽器版本) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Referer: http://localhost:9090/day01/1.html Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cookie: JSESSIONID=98006861B5044ACC8D5C7840C93C17DA |
3.請求體
如果提交方式為get,則沒有內容
如果提交內容是post,則會存放提交內容的鍵值對形式
四.request對象的基本概念
request,在java中為HttpServletRequest對象
HttpServletRequest對象代表客戶端的請求,當客戶端通過HTTP協議訪問服務器時,HTTP請求中的所有信息都封裝在這個對象中,開發人員通過這個對象的方法,可以獲得客戶這些信息。
注:request對象封裝了http請求中的所有信息,是由服務器創建
五.request對象_獲取請求行信息
java中request對象的六個方法獲取請求行的所有信息
獲取提交方法(getMethod)
獲取請求行中的資源路徑(getRequestURI)
獲取完整的請求URL(getRequestURL)
獲取協議名稱/版本(getProtocol)
獲取IP地址(getRemoteAddr)
獲取本地端口(getLocalPort)
代碼:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 獲取提交方法(getMethod) System.out.println("請求行方法:"+req.getMethod()); // 獲取請求行中的資源路徑(getRequestURI) System.out.println("請求行資源路徑:"+req.getRequestURI()); // 獲取完整的請求URL(getRequestURL) System.out.println("完整的請求URL:"+req.getRequestURL()); // 獲取協議名稱/版本(getProtocol) System.out.println("獲取協議,版本:"+req.getProtocol()); // 獲取IP地址(getRemoteAddr) System.out.println("獲取IP地址:"+req.getRemoteAddr()); // 獲取本地端口(getLocalPort) System.out.println("獲取本地端口:"+req.getLocalPort()); }
當有http請求時,會輸出請求行信息
運行結果
六.request對象_請求頭信息
兩個方法
- String getHeader(String name);以String的形式返回指定name的值
- Enumeration getHeaderNames(),返回此請求包含的所有頭名稱的枚舉
代碼
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //顯示請求頭信息 System.out.println("通過頭名稱name查詢指定信息"); System.out.println("User-Agent"+req.getHeader("User-Agent")); System.out.println("查詢所有信息"); Enumeration<String> hn = req.getHeaderNames(); while(hn.hasMoreElements()){ String str=hn.nextElement(); System.out.println(str+req.getHeader(str)); } }
七.request對象_請求頭_通過referer實現防盜鏈
1.什么是盜鏈?
通過其他網站訪問本網站的一些資源
2.如何防止盜鏈?
思路
通過網頁發送的請求eg.download.jsp
如果download.jsp中的請求,來源於盜鏈者服務器,我們就顯示不可以下載;
如果download.jsp中的請求,來源於正規服務器,我們就顯示可以下載;
實現
通過referer獲取請求頭信息
String header=request.getHeader(“referer”);
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String referer = req.getHeader("referer"); System.out.println(referer); if(referer.startsWith("http://localhost:8080/zc/")||referer.startsWith("http://127.0.0.1:8080/zc/")){ System.out.println("正常連接"); }else{ System.out.println("盜鏈連接"); } }
盜鏈主要通過標紅的地方判斷
八.request對象_獲取請求體
接下來說的是無論是get提交還是post提交,即無論請求體中有沒有數據,都是可以使用的
1).public String getParameter(String key):獲取某個鍵的值。
2).public String[] getParameterValues(String key):獲取一個鍵的多個值(復選框、多選下拉列表)
3).public Map<String,String[]> getParameterMap();獲取所有的鍵值對,並封裝到一個Map中.
4).public void setCharacterEncoding(String charsetName):設置request的解碼方式,如果參數中有中文,
需要使用:"UTF-8"。
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //獲取請求體信息 System.out.println("獲取請求體信息"); String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println("username:"+username); System.out.println("password:"+password); System.out.println("-----------------------------------------------"); //當一個name對應多個值時,例如復選框,下拉列表,使用getParameterValues String[] pv = req.getParameterValues("hobby"); for (String s : pv) { System.out.println(s); } System.out.println("-----------------------------------------------"); //getParameterMap,獲取所有的鍵值對,並封裝到一個對象中 Map<String, String[]> map = req.getParameterMap(); Set<String> strings = map.keySet(); for (String string : strings) { System.out.println(string+" : "+map.get(string)); } }
九.request對象_BeanUtils工具類的使用
1.什么是"BeanUtils":它是一個第三方的軟件包。
作用:自動解析客戶端的請求,並根據一個Map,自動封裝JavaBean。
2..使用步驟:
1).將BeanUtils所需jar包復制到lib目錄下,並關聯到模塊中。
2).使用BeanUtils工具包:
1. 案例代碼
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { User user=new User(); //使用工具類 try { BeanUtils.populate(user,req.getParameterMap()); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } System.out.println(user); }
十.request對象_請求轉發
1).什么是“請求轉發”:當前Servlet進行一部分處理,然后“轉發”給另一個Servlet繼續處理。
2).第一個Servlet,要轉發給另一個Servlet,必須將request和response對象傳給另一個Servlet。
語句:
request.getRequestDispatcher(“路徑”).forward(request,response);
req.getRequestDispatcher("路徑").forward(req,resp);
十一.request對象_其它功能_域對象的概念
1).什么是“域對象”:是指可以在“一定范圍內”可以共享數據的一種對象。
2).幾個重要的域對象:
1).request:可以在轉發的所有路徑上,共享同一個request對象。
2).session:
3).ServletContext:
十二.request對象的生命周期:
1).客戶端每次發送請求,Tomcat都會為本次請求創建一個新的Request對象;
2).在Servlet的處理請求的service()方法執行過程中,一直存活。
如果被轉發,此request會被傳到另一個Servlet,繼續存活;
3).直到service()執行完畢,request對象立即被清理。