日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

http访问不到服务器_HTTP及会话技术解析:大魏Java记4

發(fā)布時(shí)間:2024/9/19 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 http访问不到服务器_HTTP及会话技术解析:大魏Java记4 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、關(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。