溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spinrg WebFlux中Cookie的讀寫的示例

發(fā)布時間:2020-10-23 07:08:00 來源:腳本之家 閱讀:238 作者:隨風溜達的向日葵 欄目:編程語言

WebFLux與WebMvc的差異

WebFlux讀寫Cookie不像WebMvc那么直接,最主要的原因是WebMvc是基于Servlet規(guī)范的,而WebFlux僅僅遵守的是HTTP協(xié)議。所以在使用的時候會發(fā)現(xiàn)HttpServletRequest、HttpServletResponse這些Servlet層級的接口根本就無法使用。

Cookie與Servlet并沒有太直接的關系,前者是屬于HTTP規(guī)范的而后者是一個J2EE的規(guī)范,在應用層面僅有的聯(lián)系就是Servlet會讀寫Cookie中的JSESSIONID來標記與前端瀏覽器和服務端的關系。而HttpServletRequest、HttpServletResponse僅是Servlet為請求和響應提供header、body管理的接口。

WebFlux的Cookie管理

WebFlux目前并沒有為寫Cookie提供任何工具。這就需要開發(fā)者按照HTTP的規(guī)范來寫Cookie。 在HTTP協(xié)議交互的過程中,服務端可以通過在response中添加Set-Cookie頭來讓瀏覽器記錄Cookie,而瀏覽器則在request中使用Cookie頭來傳遞cookie。

寫Cookie

寫cookie使用ResponseEntity向response頭中添加Set-Cookie即可。CookieBuilder的代碼比較長,它是用于構(gòu)建一個cookie字符串,Set-Cookie頭除了設置key=value,還可以設置過期日期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 "當前Cookie中的內(nèi)容" + value;
 }
}

也可以直接從Request的Header中獲取:

@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 "當前Cookie中的內(nèi)容" + cookie;
 }
}

使用Annotatin是直接標記Cookie的key來獲取value。而使用RequestEntity需要從頭中先獲取Cookie的內(nèi)容,然后再解析key和value,存在一個key對應多個value的情況需要使用RequestEntity。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI