当前位置: 首页 > 编程笔记 >

Spinrg WebFlux中Cookie的读写的示例

李浩邈
2023-03-14
本文向大家介绍Spinrg WebFlux中Cookie的读写的示例,包括了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头中html" target="_blank">添加Set-Cookie即可。CookieBuilder的代码比较长,它是用于构建一个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来获取:

@RestController
@RequestMapping("/cookie")
public class CookieReadAWriteController {
 @GetMapping("/read/annotation")
 /**
 * @param value
 * @return
 */
 public String cookieReadAnnotation(@CookieValue("cookie-text") String value) {
 return "当前Cookie中的内容" + 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中的内容" + cookie;
 }
}

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 在一些Web应用程序中需要在客户端保存一些信息,如用户名等,以使在下次访问同一个Web程序时可以根据这些信息为用户提供方便,或作为其他的用途。这些信息是由一个key-value对组成。每一对这样的信息被称为一个Cookie。如有一些登录程序在下一次访问时,会自动将用户名显示在用户名文本框中,这就是通过Cookie实现的。 下面的例子演示了如何在Servlet中读、写Cookie信息。 例子 : 读

  • 页面域名为abc.cn,嵌入iframe域名为qwe.com。 嵌入的iframe如何读写自己域名(.qwe.com)下的cookie呢? 使用document.cookie 嵌入时打印出来是空的,不嵌入时读取正常。

  • 本文向大家介绍JavaScript实现cookie的写入、读取、删除功能,包括了JavaScript实现cookie的写入、读取、删除功能的使用技巧和注意事项,需要的朋友参考一下 在没介绍正文之前,先给大家介绍Cookie的基础知识 首先了解什么是cookie   “cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 Ja

  • 本文向大家介绍iOS读写json文件的方法示例,包括了iOS读写json文件的方法示例的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要给大家介绍了关于iOS读写json文件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 一.获取沙盒路径 每个iOS应用都有自己专属的应用沙盒,应用沙盒就是文件系统中的目录。但是iOS系统会将每个应用的沙盒目录与文件系统的其他部分隔

  • 本文向大家介绍Java用GDAL读写shapefile的方法示例,包括了Java用GDAL读写shapefile的方法示例的使用技巧和注意事项,需要的朋友参考一下 GDAL介绍 GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处

  • 本文向大家介绍用js读、写、删除Cookie代码续篇,包括了用js读、写、删除Cookie代码续篇的使用技巧和注意事项,需要的朋友参考一下 上次的一篇文章:用js读、写、删除Cookie代码分享及详细注释说明,在实践中发现了一些问题: 1.cookie在本地文件上只能在火狐上调试,IE和chrome无效 2.cookie没有设置为永不过期,只考虑了设置一个时间段就过期,显然不太合理。 这次给出的是