如何在 SpringBoot 中使用 cookies

如何在 SpringBoot 中使用 cookies

原文: https://attacomsian.com/blog/cookies-spring-boot#further-reading

  • 讀 HTTP Cookie
  • 設(shè)置 HTTP Cookie
  • 讀 All Cookies
  • Cookie 的有效期
  • Secure Cookie
  • HttpOnly Cookie
  • Cookie Scope (范圍)
  • 刪除 Cooke
  • 總結(jié)

HTTP Cookie(也稱為web Cookie檬果、瀏覽器Cookie)是服務(wù)器存儲(chǔ)在用戶瀏覽器中的一小塊信息。服務(wù)器在返回瀏覽器請(qǐng)求的響應(yīng)時(shí)設(shè)置cookies伴奥。瀏覽器存儲(chǔ)cookies槽卫,并將它們與下一個(gè)請(qǐng)求一起發(fā)送回同一服務(wù)器忠烛。Cookie通常用于會(huì)話管理、用戶跟蹤和存儲(chǔ)用戶首選項(xiàng)。

Cookies幫助服務(wù)器跨多個(gè)請(qǐng)求記住客戶機(jī)耘分。如果沒(méi)有cookies,服務(wù)器將把每個(gè)請(qǐng)求都當(dāng)作一個(gè)新的客戶機(jī)來(lái)處理绑警。

在本教程中求泰,我們將學(xué)習(xí)如何在SpringBoot應(yīng)用程序中讀取、設(shè)置和刪除httpcookies计盒。

Reading HTTP Cookie

Spring框架提供@CookieValue注釋來(lái)獲取任何http cookie的值渴频,而無(wú)需迭代從請(qǐng)求中獲取的所有cookie。此注釋可用于將cookie的值映射到控制器方法參數(shù)北启。

@GetMapping("/")
public String readCookie(@CookieValue(value = "username", defaultValue = "Atta") String username) {
    return "Hey! My username is " + username;
}

在上面的代碼片段中卜朗,請(qǐng)注意defaultValue=“Atta”。如果未設(shè)置默認(rèn)值咕村,Spring將拋出java.lang.IllegalStateException異常在HTTP請(qǐng)求中找不到名為username的cookie時(shí)出現(xiàn)異常场钉。

Setting HTTP Cookie

要在Spring Boot中設(shè)置cookie,可以使用HttpServletResponse類的addCookie()方法培廓。您所需要做的就是創(chuàng)建一個(gè)新的Cookie類實(shí)例并將其添加到響應(yīng)中惹悄。

@GetMapping("/change-username")
public String setCookie(HttpServletResponse response) {
    // create a cookie
    Cookie cookie = new Cookie("username", "Jovan");

    //add cookie to response
    response.addCookie(cookie);

    return "Username is changed!";
}

Reading All Cookies

我們也可以使用HttpServletRequest類作為控制器方法參數(shù)來(lái)讀取所有cookie,而不是使用@CookieValue注釋肩钠。此類提供getCookies()方法泣港,該方法將瀏覽器發(fā)送的所有Cookie作為Cookie數(shù)組返回。

@GetMapping("/all-cookies")
public String readAllCookies(HttpServletRequest request) {

    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        return Arrays.stream(cookies)
                .map(c -> c.getName() + "=" + c.getValue()).collect(Collectors.joining(", "));
    }

    return "No cookies";
}

Cookie Expiration

如果沒(méi)有為cookie指定過(guò)期時(shí)間价匠,則只要會(huì)話未過(guò)期当纱,cookie就會(huì)持續(xù)。這種cookies稱為會(huì)話cookies踩窖。會(huì)話Cookie保持活動(dòng)狀態(tài)坡氯,直到用戶關(guān)閉瀏覽器或清除Cookie。上面創(chuàng)建的 username cookie實(shí)際上是一個(gè)會(huì)話cookie。

但是您可以重寫此默認(rèn)行為箫柳,并使用cookie類的 setMaxAge()方法設(shè)置cookie過(guò)期時(shí)間手形。

// create a cookie
Cookie cookie = new Cookie("username", "Jovan");
cookie.setMaxAge(7 * 24 * 60 * 60); // expires in 7 days

//add cookie to response
response.addCookie(cookie);

現(xiàn)在,用戶名cookie將在接下來(lái)的7天內(nèi)保持活動(dòng)狀態(tài)悯恍,而不是在瀏覽器關(guān)閉時(shí)過(guò)期库糠。這種cookie在指定的日期和時(shí)間過(guò)期,稱為永久cookie涮毫。

傳遞給setMaxAge()方法的過(guò)期時(shí)間以秒為單位瞬欧。過(guò)期日期和時(shí)間是相對(duì)于設(shè)置cookie的客戶端的,而不是相對(duì)于服務(wù)器的罢防。

Secure Cookie

安全cookie是僅通過(guò)加密的HTTPS連接發(fā)送到服務(wù)器的cookie艘虎。安全Cookie不能通過(guò)未加密的HTTP連接傳輸?shù)椒?wù)器。

// create a cookie
Cookie cookie = new Cookie("username", "Jovan");
cookie.setMaxAge(7 * 24 * 60 * 60); // expires in 7 days
cookie.setSecure(true);

//add cookie to response
response.addCookie(cookie);

HttpOnly Cookie

HttpOnly Cookie用于防止跨站點(diǎn)腳本(XSS)攻擊咒吐,不能通過(guò)JavaScript 的Document.cookie API 訪問(wèn)野建。當(dāng)為cookie設(shè)置HttpOnly標(biāo)志時(shí),它會(huì)告訴瀏覽器只有服務(wù)器才能訪問(wèn)此特定cookie恬叹。

// create a cookie
Cookie cookie = new Cookie("username", "Jovan");
cookie.setMaxAge(7 * 24 * 60 * 60); // expires in 7 days
cookie.setSecure(true);
cookie.setHttpOnly(true);

//add cookie to response
response.addCookie(cookie);

Cookie Scope

如果未指定作用域贬墩,cookie僅發(fā)送到用于在瀏覽器中設(shè)置它的路徑的服務(wù)器。我們可以使用Cookie類的setPath()方法來(lái)更改此行為妄呕。這將設(shè)置cookie的 Path 參數(shù)。

// create a cookie
Cookie cookie = new Cookie("username", "Jovan");
cookie.setMaxAge(7 * 24 * 60 * 60); // expires in 7 days
cookie.setSecure(true);
cookie.setHttpOnly(true);
cookie.setPath("/"); // global cookie accessible every where

//add cookie to response
response.addCookie(cookie);

Deleting Cookie

要?jiǎng)h除cookie嗽测,請(qǐng)將 Max-Age 參數(shù)設(shè)置為0并重置cookie的值绪励。您還必須傳遞與設(shè)置cookie屬性相同的其他cookie屬性。不要將Max-Age 參數(shù)設(shè)置為 -1唠粥。否則疏魏,瀏覽器會(huì)將其視為會(huì)話cookie。

// create a cookie
Cookie cookie = new Cookie("username", null);
cookie.setMaxAge(0);
cookie.setSecure(true);
cookie.setHttpOnly(true);
cookie.setPath("/");

//add cookie to response
response.addCookie(cookie);

Summary

Cookie提供了一種在服務(wù)器和瀏覽器之間交換信息的方法晤愧,用于管理會(huì)話(登錄大莫、購(gòu)物車、游戲分?jǐn)?shù))官份、記住用戶偏好(主題只厘、隱私策略接受度)以及跟蹤整個(gè)站點(diǎn)的用戶行為。

springboot提供了一種讀取舅巷、寫入和刪除httpcookies的簡(jiǎn)單方法羔味。

  • @CookieValue注釋將cookie的值映射到方法參數(shù)。當(dāng)cookie不可用時(shí)钠右,應(yīng)設(shè)置默認(rèn)值以避免運(yùn)行時(shí)異常赋元。
  • HttpServletResponse類可用于在瀏覽器中設(shè)置新cookie。您只需要?jiǎng)?chuàng)建Cookie類的實(shí)例并將其添加到Response中。
  • 要讀取所有Cookie搁凸,可以使用HttpServletRequest的getCookies()方法媚值,該方法返回一個(gè)Cookie數(shù)組。
  • Max-Age參數(shù)指定cookie過(guò)期的日期和時(shí)間护糖。
  • 如果在cookie中存儲(chǔ)敏感信息褥芒,請(qǐng)確保設(shè)置Secure和HttpOnly標(biāo)志以避免XSS攻擊。
  • 設(shè)置Path=/以使當(dāng)前域的任何地方都可以訪問(wèn)cookie椅文。
  • 若要?jiǎng)h除cookie喂很,請(qǐng)將Max-Age設(shè)置為0,并傳遞用于設(shè)置cookie的所有屬性皆刺。

demo源碼:https://github.com/FDzhang/demo-study/tree/master/demo-springboot/demo-cookies

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末少辣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子羡蛾,更是在濱河造成了極大的恐慌漓帅,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痴怨,死亡現(xiàn)場(chǎng)離奇詭異忙干,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)浪藻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門捐迫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人爱葵,你說(shuō)我怎么就攤上這事施戴。” “怎么了萌丈?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵赞哗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我辆雾,道長(zhǎng)肪笋,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任度迂,我火速辦了婚禮藤乙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘英岭。我一直安慰自己湾盒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布诅妹。 她就那樣靜靜地躺著罚勾,像睡著了一般毅人。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尖殃,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天丈莺,我揣著相機(jī)與錄音,去河邊找鬼送丰。 笑死缔俄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的器躏。 我是一名探鬼主播俐载,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼登失!你這毒婦竟也來(lái)了遏佣?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤揽浙,失蹤者是張志新(化名)和其女友劉穎状婶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體馅巷,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膛虫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钓猬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稍刀。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖敞曹,靈堂內(nèi)的尸體忽然破棺而出掉丽,到底是詐尸還是另有隱情,我是刑警寧澤异雁,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站僧须,受9級(jí)特大地震影響纲刀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜担平,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一示绊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧暂论,春花似錦面褐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)湃窍。三九已至,卻和暖如春匪傍,著一層夾襖步出監(jiān)牢的瞬間您市,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工役衡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茵休,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓手蝎,卻偏偏與公主長(zhǎng)得像榕莺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子棵介,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 3月25日 周一 HTTP緩存 ·加速資源 更好地利用緩存資源锐极,可以提高網(wǎng)站的性能和響應(yīng)速度笙僚。為了優(yōu)化緩存,過(guò)期時(shí)...
    Aniwer閱讀 495評(píng)論 0 0
  • 之前在項(xiàng)目中遇到這個(gè)問(wèn)題灵再,但不太會(huì)肋层。最近各種筆試,這個(gè)問(wèn)題出現(xiàn)的頻率太高了翎迁,幾乎每張?jiān)嚲砩隙加卸安突c(diǎn)時(shí)間總結(jié)了一...
    星期六1111閱讀 2,656評(píng)論 0 15
  • 一, 什么是Cookies? Cookie 是由服務(wù)器保存在用戶瀏覽器(客戶端)上的一塊數(shù)據(jù)汪榔,它可以包含有關(guān)用戶的...
    Stoull閱讀 5,957評(píng)論 0 11
  • HTTP cookies蒲拉,通常又稱作"cookies",已經(jīng)存在了很長(zhǎng)時(shí)間痴腌,但是仍舊沒(méi)有被予以充分的理解雌团。首要的問(wèn)...
    白屏閱讀 6,635評(píng)論 0 50
  • 前言 想要成為一名合格的前端工程師,掌握相關(guān)瀏覽器的工作原理是必備的士聪,這樣子才會(huì)有一個(gè)完整知識(shí)體系锦援,要是「能參透瀏...
    不行了快攔住我閱讀 1,538評(píng)論 0 2