亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于Cookie與Session的Servlet?API會(huì)話管理操作

 更新時(shí)間:2022年08月01日 08:44:22   作者:未見花聞  
這篇文章主要為大家介紹了基于Cookie與Session的Servlet?API會(huì)話管理操作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

??前面的話??

本篇文章將介紹Servlet中的會(huì)話管理操作,前面在介紹HTTP的時(shí)候,我們已經(jīng)說了Cookie與Session的基本原理,Cookie相當(dāng)于就診卡,就診卡一刷得到的信息就相當(dāng)于Session,Servlet對(duì)Cookie與Session有著很好的支持,可以實(shí)現(xiàn)會(huì)話的管理操作。

??1.Cookie與Session

??1.1回顧與理解Cookie與Session

通過學(xué)習(xí)HTTP,我們知道HTTP協(xié)議是“無狀態(tài)”協(xié)議,這里的“無狀態(tài)”指的是默認(rèn)情況下 HTTP 協(xié)議的客戶端和服務(wù)器之間的當(dāng)次通信, 和下次通信之間沒有直接的聯(lián)系,但是在實(shí)際開發(fā)中是需要建立起來聯(lián)系的,比如一個(gè)網(wǎng)站的登錄,在生活中,我們登錄一次網(wǎng)站后,再退出網(wǎng)站后,再次登錄網(wǎng)站,我們會(huì)發(fā)現(xiàn)并不需要再次輸入賬號(hào)密碼登錄,網(wǎng)站會(huì)自動(dòng)地幫助我們登錄。

為了實(shí)現(xiàn)類似這種網(wǎng)站的自動(dòng)登錄,在用戶第一次輸入賬號(hào)密碼登錄的時(shí)候,服務(wù)器會(huì)創(chuàng)建一個(gè)Session會(huì)話來保存當(dāng)前用戶的數(shù)據(jù)和信息,和生成一個(gè)Cookie,Cookie里面含有該Session里面的一些關(guān)鍵身份信息,服務(wù)器會(huì)將這個(gè)Cookie作為響應(yīng)給客戶端,客戶端或者說是瀏覽器就會(huì)將這個(gè)Cookie儲(chǔ)存起來,當(dāng)下一次登錄時(shí),瀏覽器發(fā)送請(qǐng)求的時(shí)候就會(huì)帶上這個(gè)Cookie,服務(wù)器收到請(qǐng)求后會(huì)去獲取請(qǐng)求中的Cookie列表,并去查詢服務(wù)器中是否存在對(duì)應(yīng)的Session,如果存在就會(huì)自動(dòng)登錄,不用用戶輸入賬號(hào)與密碼,否則需要用戶輸入賬號(hào)密碼進(jìn)行登錄。

打個(gè)比方來說,去醫(yī)院看病需要先掛號(hào),如果你沒有當(dāng)前醫(yī)院的就診卡,就會(huì)為你新辦理一個(gè)就診卡,這個(gè)就診卡里面含有你的一些關(guān)鍵身份信息,并且會(huì)在醫(yī)院的服務(wù)器上新建一個(gè)檔案,得到這個(gè)就診卡,你就可以在該醫(yī)院的各個(gè)科室進(jìn)行刷卡,如果你之前在這個(gè)醫(yī)院有就診記錄,你一刷卡就可以查詢到你所有在當(dāng)前醫(yī)院的就診信息。 上面的這個(gè)就診卡就相當(dāng)于這里的Cookie,上面有你最基本的身份信息,在醫(yī)院服務(wù)器上所儲(chǔ)存有關(guān)你的詳細(xì)信息,就相當(dāng)于一個(gè)會(huì)話,也就是一個(gè)Session,當(dāng)然服務(wù)器上不止你一個(gè)人的Session,它包含很多用戶的信息。

這個(gè)Cookie與Session機(jī)制最主要的作用就是用來識(shí)別用戶的身份信息。

??1.2Servlet會(huì)話管理操作

HttpServletRequest類中,可以使用getSession來獲取或創(chuàng)建會(huì)話與getCookies可以獲取請(qǐng)求中的Cookie列表。

方法描述
HttpSession getSession()在服務(wù)器中獲取會(huì)話. 參數(shù)如果為 true, 則當(dāng)不存在會(huì)話時(shí)新建會(huì)話; 參數(shù)如果為 false, 則當(dāng)不存在會(huì)話時(shí)返回 null
Cookie[] getCookies()返回一個(gè)數(shù)組, 包含客戶端發(fā)送該請(qǐng)求的所有的 Cookie 對(duì)象. 會(huì)自動(dòng)把Cookie 中的格式解析成鍵值對(duì).

對(duì)于getCookies方法,由于Cookie能夠任意自定義鍵值對(duì),如果想要獲取一般的鍵值對(duì),可以使用該方法獲取,但是如果想要獲取特殊的鍵值對(duì),如SessionId,可以通過getSession直接獲取,沒必要通過getCookies方法的途徑來獲取,因?yàn)?code>getSession方法它自動(dòng)幫助我們獲取了SessionId。

調(diào)用getSession方法所做的事情:

創(chuàng)建會(huì)話:

  • 第一步,獲取cookie里面的sessionId字段,相當(dāng)于會(huì)話標(biāo)識(shí)。
  • 第二步,判斷是否在服務(wù)器上存在。
  • 第三步,如果不存在,則創(chuàng)建一個(gè)新的HttpSession對(duì)象,并生成一個(gè)新的sessionId。
  • 第四步,接下來就會(huì)以新生成的sessionId作為key,生成的HttpSession對(duì)象作為value,以鍵值對(duì)形式儲(chǔ)存到類似與哈希表的結(jié)構(gòu)中。
  • 第五步,返回響應(yīng),將sessionId通過set-Cookie字段返回給瀏覽器,這樣瀏覽器就得到了sessionId,瀏覽器就可以將SessionId保存到Cookie中了。

獲取會(huì)話:

  • 第一步,獲取cookie里面的sessionId字段,相當(dāng)于會(huì)話標(biāo)識(shí)。
  • 第二步,判斷是否在服務(wù)器上存在。
  • 第三步,直接查詢HttpServlet對(duì)象,找到直接作為響應(yīng)返回給客戶端。

關(guān)于HttpSession 這個(gè)對(duì)象本質(zhì)上也是一個(gè)鍵值對(duì)的形式,并且允許程序員在對(duì)象中儲(chǔ)存任意的鍵值對(duì)數(shù)據(jù),但是key必須是String, value隨意。

HttpSession里面的每一個(gè)鍵值對(duì)稱為屬性(Attribute),該類中提供了兩個(gè)方法可以用來獲取該對(duì)象中的屬性和儲(chǔ)存屬性(鍵值對(duì))。

方法描述
Object getAttribute(String name)該方法返回在該 session 會(huì)話中具有指定名稱的對(duì)象,如果沒有指定名稱的對(duì)象,則返回 null.
void setAttribute(String name, Object value)該方法使用指定的名稱綁定一個(gè)對(duì)象到該 session 會(huì)話
boolean isNew()判定當(dāng)前是否是新創(chuàng)建出的會(huì)話

Cookie類常用方法 Cookie對(duì)象包含了兩個(gè)屬性,一個(gè)是name,另一個(gè)是value,而在請(qǐng)求中是以鍵值對(duì)的形式儲(chǔ)存的,服務(wù)器收到請(qǐng)求后會(huì)將鍵值對(duì)形式的cookie轉(zhuǎn)換為Cookie對(duì)象。

方法描述
String getName()該方法返回 cookie 的名稱。名稱在創(chuàng)建后不能改變。(這個(gè)值是 Set-Cooke 字段設(shè)置給瀏覽器的)
String getValue()該方法獲取與 cookie 關(guān)聯(lián)的值
void setValue(String newValue)該方法設(shè)置與 cookie 關(guān)聯(lián)的值。

在響應(yīng)中添加Cookie 我們可以通過HttpServletResponse類中的addCookie方法來在響應(yīng)中添加Cookie,它會(huì)作為HTTP響應(yīng)中set-Cookie字段來進(jìn)行表示。

方法描述
void addCookie(Cookie cookie)把指定的 cookie 添加到響應(yīng)中.

??2.常見案例實(shí)現(xiàn)

首先我們先得創(chuàng)建Maven文件,引入依賴,創(chuàng)建必要的路徑,這些過程在之前介紹Servlet使用已經(jīng)詳細(xì)介紹了,這里就不再進(jìn)行贅述了,我們的重點(diǎn)是前端與后端交互過程的實(shí)現(xiàn)。

??2.1登錄邏輯的實(shí)現(xiàn)

我們經(jīng)常上網(wǎng)查詢一些網(wǎng)站什么的,很多網(wǎng)站都會(huì)讓你先登錄,才能使用其中的一些功能,登錄完成之后,一般都會(huì)跳到一個(gè)主頁(yè)網(wǎng)站,下面我們就來簡(jiǎn)單地實(shí)現(xiàn)一下這一套邏輯。

第一步,約定前后端接口。 我們需要實(shí)現(xiàn)兩套交互邏輯,一是登錄跳轉(zhuǎn),二是獲取主頁(yè)。 登錄跳轉(zhuǎn)約定: 約定使用POST請(qǐng)求,響應(yīng)采用302重定向。

獲取主頁(yè)約定: 采用GET請(qǐng)求,響應(yīng)返回一個(gè)頁(yè)面。

第二步,編寫前端交互頁(yè)面 我們的重點(diǎn)是來學(xué)習(xí)登錄的邏輯,因此登錄的界面不需要很好看很復(fù)雜,只要能夠有兩個(gè)輸入框和一個(gè)提交按鈕讓我們輸入賬號(hào)密碼就行。目標(biāo)頁(yè)面如下:

前面我們約定了登錄的跳轉(zhuǎn)采用post請(qǐng)求,由于場(chǎng)景很簡(jiǎn)單,我們直接使用form表單構(gòu)造post請(qǐng)求就可以了。

<!DOCTYPE html>
<html lang="ch">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
    <form action="login" method="post">
        <input type="text" name="username">
        <input type="password" name="password">
        <input type="submit" value="登錄">
    </form>
</body>
</html>

其中input標(biāo)簽的name屬性就對(duì)應(yīng)鍵值對(duì)的key,輸入的內(nèi)容就對(duì)應(yīng)鍵值對(duì)的value。

第三步,編寫后端處理代碼

對(duì)于登錄跳轉(zhuǎn)頁(yè)面post請(qǐng)求處理思路如下:

  • 從請(qǐng)求中獲取賬號(hào)與密碼。
  • 驗(yàn)證賬號(hào)與密碼。
  • 如果驗(yàn)證通過,創(chuàng)建會(huì)話,并將username數(shù)據(jù)加入到會(huì)話中,當(dāng)然還可以加入其它的屬性,比如主頁(yè)被訪問的次數(shù),創(chuàng)建好會(huì)話后,重定向到主頁(yè)index。
  • 如果驗(yàn)證不通過,告知登錄失敗即可。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf8");
        resp.setCharacterEncoding("utf8");
        //獲取用戶賬號(hào)
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //驗(yàn)證賬戶
        //驗(yàn)證按照正常流程應(yīng)該從數(shù)據(jù)庫(kù)讀數(shù)據(jù),但是為了便于演示登錄的邏輯,我們直接將賬號(hào)密碼寫死
        //假設(shè)正確的賬號(hào)與密碼是 zhangsan 123
        if ("zhangsan".equals(username) && "123".equals(password)) {
            //登錄成功
            //創(chuàng)建會(huì)話,為后續(xù)需登錄的頁(yè)面做準(zhǔn)備
            HttpSession httpSession = req.getSession(true);
            httpSession.setAttribute("username", username);
            //初始情況下設(shè)置登錄次數(shù)
            httpSession.setAttribute("count", 0);
            //跳轉(zhuǎn)到目標(biāo)頁(yè)面index
            resp.sendRedirect("index");
        } else {
            //登錄失敗
            resp.getWriter().write("登錄失敗!");
        }
    }
}

獲取主頁(yè)的get請(qǐng)求處理思路:

  • 獲取會(huì)話。
  • 取出會(huì)話信息,將主頁(yè)返回次數(shù)加1并寫回到會(huì)話信息中。
  • 返回一個(gè)簡(jiǎn)單的頁(yè)面。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/index")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //返回一個(gè)主頁(yè)
        //獲取會(huì)話,參數(shù)必須是false
        HttpSession httpSession = req.getSession(false);
        //取出會(huì)話信息
        String username = (String) httpSession.getAttribute("username");
        Integer cnt = (Integer) httpSession.getAttribute("count");
        //訪問次數(shù)加1
        cnt++;
        //寫回到會(huì)話中
        httpSession.setAttribute("count", cnt);
        //構(gòu)造頁(yè)面。我們簡(jiǎn)單構(gòu)造一下就好
        resp.setContentType("text/html; charset=utf8");
        resp.getWriter().write("<h4>歡迎您!" + username + "</h4> <h4>這個(gè)主頁(yè)已經(jīng)被訪問了" + cnt + "次</h4>");
    }
}

抓包結(jié)果:

第一次交互,瀏覽器從服務(wù)器上拿到登錄頁(yè)面。 第二次交互,瀏覽器給服務(wù)器一個(gè)登錄請(qǐng)求,服務(wù)器返回響應(yīng),重定向頁(yè)面。 第三次交互,瀏覽器收到302重定向響應(yīng)后,再次向服務(wù)器發(fā)起請(qǐng)求,訪問主頁(yè)。

效果演示:

??2.2上傳文件

上傳文件時(shí),前端需要使用到form表單,表單中需要使用一種特殊的類型,叫做form-data類型。

提交文件的時(shí)候,瀏覽器會(huì)把文件以form-data的格式構(gòu)造到Http請(qǐng)求中,服務(wù)器可以通過getPart方法來取的Part對(duì)象(文件),再通過Part對(duì)象就能夠獲取到文件信息了。

方法描述
Part getPart(String name)獲取請(qǐng)求中給定 name 的文件
Collection getParts()獲取所有的文件

Part類常用方法:

方法描述
String getSubmittedFileName()獲取提交的文件名
String getContentType()獲取提交的文件類型
long getSize()獲取文件的大小
void write(String path)把提交的文件數(shù)據(jù)寫入磁盤文件

上傳文件的請(qǐng)求采用post請(qǐng)求,使用form表單構(gòu)造post請(qǐng)求,我們來實(shí)現(xiàn)將一個(gè)文件上傳到本機(jī)的一個(gè)目錄下。

前端交互頁(yè)面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>file</title>
</head>
<body>
    <form action="upload" method="post" enctype="multipart/form-data">
        <input type="file" name="myfile">
        <input type="submit" value="提交">
    </form>
</body>
</html>

后端處理代碼:

基本實(shí)現(xiàn)思路:

  • 從請(qǐng)求中獲取Part對(duì)象。
  • 調(diào)用Part對(duì)象的一些方法,獲取文件信息,在磁盤寫文件等。
  • 返回響應(yīng)。
  • 加上@MultipartConfig注解,不然會(huì)出錯(cuò)。
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
@MultipartConfig
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //獲取Part對(duì)象
        Part part = req.getPart("myfile");
        //輸出文件信息
        //文件名
        System.out.println("文件名:" + part.getSubmittedFileName());
        //文件類型
        System.out.println("文件類型:" + part.getContentType());
        //文件大小
        System.out.println("文件大小:" + part.getSize());
        //將文件寫入磁盤
        part.write("D:\\gtee\\Java代碼\\github\\Login\\src\\main\\webapp\\上傳.png");
        //返回響應(yīng)
        resp.setContentType("text/html; charset=utf8");
        resp.getWriter().write("上傳成功!");
    }
}

效果演示:

看看我們的目標(biāo)目錄上有沒有上傳的圖片。

發(fā)現(xiàn)我們上傳的文件已經(jīng)拷貝到我們所寫的磁盤位置上了,我們上傳的文件會(huì)儲(chǔ)存在響應(yīng)的body部分,在這個(gè)body中,會(huì)使用一段隨機(jī)的字符串作為標(biāo)志,表示文件的開始與結(jié)束。

以上就是基于Cookie與Session的Servlet API會(huì)話管理操作的詳細(xì)內(nèi)容,更多關(guān)于Servlet API會(huì)話管理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中Arrays的介紹及使用方法示例

    Java中Arrays的介紹及使用方法示例

    這篇文章主要給大家介紹了關(guān)于Java中Arrays及使用方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • java 淺析代碼塊的由來及用法

    java 淺析代碼塊的由來及用法

    所謂代碼塊是指用"{}"括起來的一段代碼,根據(jù)其位置和聲明的不同,可以分為普通代碼塊、構(gòu)造塊、靜態(tài)塊、和同步代碼塊。如果在代碼塊前加上 synchronized關(guān)鍵字,則此代碼塊就成為同步代碼塊
    2021-10-10
  • Mybatis中resultMap的使用總結(jié)

    Mybatis中resultMap的使用總結(jié)

    resultmap是mybatis中最復(fù)雜的元素之一,它描述如何從結(jié)果集中加載對(duì)象,主要作用是定義映射規(guī)則、級(jí)聯(lián)的更新、定制類型轉(zhuǎn)化器。今天通過本文給大家介紹Mybatis中resultMap的使用,感興趣的朋友參考下吧
    2021-06-06
  • java 中復(fù)合機(jī)制的實(shí)例詳解

    java 中復(fù)合機(jī)制的實(shí)例詳解

    這篇文章主要介紹了java 中復(fù)合機(jī)制的實(shí)例詳解的相關(guān)資料,希望通過本文大家能了解繼承和復(fù)合的區(qū)別并應(yīng)用復(fù)合這種機(jī)制,需要的朋友可以參考下
    2017-09-09
  • Java實(shí)現(xiàn)非對(duì)稱加密的三種方法

    Java實(shí)現(xiàn)非對(duì)稱加密的三種方法

    本文主要介紹了Java實(shí)現(xiàn)非對(duì)稱加密的三種方法,主要包括非對(duì)稱加密算法--DH(密鑰交換),非對(duì)稱加密算法--RSA,非對(duì)稱加密算法--EIGamal,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Java實(shí)現(xiàn)簡(jiǎn)單郵件發(fā)送

    Java實(shí)現(xiàn)簡(jiǎn)單郵件發(fā)送

    這篇文章主要介紹了Java實(shí)現(xiàn)簡(jiǎn)單郵件發(fā)送的相關(guān)資料,實(shí)例講解了java郵件發(fā)送實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下
    2016-02-02
  • SpringBoot淺析安全管理之高級(jí)配置

    SpringBoot淺析安全管理之高級(jí)配置

    安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會(huì)發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會(huì)出現(xiàn)問題,這篇文章主要介紹了SpringBoot安全管理之高級(jí)配置
    2022-08-08
  • 使用mybatis的typeHandler對(duì)clob進(jìn)行流讀寫方式

    使用mybatis的typeHandler對(duì)clob進(jìn)行流讀寫方式

    這篇文章主要介紹了使用mybatis的typeHandler對(duì)clob進(jìn)行流讀寫方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring?Cloud?使用?Resilience4j?實(shí)現(xiàn)服務(wù)熔斷的方法

    Spring?Cloud?使用?Resilience4j?實(shí)現(xiàn)服務(wù)熔斷的方法

    服務(wù)熔斷是為了保護(hù)我們的服務(wù),比如當(dāng)某個(gè)服務(wù)出現(xiàn)問題的時(shí)候,控制打向它的流量,讓它有時(shí)間去恢復(fù),或者限制一段時(shí)間只能有固定數(shù)量的請(qǐng)求打向這個(gè)服務(wù),這篇文章主要介紹了Spring?Cloud?使用?Resilience4j?實(shí)現(xiàn)服務(wù)熔斷,需要的朋友可以參考下
    2022-12-12
  • MyBatis超詳細(xì)講解如何實(shí)現(xiàn)分頁(yè)功能

    MyBatis超詳細(xì)講解如何實(shí)現(xiàn)分頁(yè)功能

    MyBatis-Plus?是一個(gè)?Mybatis?增強(qiáng)版工具,在?MyBatis?上擴(kuò)充了其他功能沒有改變其基本功能,為了簡(jiǎn)化開發(fā)提交效率而存在,本篇文章帶用它實(shí)現(xiàn)分頁(yè)功能
    2022-03-03

最新評(píng)論