Spinrg WebFlux中Cookie的讀寫(xiě)的示例
WebFLux與WebMvc的差異
WebFlux讀寫(xiě)Cookie不像WebMvc那么直接,最主要的原因是WebMvc是基于Servlet規(guī)范的,而WebFlux僅僅遵守的是HTTP協(xié)議。所以在使用的時(shí)候會(huì)發(fā)現(xiàn)HttpServletRequest、HttpServletResponse這些Servlet層級(jí)的接口根本就無(wú)法使用。
Cookie與Servlet并沒(méi)有太直接的關(guān)系,前者是屬于HTTP規(guī)范的而后者是一個(gè)J2EE的規(guī)范,在應(yīng)用層面僅有的聯(lián)系就是Servlet會(huì)讀寫(xiě)Cookie中的JSESSIONID來(lái)標(biāo)記與前端瀏覽器和服務(wù)端的關(guān)系。而HttpServletRequest、HttpServletResponse僅是Servlet為請(qǐng)求和響應(yīng)提供header、body管理的接口。
WebFlux的Cookie管理
WebFlux目前并沒(méi)有為寫(xiě)Cookie提供任何工具。這就需要開(kāi)發(fā)者按照HTTP的規(guī)范來(lái)寫(xiě)Cookie。 在HTTP協(xié)議交互的過(guò)程中,服務(wù)端可以通過(guò)在response中添加Set-Cookie頭來(lái)讓瀏覽器記錄Cookie,而瀏覽器則在request中使用Cookie頭來(lái)傳遞cookie。
寫(xiě)Cookie
寫(xiě)cookie使用ResponseEntity向response頭中添加Set-Cookie即可。CookieBuilder的代碼比較長(zhǎng),它是用于構(gòu)建一個(gè)cookie字符串,Set-Cookie頭除了設(shè)置key=value,還可以設(shè)置過(guò)期日期expires,域名domain,路徑path等。
@RestController
@RequestMapping("/cookie")
public class CookieReadAWriteController {
@GetMapping("/write")
public ResponseEntity<String> cookieWrite() {
HttpHeaders headers = new HttpHeaders();
String cookie = new CookieBuilder().setKey("cookie-text")
.setValue(cookieText)
.setMaxAge(840000)
.setPath("/")
.build();
headers.add("Set-Cookie", cookie);
return new ResponseEntity<String>("hi," + userName, headers, HttpStatus.OK);
}
}
class CookieBuilder {
private String key;
private String value;
private String expires;
private String domain;
private String path;
public CookieBuilder setKey(String key) {
this.key = key;
return this;
}
public CookieBuilder setValue(String value) {
this.value = value;
return this;
}
public CookieBuilder setMaxAge(long ms) {
//cookie的過(guò)期日期為GMT格式的時(shí)間。
Date date = new Date(new Date().getTime() + ms);
SimpleDateFormat sdf = new SimpleDateFormat("EEE d MMM yyyy HH:mm:ss 'GMT'", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
this.expires = sdf.format(date);
return this;
}
public CookieBuilder setDomain(String domain) {
this.domain = domain;
return this;
}
public CookieBuilder setPath(String path) {
this.path = path;
return this;
}
public String build() {
StringBuilder sb = new StringBuilder();
sb.append(this.key);
sb.append("=");
sb.append(this.value);
sb.append(";");
if (null != this.expires) {
sb.append("expires=");
sb.append(this.expires);
sb.append(";");
}
if (null != this.domain) {
sb.append("domain=");
sb.append(this.domain);
sb.append(";");
}
if (null != this.path) {
sb.append("path=");
sb.append(this.path);
sb.append(";");
}
return sb.toString();
}
}
讀cookie
獲取cookie就比較直觀,可以直接使用@CookieValue這個(gè)Annotation來(lái)獲取:
@RestController
@RequestMapping("/cookie")
public class CookieReadAWriteController {
@GetMapping("/read/annotation")
/**
* @param value
* @return
*/
public String cookieReadAnnotation(@CookieValue("cookie-text") String value) {
return "當(dāng)前Cookie中的內(nèi)容" + value;
}
}
也可以直接從Request的Header中獲?。?/p>
@RestController
@RequestMapping("/cookie")
public class CookieReadAWriteController {
@GetMapping("/read/annotation")
/**
* @param value
* @return
*/
@GetMapping("/read/entity")
public String cookieReadEntity(RequestEntity<String> entity) {
HttpHeaders headers = entity.getHeaders();
List<String> cookie = headers.get("Cookie");
return "當(dāng)前Cookie中的內(nèi)容" + cookie;
}
}
使用Annotatin是直接標(biāo)記Cookie的key來(lái)獲取value。而使用RequestEntity需要從頭中先獲取Cookie的內(nèi)容,然后再解析key和value,存在一個(gè)key對(duì)應(yīng)多個(gè)value的情況需要使用RequestEntity。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之二叉堆
二叉堆是一種特殊的堆,其實(shí)質(zhì)是完全二叉樹(shù)。二叉堆有兩種:最大堆和最小堆。最大堆是指父節(jié)點(diǎn)鍵值總是大于或等于任何一個(gè)子節(jié)點(diǎn)的鍵值。而最小堆恰恰相反,指的是父節(jié)點(diǎn)鍵值總是小于任何一個(gè)子節(jié)點(diǎn)的鍵值2022-02-02
詳解Java函數(shù)式編程和lambda表達(dá)式
這篇文章主要介紹了Java函數(shù)式編程和lambda表達(dá)式,對(duì)lambda感興趣的同學(xué),一定要看一下2021-04-04
java?讀寫(xiě)鎖的使用及它的優(yōu)點(diǎn)
這篇文章主要介紹了java?讀寫(xiě)鎖的使用及它的優(yōu)點(diǎn),讀寫(xiě)鎖的特點(diǎn)就是是讀讀不互斥、讀寫(xiě)互斥、寫(xiě)寫(xiě)互斥,下面具體使用分享需要的小伙伴可以參考一下2022-05-05
Java開(kāi)發(fā)之內(nèi)部類(lèi)對(duì)象的創(chuàng)建及hook機(jī)制分析
這篇文章主要介紹了Java開(kāi)發(fā)之內(nèi)部類(lèi)對(duì)象的創(chuàng)建及hook機(jī)制,結(jié)合實(shí)例形式分析了java基于hook機(jī)制內(nèi)部類(lèi)對(duì)象的創(chuàng)建與使用,需要的朋友可以參考下2018-01-01
Java項(xiàng)目中添加外部jar包的兩種方式(收藏版)
這篇文章主要介紹了java項(xiàng)目中添加外部jar包的兩種方式,第二種方式是將外部jar包引入到本地maven倉(cāng)庫(kù)中,本文給大家講解的非常詳細(xì),需要的朋友可以參考下2023-03-03
java使用PageInfo的list通用分頁(yè)處理demo
這篇文章主要為大家介紹了java使用PageInfo的list通用分頁(yè)處理demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2023-12-12

