正文
Spinrg WebFlux中Cookie的读写
原
荐
字数 705
阅读 7
收藏 0
年底了,该给自己写个总结了,一个六年女Java程序员的心声 >>>
WebFlux 读写 Cookie 不像 WebMvc 那么直接,最主要的原因是 WebMvc 是基于 Servlet 规范的,而 WebFlux 仅仅遵守的是 HTTP 协议。所以在使用的时候会发现 HttpServletRequest
、 HttpServletResponse
这些 Servlet 层级的接口根本就无法使用。
Cookie 与 Servlet 并没有太直接的关系,前者是属于 HTTP 规范的而后者是一个 J2EE 的规范,在应用层面仅有的联系就是 Servlet 会读写 Cookie 中的 JSESSIONID 来标记与前端浏览器和服务端的关系。而 HttpServletRequest
、 HttpServletResponse
仅是 Servlet 为请求和响应提供 header 、 body 管理的接口。
WebFlux 目前并没有为写 Cookie 提供任何工具。这就需要开发者按照 HTTP 的规范来写 Cookie 。 在HTTP协议交互的过程中,服务端可以通过在 response 中添加 Set-Cookie 头来让浏览器记录 Cookie ,而浏览器则在 request 中使用 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 就比较直观,可以直接使用 @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 。
© 著作权归作者所有
共有人打赏支持
上一篇: 非常重要 却被世人忽略的Java基础知识
下一篇: 概率与统计——条件概率、全概率、贝叶斯、似然函数、极大似然估计
粉丝 276
博文 78
码字总数 167367
作品 0
广州
其他
提问相关文章 最新文章
本系列文章索引《响应式Spring的道法术器》 前情提要 响应式流 | Reactor 3快速上手 | Spring WebFlux快速上手 本文源码 1.4 从负载测试看异步非阻塞的优势 前面总是“安利”异步非阻塞的好处...
享学IT
06/26
0
0
02:WebFlux 快速入门实践 ## Spring Boot 2.0 spring.io 官网有句醒目的话是: BUILD ANYTHING WITH SPRING BOOT Spring Boot (Boot 顾名思义,是引导的意思)框架是用于简化 Spring 应用从...
泥沙砖瓦浆木匠
04/15
0
0
本文只是简单使用SpringBoot2使用WebFlux的函数式编程简单使用,后续会继续写关于Webflux相关的文章。 最近一直在研究WebFlux,后续会陆续出一些相关的文章。 首先看一下Srping官网上的一张图...
dalaoyang
08/02
0
0
作者: 一字马胡 转载标志 【2017-11-26】 更新日志 日期 更新内容 备注 2017-11-26 新建文章 Spring 5 WebFlux demo Reactor Spring 5的一大亮点是对响应式编程的支持,下面的图片展示了传统...
一字马胡
2017/11/26
0
0
本文首先将会回顾Spring 5之前的SpringMVC异常处理机制,然后主要讲解Spring Boot 2 Webflux的全局异常处理机制。 SpringMVC的异常处理 Spring 统一异常处理有 3 种方式,分别为: 使用 注解...
aoho
12/20
0
0
没有更多内容
加载失败,请刷新页面
加载更多参考地址: https://orchidflower.oschina.io/2018/06/22/Handling-Bigint-using-Jackson-in-Springboot/...
happyeveryday32
16分钟前
2
0
$a = '1545721000';$time = time() - $a;echo '天:' . intval($time / 86400) . '<br>';echo '时:' . intval(($time % 86400) / 3600) . '<br>';echo '分:' . intval(($time......
小丶二
17分钟前
2
0
近日,阿里云监控发现,匿名者(Anonymous)组织成员正在发起针对全球中央银行网站的攻击行动,截止目前,国内有超过2家以上的重要网站被攻击,攻击特征主要为DDoS攻击和CC攻击。 此次事件中...
阿里云云栖社区
20分钟前
1
0
金九银十的跳槽热潮已经过去了,在这两个月的跳槽的旺季中,作为互联网行业的三大巨头,百度、阿里巴巴、腾讯对于互联网人才有很大的吸引力,他们的员工也是众多互联网同行觊觎的资深工程师、...
Java填坑路
21分钟前
3
0
前言 布隆过滤在代码开发中有巨大的使用场景,经典的面试题在一亿个数字中查找是否存在某个值,同时要求内存使用尽量少,基本都是围绕bitmap和布隆过滤来的。 业务开发中的布隆过滤使用的场景...
春哥大魔王的博客
27分钟前
2
0
没有更多内容
加载失败,请刷新页面
加载更多