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。

原文链接:https://my.oschina.net/chkui/blog/2993002

Spinrg WebFlux中Cookie的读写的更多相关文章

  1. 关于jsonp跨域过程中 cookie中的值一直为null的原因

    今天技术交流群里的小伙伴一直被一个问题而困扰,就是写入cookie里面的值 再次进行请求时 cookie 就为空了 他被问题纠结了一天  我也好奇了一天 终于在快下班的时候 他解决掉了 下面我来收一个 ...

  2. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  3. JavaScript中Cookie的用法

    Javascript中Cookie主要存储于客户端的计算机中,用于存放已访问的站点信息,Cookie最大约为4k.以下实例主要用于页面在刷新时保存数据,具体的用法如下所示: <html> ...

  4. Python中Cookie的处理(一)Cookie库

    Cookie用于服务器实现会话,用户登录及相关功能时进行状态管理.要在用户浏览器上安装cookie,HTTP服务器向HTTP响应添加类似以下内容的HTTP报头: Set-Cookie:session= ...

  5. 使用OKHttp模拟登陆知乎,兼谈OKHttp中Cookie的使用!

    本文主要是想和大家探讨技术,让大家学会Cookie的使用,切勿做违法之事! 很多Android初学者在刚开始学习的时候,或多或少都想自己搞个应用出来,把自己学的十八般武艺全都用在这个APP上,其实这个 ...

  6. php中cookie实现二级域名可访问操作的方法

    本文实例讲述了php中cookie实现二级域名可访问操作的方法.分享给大家供大家参考.具体方法如下: cookie在一些应用中很常用,假设我有一个多级域名要求可以同时访问主域名绑定的cookie,下面 ...

  7. Laravel5中Cookie的使用

    今天在Laravel框架中使用Cookie的时候,碰到了点问题,自己被迷糊折腾了半多小时.期间研究了Cookie的实现类,也在网站找了许多的资料,包括问答.发现并没有解决问题.网上的答案都是互相抄袭, ...

  8. C++中文件的读写

    C++中文件的读写 在C++中如何实现文件的读写? 一.ASCII 输出 为了使用下面的方法, 你必须包含头文件<fstream.h>(译者注:在标准C++中,已经使用<fstrea ...

  9. lr 中cookie的解释与用法

    Loadrunner 中 cookie 解释与用法loadrunner 中与 cookie 处理相关的常用函数如下: web_add_cookie(): 添加新的 cookie 或者修改已经存在的 c ...

随机推荐

  1. Celery - 异步任务 , 定时任务 , 周期任务

    1.什么是Celery?Celery 是芹菜Celery 是基于Python实现的模块, 用于执行异步定时周期任务的其结构的组成是由    1.用户任务 app    2.管道 broker 用于存储 ...

  2. 第十五篇:java操作oracle踩坑之旅

    最近刚做完mysql的各种需求,项目要满足oracle数据库,于是走上了漫漫的踩坑之路,同行可以看看以免踩坑……第一条:oracle建表的时候不需要在建表sql语句后指定默认字符集 DEFAULT C ...

  3. <每日一题>题目1:简单的注册和登录1.0

    #版本1.0,最基本的注册登录'''1.注册,将账号和密码分别写在不同的文档里面2.登录,分别从账户文档和密码文档进行读取并登录''' #注册 Identity = input("请输入您想 ...

  4. Linux-c 线程锁

      typedef struct _my_mutex { pthread_mutex_t mutex; //互斥锁 pthread_mutexattr_t mta; //互斥锁属性 } my_mute ...

  5. JSP四个域对象的应用场景

    request 如果客户向服务器发请求,产生的数据,用户看完就没用了,像这样的数据就存在request域 比如新闻数据,属于用户看完就没用的 session 如果客户向服务器发请求,产生的数据,用户用 ...

  6. 深入理解Java虚拟机(程序编译与代码优化)

    文章首发于微信公众号:BaronTalk,欢迎关注! 对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就 ...

  7. leetcode-80-删除排序数组中的重复项②

    题目描述: 第一次提交: class Solution: def removeDuplicates(self, nums: List[int]) -> int: nums.reverse() f ...

  8. ST(RMQ)算法(在线)求LCA

    在此之前,我写过另一篇博客,是倍增(在线)求LCA.有兴趣的同学可以去看一看.概念以及各种暴力就不在这里说了,那篇博客已经有介绍了. 不会ST算法的同学点这里 ST(RMQ)算法在线求LCA 这个算法 ...

  9. 「题解」:07.18NOIP模拟赛T1:星际旅行

    问题 A: 星际旅行 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 考试心路历程 拿到这道题感觉很懵逼,所以先搞的T2和T3,最后码了个暴力,结果还不如直接输出‘0’得分高 ...

  10. 模拟+贪心——cf1131E

    超级恶心的题,写了好久,直接倒序模拟做,但是网上有博客好像是直接正序dp做的.. 因为左端点和右端点是永远不会变的,然后情况要考虑全 /* 从后往前插 只要记录左连续,右连续,中间连续 左端点一定是L ...