栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spinrg WebFlux中Cookie的读写的示例

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spinrg WebFlux中Cookie的读写的示例

WebFLux与WebMvc的差异

WebFlux读写cookie不像WebMvc那么直接,最主要的原因是WebMvc是基于Servlet规范的,而WebFlux仅仅遵守的是HTTP协议。所以在使用的时候会发现HttpServletRequest、HttpServletResponse这些Servlet层级的接口根本就无法使用。

cookie与Servlet并没有太直接的关系,前者是属于HTTP规范的而后者是一个J2EE的规范,在应用层面仅有的联系就是Servlet会读写cookie中的JSESSIONID来标记与前端浏览器和服务端的关系。而HttpServletRequest、HttpServletResponse仅是Servlet为请求和响应提供header、body管理的接口。

WebFlux的cookie管理

WebFlux目前并没有为写cookie提供任何工具。这就需要开发者按照HTTP的规范来写cookie。 在HTTP协议交互的过程中,服务端可以通过在response中添加Set-cookie头来让浏览器记录cookie,而浏览器则在request中使用cookie头来传递cookie。

写cookie

写cookie使用ResponseEntity向response头中添加Set-cookie即可。cookieBuilder的代码比较长,它是用于构建一个cookie字符串,Set-cookie头除了设置key=value,还可以设置过期日期expires,域名domain,路径path等。

@RestController
@RequestMapping("/cookie")
public class cookieReadAWriteController {
 @GetMapping("/write")
 public ResponseEntity 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("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来获取:

@RestController
@RequestMapping("/cookie")
public class cookieReadAWriteController {
 @GetMapping("/read/annotation")
 
 public String cookieReadAnnotation(@cookievalue("cookie-text") String value) {
 return "当前cookie中的内容" + value;
 }
}

也可以直接从Request的Header中获取:

@RestController
@RequestMapping("/cookie")
public class cookieReadAWriteController {
 @GetMapping("/read/annotation")
 
 @GetMapping("/read/entity")
 public String cookieReadEntity(RequestEntity entity) {
 HttpHeaders headers = entity.getHeaders();
 List cookie = headers.get("cookie");
 return "当前cookie中的内容" + cookie;
 }
}

使用Annotatin是直接标记cookie的key来获取value。而使用RequestEntity需要从头中先获取cookie的内容,然后再解析key和value,存在一个key对应多个value的情况需要使用RequestEntity。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/139271.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号