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<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。

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

(0)

相关推荐

  • Spinrg WebFlux中Cookie的读写的示例

    WebFLux与WebMvc的差异 WebFlux读写Cookie不像WebMvc那么直接,最主要的原因是WebMvc是基于Servlet规范的,而WebFlux仅仅遵守的是HTTP协议.所以在使用的时候会发现HttpServletRequest.HttpServletResponse这些Servlet层级的接口根本就无法使用. Cookie与Servlet并没有太直接的关系,前者是属于HTTP规范的而后者是一个J2EE的规范,在应用层面仅有的联系就是Servlet会读写Cookie中的JSES

  • js中的cookie的读写操作示例详解

    cookie是一小段信息,以键/值对的信息保存在计算机硬盘上的字符串, cookie存储容量大概在4kb,不同的浏览器厂家对cookie大小的限制有微微的差异:cookie主要的本质是"识别",通过识别来做一些事情;cookie 也是无法从你的硬盘取得任何其它数据,传送电脑病毒或者获取你的电子邮件地址.cookie是有有效期的,cookie的默认有效期是从cookie生成至浏览器关闭,也可以通过设置cookie的有效期来指定其失效日期:用户也可以禁止cookie也可以手动删除cooki

  • 详解Spring Boot中整合Sharding-JDBC读写分离示例

    在我<Spring Cloud微服务-全栈技术与案例解析>书中,第18章节分库分表解决方案里有对Sharding-JDBC的使用进行详细的讲解. 之前是通过XML方式来配置数据源,读写分离策略,分库分表策略等,之前有朋友也问过我,有没有Spring Boot的方式来配置,既然已经用Spring Boot还用XML来配置感觉有点不协调. 其实吧我个人觉得只要能用,方便看,看的懂就行了,mybatis的SQL不也是写在XML中嘛. 今天就给大家介绍下Spring Boot方式的使用,主要讲解读写分

  • JavaWeb 中Cookie实现记住密码的功能示例

    本文主要内容: •1.什么是Cookie •2.Cookie带来的好处 •3.Cookie的主要方法 一.什么是Cookie cookie是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段.Cookie的目的就是为用户带来方便,为网站带来增值.虽然有着许多误传,事实上Cookie并不会造成严重的安全威胁.Cookie永远不会以任何方式执行,因此也不会带来病毒或攻击你的系统.另外,由于浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为

  • 快速了解Python开发中的cookie及简单代码示例

    cookie :是用户保存在用户浏览器端的一对键值对,是为了解决http的无状态连接.服务端是可以把 cookie写到用户浏览器上,用户每次发请求会携带cookie. 存放位置: 每次发请求cookie是放在请求头里面的. 应用场景: ·登陆用户和密码的记住密码 ·显示每页显示的数据,以后都是按照设定的数目显示 ·投票机制 案例用户登录 创建用户登录的url url(r'^login/', views.login), 创建登录页面 代码为: <!DOCTYPE html> <html l

  • axios中cookie跨域及相关配置示例详解

    前言 最近在跨域.cookie 以及表单上传这几个方面遇到了点小问题,做个简单探究和总结.本文主要介绍了关于axios中cookie跨域及相关配置的相关内容,下面话不多说了,来一起看看详细的介绍吧. 1. 带cookie请求 - 画个重点 axios默认是发送请求的时候不会带上cookie的,需要通过设置withCredentials: true来解决. 这个时候需要注意需要后端配合设置: header信息 Access-Control-Allow-Credentials:true Access

  • Django中cookie的基本使用方法示例

    前言 基于 Internet的各种服务系统应运而生,建立商业站点或者功能比较完善的个人站点,常常需要记录访问者的一些信息:论坛作为 Internet发展的产物之一,在 Internet 中发挥着越来越重要的作用,是用户获取.交流.传递信息的主要场所之一,论坛常常也需要记录访问者的一些基本信息(如身份识别号码.密码.用户在 Web 站点购物的方式或用户访问该站点的次数).目前公认的是,通过 Cookie 和 Session 技术来实现记录访问者的一些基本信息. 下面就来一起看看Django中coo

  • JavaScript中cookie工具函数封装的示例代码

    一. 语法 1.1 获取当前页面的所有cookie: var allCookies = document.cookie; allCookies 是一个字符串,其中包含了以分号分隔的cookie列表字符串 (即 key=value 键值对). 1.2 写一个新cookie: document.cookie = updatedCookie; updatedCookie是一个键值对形式的字符串.只能用这个方法一次设置或更新一个cookie,而且写入并不是覆盖,而是添加.例如: document.coo

  • Yii2中cookie用法示例分析

    本文实例讲述了Yii2中cookie用法.分享给大家供大家参考,具体如下: <?php //设置方法 $cookie = new Cookie([ 'name' => 'cookie_monster', 'value' => 'Me want cookie!', 'expire' => time() + 86400 * 365, ]); \Yii::$app->getResponse()->getCookies()->add($cookie); //读取方法 $v

  • javascript 中Cookie读、写与删除操作

     javascript 中Cookie读.写与删除操作 前言: 在这个前端横行的时候,页面之间的交互需要数据的传递,有的数据通过url传参的形式可以很好地解决,但是对于部分需要改变的参数,你如说从页面A到页面B选择数据,然后从页面B将数据再传到页面A(典型的栗子就是收货地址的选择),针对这一块我是通过存储cookie来解决的. 对于cookie的操作我给出了一些简单的封装,当然也借鉴了前辈们经验,自己糅合了一下,对于cookie的操作,无非是读写和删除,我们首先来看一下写的操作,有写才有读,进而

随机推荐