HTTP 超文本協議,讓 HTTP 不再難懂(二
一張導圖
導圖內容解析
http請求
請求行+請求頭(多個key-value對象)+一個空行+實體內容
請求行
請求方法
常見方法:get post head trace put delete connect
常用方法:get和post
區別
1、get在URL後面跟上請求數據;post請求數據在實體內容中
2、get提交的數據不超過1kb,post提交的數據沒有限制
3、get最好不要用於提交敏感數據
注意:瀏覽器默認的提交方法是get
請求資源(URI)
URL:統一資源定位符,只能定位互聯網資源。是URI的一個子集
URI:統一資源標記符,用於表示任何資源(本地文件資源、區域網資源、互聯網資源)
協議版本
http 1.0
當前客戶端與伺服器建立連接之後,只能發送一次請求,一次請求之後連接關閉
http 1.1
當前客戶端與伺服器建立連接之後,可以在一次連接中發送多次請求
請求頭
內容
Date 請求發出的時間
Accept 瀏覽器可以接受的數據類型
Accept-Charset 瀏覽器接受的編碼格式
Accept-Encoding 瀏覽器接受的數據壓縮格式
Accept-Language 瀏覽器可以接受的語言
Host (必須)當前請求訪問的目標地址
If-Modified-Since 瀏覽器最後的緩存時間
Referer 當前請求來自於哪裡
User-Agent 瀏覽器類型
Cookie 瀏覽器保存的cookie信息
Connection 瀏覽器跟伺服器的鏈接狀態
close:連接關閉
keep-alive:保持連接
HttpServletRequest獲取請求頭信息
請求行
request.getMethod()
request.getRequestURI()
request.getRequestURL()
request.getProtocol()
請求頭
request.getHeader("請求名稱")
request.getHeaderNames()
實體名稱
request.getInputStream()
傳遞的參數如何獲取
get方式:參數在URL後面
request.getQueryString(); 獲取到的參數需要進一步去解析
post方式:參數在實體內容中
request.getInputStream() 獲取到的參數需要進一步去解析
共同的方式
request.getParameter("參數名") 獲取值只有一個的方式
request.getParameterValues("參數名") 獲取值有多個的方式
request.getParameterNames() 獲取所有參數的名稱
注意問題:html中編碼與getParameter("參數名") 方法中編碼方式不一致導致無法獲取到正確的參數
解決:
1、重新編碼再解碼 name = new String(name .getBytes("iso-8859-1"), "utf-8"); name .getBytes("iso-8859-1")將獲取到的參數用iso-8859-1(getParameter的解碼方式)進行重新編碼,然後再用utf-8進行解碼,從而獲取到正確的參數(中文顯示)
2、在調用getParameter之前重新設置查詢的碼錶:request.setCharacterEncoding("utf-8")。該方法只能對實體內容中的數據編碼起作用
http響應
響應行+響應頭+空行+實體內容
響應行
狀態碼
常見的狀態碼:
200:處理完成並完美返回
302:請求需要進一步細化
404:客戶訪問的資源找不到
500:伺服器資源發送錯誤
描述
ok
not found
internal server error
協議版本
響應頭
常見的響應頭
Location:重定向的地址,和302的狀態碼一起使用
Server: 伺服器類型
Content-Encoding:伺服器發送給瀏覽器的數據壓縮類型
Content-Length:伺服器發送給瀏覽器的數據長度
Conten-Language:伺服器支持的語言
Content-Type:伺服器發送個瀏覽器的數據類型及內容編碼
Last-Modified:伺服器資源的最後修改時間
Refresh:定時刷新
Content-Disposition:告訴瀏覽器以下載的方式打開資源
Set-Cookie:伺服器發送給瀏覽器的coolie信息
Expires, Cacahe-Control, Pragma:通知瀏覽器不進行緩存
Connection:伺服器和瀏覽器的連接狀態
close
keep-alive
響應信息的作用:開發者需要設置響應信息
修改響應信息
方式
響應行
response.setStatus() 設置狀態碼
響應頭
response.setHeader(name, value)
實體內容
response.getWriter().write() 發送字元實體內容
response.getOutputStream().write() 發送位元組實體內容
案例
請求重定向
實現:
1、發送302狀態碼+location響應頭 response.setStatus(302)+response.setHeader("location", "url")
2、response.sendRedirect("uri")
原理
瀏覽器讀到302狀態碼之後,會再次自動向伺服器發送一個請求,請求的地址是location的value值
注意:一共向伺服器發送兩次請求
定時刷新
實現
1、response.setHeader("refresh", "秒數")
2、response.setHeader("refresh", "秒數 ,uri") 隔一定時間跳轉到指定的URI
原理
瀏覽器讀到refresh頭後重新向伺服器發出請求
注意
文件下載 response.setHeader("Content-Disposition", "attachement; filename = "文件名")
Content-Type
實現
1、response.setHeader("content-type", "text/html")
2、response.setContentType("text/html")或者response.setContentType("text/html";charset=utf-8 )
注意問題:伺服器發送給瀏覽器數據的中文亂碼問題
原因:
response.getWriter().write()的默認編碼為iso-8859-1;request.getInputStream() .write()取決於write方法字元串參數本身的編碼,response.setCharacterCharset("utf-8")不起作用
解決:
response.getWriter()之前調用response.setCharacterCharset("utf-8")
request.getInputStream() .write("中文".getByte("utf-8"))
※OSChina 周日亂彈——我2018 年的目標是什麼?
※文本編輯利器 Notepad+10 個強大而又鮮為人知的特性
※OSChina 周三亂彈——逃離帝都,去杭州如何?
TAG:開源中國 |