http访问不到服务器_HTTP及会话技术解析:大魏Java记4
一、關(guān)于HTTP的協(xié)議版本
HTTP的全稱(chēng)是Hyper Text Transfer Protocol的縮寫(xiě),即超級(jí)文本傳輸協(xié)議。HTTP協(xié)議用于定義瀏覽器與服務(wù)器之間交換數(shù)據(jù)的過(guò)程以及數(shù)據(jù)本身的格式。
HTTP是無(wú)狀態(tài)協(xié)議,對(duì)于事務(wù)處理沒(méi)有記錄能力。因此后續(xù)處理如果需要前面的信息,則它必須重傳,這會(huì)導(dǎo)致每次連接傳送的數(shù)據(jù)量增大.
HTTP目前主要有三個(gè)版本:1.0、1.1、2.0。
http1.0的交互過(guò)程如下圖所示:
缺陷:瀏覽器與服務(wù)器只保持短暫的連接,瀏覽器的每次請(qǐng)求都需要與服務(wù)器建立一個(gè)TCP連接(TCP連接的新建成本很高,因?yàn)樾枰蛻舳撕头?wù)器三次握手),服務(wù)器完成請(qǐng)求處理后立即斷開(kāi)TCP連接,服務(wù)器不跟蹤每個(gè)客戶也不記錄過(guò)去的請(qǐng)求;
解決方案:
添加頭信息——非標(biāo)準(zhǔn)的Connection字段Connection: keep-alive
http1.1:
改進(jìn)點(diǎn):
持久連接
引入了持久連接,即TCP連接默認(rèn)不關(guān)閉,可以被多個(gè)請(qǐng)求復(fù)用,不用聲明Connection: keep-alive(對(duì)于同一個(gè)域名,大多數(shù)瀏覽器允許同時(shí)建立6個(gè)持久連接)
管道機(jī)制
即在同一個(gè)TCP連接里面,客戶端可以同時(shí)發(fā)送多個(gè)請(qǐng)求。
分塊傳輸編碼
即服務(wù)端沒(méi)產(chǎn)生一塊數(shù)據(jù),就發(fā)送一塊,采用”流模式”而取代”緩存模式”。
新增請(qǐng)求方式
PUT:請(qǐng)求服務(wù)器存儲(chǔ)一個(gè)資源;
DELETE:請(qǐng)求服務(wù)器刪除標(biāo)識(shí)的資源;
OPTIONS:請(qǐng)求查詢服務(wù)器的性能,或者查詢與資源相關(guān)的選項(xiàng)和需求;
TRACE:請(qǐng)求服務(wù)器回送收到的請(qǐng)求信息,主要用于測(cè)試或診斷;
CONNECT:保留將來(lái)使用
缺點(diǎn):
雖然允許復(fù)用TCP連接,但是同一個(gè)TCP連接里面,所有的數(shù)據(jù)通信是按次序進(jìn)行的。服務(wù)器只有處理完一個(gè)請(qǐng)求,才會(huì)接著處理下一個(gè)請(qǐng)求。如果前面的處理特別慢,后面就會(huì)有許多請(qǐng)求排隊(duì)等著。這將導(dǎo)致“隊(duì)頭堵塞”
避免方式:一是減少請(qǐng)求數(shù),二是同時(shí)多開(kāi)持久連接
HTTP/2.0
HTTP?2.0協(xié)議是在1.x基礎(chǔ)上的升級(jí)而不是重寫(xiě),1.x協(xié)議的方法,狀態(tài)及api在2.0協(xié)議里是一樣的。2.0協(xié)議重點(diǎn)是對(duì)終端用戶的感知延遲、網(wǎng)絡(luò)及服務(wù)器資源的使用等性能的優(yōu)化。
特點(diǎn):
采用二進(jìn)制格式而非文本格式;
完全多路復(fù)用,而非有序并阻塞的、只需一個(gè)連接即可實(shí)現(xiàn)并行;
使用報(bào)頭壓縮,降低開(kāi)銷(xiāo)
服務(wù)器推送
1. 二進(jìn)制協(xié)議
HTTP/1.1 版的頭信息肯定是文本(ASCII編碼),數(shù)據(jù)體可以是文本,也可以是二進(jìn)制。HTTP/2 則是一個(gè)徹底的二進(jìn)制協(xié)議,頭信息和數(shù)據(jù)體都是二進(jìn)制,并且統(tǒng)稱(chēng)為”幀”:頭信息幀和數(shù)據(jù)幀。
二進(jìn)制協(xié)議解析起來(lái)更高效、“線上”更緊湊,更重要的是錯(cuò)誤更少。
http2.0之所以能夠突破http1.X標(biāo)準(zhǔn)的性能限制,改進(jìn)傳輸性能,實(shí)現(xiàn)低延遲和高吞吐量,就是因?yàn)槠湫略隽硕M(jìn)制分幀層。
在二進(jìn)制分幀層上,http2.0會(huì)將所有傳輸信息分割為更小的消息和幀,并對(duì)它們采用二進(jìn)制格式的編碼將其封裝,新增的二進(jìn)制分幀層同時(shí)也能夠保證http的各種動(dòng)詞,方法,首部都不受影響,兼容上一代http標(biāo)準(zhǔn)。其中,http1.X中的首部信息header封裝到Headers幀中,而request body將被封裝到Data幀中。如下圖所示:
2. 完全多路復(fù)用
HTTP/2 復(fù)用TCP連接,在一個(gè)連接里,客戶端和瀏覽器都可以同時(shí)發(fā)送多個(gè)請(qǐng)求或回應(yīng),而且不用按照順序一一對(duì)應(yīng),這樣就避免了”隊(duì)頭堵塞”。
3. 報(bào)頭壓縮
HTTP 協(xié)議是沒(méi)有狀態(tài),導(dǎo)致每次請(qǐng)求都必須附上所有信息。所以,請(qǐng)求的很多頭字段都是重復(fù)的,比如Cookie,一樣的內(nèi)容每次請(qǐng)求都必須附帶,這會(huì)浪費(fèi)很多帶寬,也影響速度。
對(duì)于相同的頭部,不必再通過(guò)請(qǐng)求發(fā)送,只需發(fā)送一次;
HTTP/2 對(duì)這一點(diǎn)做了優(yōu)化,引入了頭信息壓縮機(jī)制;
一方面,頭信息使用gzip或compress壓縮后再發(fā)送;
另一方面,客戶端和服務(wù)器同時(shí)維護(hù)一張頭信息表,所有字段都會(huì)存入這個(gè)表,產(chǎn)生一個(gè)索引號(hào),之后就不發(fā)送同樣字段了,只需發(fā)送索引號(hào)。
4. 服務(wù)器推送
HTTP/2 允許服務(wù)器未經(jīng)請(qǐng)求,主動(dòng)向客戶端發(fā)送資源;
通過(guò)推送那些服務(wù)器任務(wù)客戶端將會(huì)需要的內(nèi)容到客戶端的緩存中,避免往返的延遲。
二、HTTP的請(qǐng)求方式
HTTP主要有8種請(qǐng)求方式,如下所示:
在這8種HTTP請(qǐng)求方式中,GET和POST是最常用的。網(wǎng)頁(yè)上的form表單的默認(rèn)提交方式是GET(在form表單的method屬性不設(shè)置時(shí))。
在實(shí)際的開(kāi)發(fā)中,我們通常都會(huì)使用POST方式發(fā)送請(qǐng)求,而不是GET,原因有兩個(gè):
(1)POST傳輸數(shù)據(jù)大小無(wú)限制
(2)POST比GET請(qǐng)求方法更安全:GET請(qǐng)求的參數(shù)會(huì)在URL地址欄銘文顯示,而POST請(qǐng)求方式傳遞的參數(shù)隱藏在實(shí)體內(nèi)容中,用戶看不到。
三、HTTP的請(qǐng)求消息與響應(yīng)消息
HTTP的請(qǐng)求消息和響應(yīng)消息是相對(duì)應(yīng)的,都包含三大部分:
HTTP消息除了請(qǐng)求頭和響應(yīng)頭外,還有一些通用頭字段,如下所示:
三、會(huì)話技術(shù)
在Web開(kāi)發(fā)中,服務(wù)器跟蹤用戶信息的技術(shù)成為會(huì)話技術(shù)。
會(huì)話技術(shù)有兩種實(shí)現(xiàn):
(1)Cookie:將會(huì)話的過(guò)程數(shù)據(jù)保存到用戶瀏覽器上。
(2)Session:?將會(huì)話數(shù)據(jù)保存到服務(wù)器端。
Cookie技術(shù)
Cookie通過(guò)將會(huì)話過(guò)程的數(shù)據(jù)保存到用戶的瀏覽器上,使瀏覽器和服務(wù)器可以更好地進(jìn)行數(shù)據(jù)交互。
我們可以形象的將Cookie理解成我們?cè)谏虉?chǎng)辦的會(huì)員卡。卡上記錄了個(gè)人信息、消費(fèi)額度和積分額度等。以后每次去商場(chǎng),商場(chǎng)根據(jù)會(huì)員就能很快了解到顧客的會(huì)員信息。
在Cookie模式下,當(dāng)用戶通過(guò)瀏覽器訪問(wèn)Web服務(wù)器時(shí),web服務(wù)器會(huì)給客戶發(fā)送一些信息,這些信息都保存在Cookie中。這樣,當(dāng)瀏覽器再次訪問(wèn)服務(wù)器時(shí),都會(huì)在請(qǐng)求頭中將Cookie發(fā)送給服務(wù)器,Web服務(wù)器端可以分辨出當(dāng)前請(qǐng)求是由哪個(gè)用戶發(fā)出的,方便服務(wù)器對(duì)瀏覽器做出正確的響應(yīng),如下圖所示:
為了封裝Cookie信息,前端開(kāi)發(fā)語(yǔ)言必要要有對(duì)應(yīng)的方式。傳統(tǒng)Servlet API會(huì)通過(guò)javax.servlet.http.Cookie類(lèi)來(lái)實(shí)現(xiàn)。里面包含生成Cookie信息和提取Cookie信息的方法。由于現(xiàn)在Servlet已經(jīng)不再被大量使用,因此我們不展開(kāi)說(shuō)明。
JavaScript Cookie的詳細(xì)內(nèi)容,可以看這個(gè)鏈接:
https://github.com/js-cookie/js-cookie
需要注意的是,無(wú)論瀏覽器是否支持Cookie,用戶第一次訪問(wèn)程序時(shí),由于服務(wù)器不知道客戶瀏覽器是否支持Cookie,在第一次響應(yīng)的頁(yè)面中都會(huì)對(duì)URL地址進(jìn)行重寫(xiě)。如果瀏覽器支持,那么后續(xù)的訪問(wèn)中都會(huì)使用Cookie的請(qǐng)求投資端將Session的標(biāo)識(shí)號(hào)傳遞給服務(wù)器。由此,服務(wù)器判斷瀏覽器支持Cookie,后續(xù)不再對(duì)URL進(jìn)行重寫(xiě)。否則后續(xù)每個(gè)請(qǐng)求的URL都需要進(jìn)行重寫(xiě)。
Session技術(shù)
Cookie的技術(shù)可以將用戶的信息保存在各自的瀏覽器中,并且可以在多次請(qǐng)求下實(shí)現(xiàn)數(shù)據(jù)的共享。但如果傳遞的信息比較多,使用Cookie技術(shù)會(huì)增大服務(wù)器端的程序處理難度。這時(shí),可以使用Session實(shí)現(xiàn),它是一種將會(huì)話數(shù)據(jù)保存到服務(wù)器上的技術(shù)。
如果形象點(diǎn)說(shuō),Session技術(shù)就好比醫(yī)院發(fā)給病人的就醫(yī)卡。就醫(yī)卡上只有卡號(hào),沒(méi)有其他信息,病人去看病時(shí),主要出示就醫(yī)卡,醫(yī)院就可以根據(jù)卡號(hào)查到病歷檔案的過(guò)程。
當(dāng)瀏覽器訪問(wèn)Web服務(wù)器時(shí),Servlet容器(還以此舉例)會(huì)創(chuàng)建一個(gè)Session對(duì)象和ID屬性。Session對(duì)象相當(dāng)于病例檔案,ID就相當(dāng)于就醫(yī)卡號(hào)。客戶端后續(xù)訪問(wèn)服務(wù)器時(shí),只要將標(biāo)識(shí)號(hào)傳遞給服務(wù)器,服務(wù)器就能根據(jù)請(qǐng)求是哪個(gè)客戶發(fā)的,從而選擇與之對(duì)應(yīng)的Session對(duì)象為其服務(wù)。
需要注意的是:由于客戶端要接受、記錄和發(fā)送Session對(duì)象的ID,而Session是借助Cookie技術(shù)來(lái)傳遞ID屬性的。
Session保存用戶信息如下圖所示:
為了方便理解,我們通過(guò)兩端代碼分別驗(yàn)證Cookie和Session的功能。
需求1:設(shè)計(jì)一個(gè)類(lèi),使用Cookie技術(shù)實(shí)現(xiàn)顯示用戶上次訪問(wèn)時(shí)間的功能。
package cn.itcast.chapter06.cookie.example;
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LastAccessServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request,?HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
/*
* 設(shè)定一個(gè) cookie 的name : lastAccessTime
* 讀取客戶端發(fā)送cookie 獲得用戶上次的訪問(wèn)時(shí)間顯示*/
String lastAccessTime = null;
// 獲取所有的cookie,并將這些cookie存放在數(shù)組中
Cookie[] cookies = request.getCookies();
for (int i = 0; cookies != null && i < cookies.length; i++) {
if ("lastAccess".equals(cookies[i].getName())) {
// 如果cookie的名稱(chēng)為lastAccess,則獲取該cookie的值
lastAccessTime = cookies[i].getValue();
break;
}
}
// 判斷是否存在名稱(chēng)為lastAccess的cookie
if (lastAccessTime == null) {
response.getWriter().print("您是首次訪問(wèn)本站!!!");
} else {
response.getWriter().print("您上次的訪問(wèn)時(shí)間"+lastAccessTime);
}
// 創(chuàng)建cookie,將當(dāng)前時(shí)間作為cookie的值發(fā)送給客戶端
Cookie cookie = new Cookie("lastAccess",new Date().toLocaleString());
cookie.setMaxAge(60*60);//保存1小時(shí)
//訪問(wèn)chapter06下資源時(shí)回送cookie
cookie.setPath("/chapter06");
// 發(fā)送 cookie
response.addCookie(cookie);
}
}
需求2::設(shè)計(jì)一個(gè)類(lèi),使用Session技術(shù)實(shí)現(xiàn)購(gòu)物車(chē)功能。
public class PurchaseServlet extends HttpServlet {
public void doGet(HttpServletRequest req,?HttpServletResponse resp)
throws ServletException, IOException {
// 獲得用戶購(gòu)買(mǎi)的商品
String id = req.getParameter("id");
if (id == null) {
// 如果id為null,重定向到ListBookServlet頁(yè)面
String url = "/chapter06/ListBookServlet";
resp.sendRedirect(url);
return;
}
Book book = BookDB.getBook(id);
// 創(chuàng)建或者獲得用戶的Session對(duì)象
HttpSession session = req.getSession();
// 從Session對(duì)象中獲得用戶的購(gòu)物車(chē)
List cart = (List)
session.getAttribute("cart");
if (cart == null) {
// 首次購(gòu)買(mǎi),為用戶創(chuàng)建一個(gè)購(gòu)物車(chē)(List集合模擬購(gòu)物車(chē))
cart = new ArrayList();
// 將購(gòu)物城存入Session對(duì)象
session.setAttribute("cart", cart);
}
// 將商品放入購(gòu)物車(chē)
cart.add(book);
// 創(chuàng)建Cookie存放Session的標(biāo)識(shí)號(hào)
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60 * 30);
cookie.setPath("/chapter06");
resp.addCookie(cookie);
// 重定向到購(gòu)物車(chē)頁(yè)面
String url = "/chapter06/CartServlet";
resp.sendRedirect(url);
}
}
參考:
《Jva Web程序開(kāi)發(fā)入門(mén)》-清華大學(xué)出版社
https://zhuanlan.zhihu.com/p/89471776
https://zhuanlan.zhihu.com/p/89471776
總結(jié)
以上是生活随笔為你收集整理的http访问不到服务器_HTTP及会话技术解析:大魏Java记4的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 航母在海上容易被发现吗?为什么?
- 下一篇: string修饰的梦修改吗_Java S