Spinrg WebFlux中Cookie的读写
原
荐
字数 705
阅读 7
收藏 0
年底了,该给自己写个总结了,一个六年女 Java 程序员的心声 >>>
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 。
© 著作权归作者所有
共有人打赏支持
上一篇: 非常重要 却被世人忽略的Java基础知识
相关文章 最新文章
本系列文章索引《响应式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
没有更多内容
加载失败,请刷新页面
加载更多以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 想用数据库“读写分离” 请先明白“读写分离”解决什么问题
- Java 读写锁浅析
- Golang文件读写
- ReentrantReadWriteLock 读写锁解析
- 用Python读写文件
- MySQL -- 读写分离
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Persuasive Technology
B.J. Fogg / Morgan Kaufmann / 2002-12 / USD 39.95
Can computers change what you think and do? Can they motivate you to stop smoking, persuade you to buy insurance, or convince you to join the Army? "Yes, they can," says Dr. B.J. Fogg, directo......一起来看看 《Persuasive Technology》 这本书的介绍吧!