Spinrg WebFlux中Cookie的讀寫的示例
WebFLux與WebMvc的差異
WebFlux讀寫Cookie不像WebMvc那么直接,最主要的原因是WebMvc是基于Servlet規(guī)范的,而WebFlux僅僅遵守的是HTTP協(xié)議。所以在使用的時候會發(fā)現(xiàn)HttpServletRequest、HttpServletResponse這些Servlet層級的接口根本就無法使用。
Cookie與Servlet并沒有太直接的關(guān)系,前者是屬于HTTP規(guī)范的而后者是一個J2EE的規(guī)范,在應(yīng)用層面僅有的聯(lián)系就是Servlet會讀寫Cookie中的JSESSIONID來標(biāo)記與前端瀏覽器和服務(wù)端的關(guān)系。而HttpServletRequest、HttpServletResponse僅是Servlet為請求和響應(yīng)提供header、body管理的接口。
WebFlux的Cookie管理
WebFlux目前并沒有為寫Cookie提供任何工具。這就需要開發(fā)者按照HTTP的規(guī)范來寫Cookie。 在HTTP協(xié)議交互的過程中,服務(wù)端可以通過在response中添加Set-Cookie頭來讓瀏覽器記錄Cookie,而瀏覽器則在request中使用Cookie頭來傳遞cookie。
寫Cookie
寫cookie使用ResponseEntity向response頭中添加Set-Cookie即可。CookieBuilder的代碼比較長,它是用于構(gòu)建一個cookie字符串,Set-Cookie頭除了設(shè)置key=value,還可以設(shè)置過期日期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的過期日期為GMT格式的時間。 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這個Annotation來獲?。?/p>
@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來獲取value。而使用RequestEntity需要從頭中先獲取Cookie的內(nèi)容,然后再解析key和value,存在一個key對應(yīng)多個value的情況需要使用RequestEntity。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之二叉堆
二叉堆是一種特殊的堆,其實質(zhì)是完全二叉樹。二叉堆有兩種:最大堆和最小堆。最大堆是指父節(jié)點鍵值總是大于或等于任何一個子節(jié)點的鍵值。而最小堆恰恰相反,指的是父節(jié)點鍵值總是小于任何一個子節(jié)點的鍵值2022-02-02詳解Java函數(shù)式編程和lambda表達(dá)式
這篇文章主要介紹了Java函數(shù)式編程和lambda表達(dá)式,對lambda感興趣的同學(xué),一定要看一下2021-04-04Java開發(fā)之內(nèi)部類對象的創(chuàng)建及hook機制分析
這篇文章主要介紹了Java開發(fā)之內(nèi)部類對象的創(chuàng)建及hook機制,結(jié)合實例形式分析了java基于hook機制內(nèi)部類對象的創(chuàng)建與使用,需要的朋友可以參考下2018-01-01