Http
概念:Hyper Text Transfer Protocol 超文本傳輸協議
傳輸協議 : 定義了,客戶端和服務器端通信時,發送資料的格式
特點:
-
基于TCP/IP的高級協議
-
默認埠號:8080
-
基于請求/回應模型的;一次請求對應一次回應
-
Http協議是無狀態的,每次請求都是相互獨立的,不能互動資料
請求訊息資料格式:
-
請求行
請求方式 請求url 請求協議/版本
請求方式:(Http協議有7中請求方式,常用2中)
get:
- 請求引數在請求行中,在Url后
- 請求的url是有限度的
- 不太安全
post:
- 請求引數在請求體中
- 請求引數的url長度沒有限制
- 相對安全
-
請求頭 : 客戶端瀏覽器告訴服務器一些資訊
請求頭名稱 : 請求頭值
-
User-Agent : 瀏覽器告訴服務器, 我訪問你使用的瀏覽器版本資訊
可以在服務器端獲取該頭的資訊,解決瀏覽器的兼容性問題
-
Referer: 告訴服務器,當前請求從哪里來?
? 作用:
防盜鏈:原理:在下載服務器上,來判斷一下上一步提交的網址(來源)是不是我要求的,如果是我要求的,那么可以下載,如果不是,不讓下載
統計作業
-
-
請求空行
空行,就是用于分割POST請求的請求頭,和請求體的
-
請求體 ( 正文 )
封裝post請求訊息的請求引數的
Request:(獲取請求訊息)
Request 與 Response 物件的原理
- 首先我們的瀏覽器給我發了請求(請求訊息),然后我們的請求帶著請求訊息找我們的資源,因為我們在服務器端配置了 url-pattern 找到這個類后 Tomcat會自動執行這個方法 也就是:tomcat 服務器會根據請求的URL中的資源路徑,創建對應的ServletDemo01的物件
- tomcat服務器,會創建
request和response物件,request物件中封裝請求訊息資料 - 將
request和response兩個物件 傳遞給service方法,并且呼叫了Service方法 - 我們可以通過
request物件來獲取請求訊息資料,通過response物件設定回應訊息資料 - (瀏覽器回復回應訊息) 服務器給瀏覽器做出回應之前,會從
response物件中拿出程式員設定的回應訊息資料
Request 繼承體系結構
ServletRequest介面 繼承 HttpServletRequest
HttpServletRequest 介面 實作了RequestFacade類(Tomcat)
Request 獲取請求行資料
GET /Demo02_war_exploded /sd/demo?name=zhangsan HTTP/1.1
方法 :
-
獲取請求方式 :GET
String getMethod() -
獲取虛擬目錄 :Demo02_war_exploded
String getContextPath() -
獲取Servlet路徑 :sd
String getServletPath() -
獲取get方式請求引數:name=zhangsan
String getQueryString() -
獲取請求URI:/Demo02_war_exploded /sd
String getRequestURI();/Demo02_war_exploded /sdStringBuffer getRequestURL()http://localhost//Demo02_war_exploded /sdURI :統一資源識別符號 (URI 要比URL小)
URL :統一資源定位符
-
獲取協議及版本 :HTTP/1.1 (了解就好)
String getProtocol() -
獲取客戶機的IP地址: ( 了解就好)
String getRemoteAddr()
代碼演示 上面的方法
@WebServlet("/sd")
public class ServiceDemo01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取請求方式 GET
System.out.println(request.getMethod());
//獲取虛擬目錄 Demo02_war_exploded
System.out.println(request.getContextPath());
//獲取Servlet路徑 sd
System.out.println(request.getServletPath());
//獲取get方式請求引數
System.out.println(request.getQueryString());
//獲取請求URI
System.out.println(request.getRequestURI());
System.out.println(request.getRequestURL());
//協議和版本
System.out.println(request.getProtocol());
//獲取客戶機IP
System.out.println(request.getRemoteAddr());
}
}

獲取請求頭資料
方法:
- String getHaeder (String name) :通過請求頭的名稱獲取請求的值
- Enumeration getHeaderNames(): 獲取所有的請求頭的名稱
@WebServlet("/sd2")
public class ServiceDemo02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取所有的請求頭名稱
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()){
String s = headerNames.nextElement();
String header = request.getHeader(s);
System.out.println(s+header);
}
}
}

//演示獲取請求頭資料:user-agent 來查看當前我們用的什么瀏覽器
String agent = request.getHeader("user-agent");
if (agent.contains("Chrome")){
System.out.println("谷歌");
}else if (agent.contains("Firefox")){
System.out.println("火狐");
}

防盜鏈:(演示獲取請求頭資料 : referer)
第一個專案 模擬官方 就叫Demo02
@WebServlet("/sd4")
public class ServletDemo03 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//演示獲取請求頭資料 : referer
String referer = request.getHeader("referer");
if(referer != null){
if (referer.contains("/Demo02_war_exploded")){
System.out.println("看電影");
}else {
System.out.println(referer);
System.out.println("來我這里看電影");
}
}
}
}
頁面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>官方的電影院</title>
</head>
<body>
<a href="/Demo02_war_exploded/sd4">點我上天堂</a>
</body>
</html>
在新建一個專案 就叫 Demo04(注意 要新建一個Tomcat 還要區分埠號)
index.jsp 頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>我自己的電影院</title>
</head>
<body>
<a href="http://localhost:8080/Demo02_war_exploded/sd4">點我上天堂</a>
</body>
</html>
先啟動 Demo04 在啟動 Demo02
進入Demo02 后點擊 點我上天堂


在 Demo04 里點擊


獲取請求體資料
請求體:只有POST請求方式才有請求體,在請求體中封裝了POST請求的請求引數
-
獲取流物件
BufferedReader getReader( ); 獲取字符輸入流,對應的只能操作字符資料ServletInputStream getInputStream( ) : 獲取位元組輸入流,可以操作所有的型別的資料 -
再從流物件中拿資料
代碼演示:
@WebServlet("/std4")
public class ServletDemo04 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
BufferedReader reader = request.getReader();
response.setContentType("text/html;charset=utf-8");
String len=null;
while ((len=reader.readLine())!=null){
response.getWriter().write(len);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
頁面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注冊</title>
</head>
<body>
<body>
<form action="${pageContext.request.contextPath}/std4" method="post" enctype="text/plain" accept-charset="UTF-8">
用戶名:<input type="text" placeholder="請輸入用戶名" name="username"/> <br>
密 碼: <input type="password" placeholder="請輸入密碼" name="pwd"/> <br>
<input type="submit" value="提交">
</form>
</body>


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/54113.html
標籤:其他
下一篇:鍋爐四管泄漏及防磨防爆問題分析
