App下載

Cookie是什么?在Java中如何使用Cookie?

猿友 2021-08-02 14:42:33 瀏覽數(shù) (2563)
反饋

什么是Cookie

在現(xiàn)實(shí)生活中,當(dāng)顧客第一次在超市購(gòu)物,通常服務(wù)員會(huì)詢(xún)問(wèn)是否辦理一張會(huì)員卡來(lái)積分以便日后折扣等福利活動(dòng)。會(huì)員卡會(huì)記錄顧客的姓名、積分、消費(fèi)記錄等信息,如果顧客要參與超市的福利活動(dòng)等都需要提供會(huì)員卡,服務(wù)員在后臺(tái)刷卡查詢(xún)即可知道是哪個(gè)用戶在使用會(huì)員卡。

現(xiàn)在將現(xiàn)實(shí)生活中的案例中的角色互換一下。

當(dāng)用戶沒(méi)有在Web服務(wù)器登記過(guò)用戶信息,而使用網(wǎng)站提供的需登錄的服務(wù)時(shí),服務(wù)器會(huì)告知瀏覽器跳轉(zhuǎn)到登陸頁(yè)面進(jìn)行用戶信息的登記操作,登錄完成之后,瀏覽器向服務(wù)器發(fā)起一次登陸請(qǐng)求,服務(wù)器將用戶的信息存儲(chǔ)到Cookie中,并響應(yīng)給瀏覽器新的Cookie,瀏覽器得到Cookie之后將它存儲(chǔ)到緩存區(qū)。

當(dāng)用戶在Web服務(wù)器登記過(guò)用戶信息,而使用網(wǎng)站提供的需登錄的服務(wù)時(shí),服務(wù)器會(huì)通過(guò)請(qǐng)求中攜帶的Cookie判斷此次請(qǐng)求時(shí)哪個(gè)用戶,并以這個(gè)Cookie的信息去查詢(xún)數(shù)據(jù)庫(kù)等操作,完成用戶需要的服務(wù)。

Cookie的必要

HTTP是無(wú)狀態(tài)協(xié)議,意味著服務(wù)器不會(huì)在兩個(gè)請(qǐng)求之間保留任何數(shù)據(jù)(狀態(tài))。由于Web服務(wù)器要面對(duì)很多用戶的并發(fā)訪問(wèn),為了提高Web服務(wù)器對(duì)并發(fā)訪問(wèn)的處理能力,在設(shè)計(jì)HTTP協(xié)議時(shí)規(guī)定Web服務(wù)器發(fā)送HTTP應(yīng)答報(bào)文和文檔時(shí),不保存發(fā)出請(qǐng)求的Web瀏覽器進(jìn)程的任何狀態(tài)信息,從而減輕服務(wù)器端的負(fù)載,同時(shí)無(wú)狀態(tài)也減小了HTTP請(qǐng)求的開(kāi)銷(xiāo)。

但是在必要的場(chǎng)景,如登陸、購(gòu)物等都需要保存用戶的狀態(tài)(信息),就不得不用到Cookie。

Cookie如何工作

第一次訪問(wèn)服務(wù)器,沒(méi)有Cookie,向服務(wù)器登記新的Cookie。

第二次及以后訪問(wèn)服務(wù)器,有Cookie,無(wú)需登記新的Cookie。

模擬用戶登錄

需求分析:

當(dāng)用戶訪問(wèn)homepage.jsp時(shí),判斷請(qǐng)求中是否攜帶username的Cookie,如果不存在就通知瀏覽器跳轉(zhuǎn)到登錄頁(yè)面進(jìn)行用戶信息的登記。當(dāng)用戶再次訪問(wèn)homepae.jsp時(shí),不會(huì)被攔截,可以讓用戶訪問(wèn)個(gè)人主頁(yè)頁(yè)面。

編寫(xiě)代碼:

個(gè)人主頁(yè)的Servlet

@WebServlet(name = "homepageServlet", urlPatterns = "/homepage")
public class HomePageServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
            if (!cookie.getName().equals("username")) {
                // 如果用戶是第一次訪問(wèn)個(gè)人主頁(yè),就通知瀏覽器跳轉(zhuǎn)到登陸頁(yè)面進(jìn)行登錄
                resp.sendRedirect(req.getContextPath() + "/login.jsp");
            }
        }
    }

}

用戶登錄的Servlet

@WebServlet(name = "loginServlet", urlPatterns = "/login")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 獲取http請(qǐng)求參數(shù)username
        String username = request.getParameter("username");
        // 設(shè)置響應(yīng)內(nèi)容的類(lèi)型
        response.setContentType("text/html;charset=utf-8");
        // 獲取Cookie值
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if (!cookie.getName().equals("username")) { // 用戶第一次訪問(wèn)
                Cookie userCookie = new Cookie("username", username);
                userCookie.setMaxAge(300);
                response.addCookie(userCookie);
            }
            response.sendRedirect(request.getContextPath() + "/homepage.jsp");
        }
    }

}

打開(kāi)瀏覽器,實(shí)驗(yàn)一下:

在第一次訪問(wèn)homepage頁(yè)面時(shí),看到瀏覽器緩存區(qū)并沒(méi)有名為username的Cookie,只有當(dāng)?shù)卿浿?,瀏覽器緩存區(qū)才有了這個(gè)Cookie。

以上就是 Cookie 一些相關(guān)的基本介紹,以及在 Java 編程中是如何使用 Cookie的全部?jī)?nèi)容,想要了解更多 Cookie 的相關(guān)知識(shí)以及 JavaWeb 前端的資料請(qǐng)關(guān)注W3Cschool其它相關(guān)文章!也希望大家能夠多多支持我們!

0 人點(diǎn)贊