转载

Spinrg WebFlux中Cookie的读写 原 荐

随风溜达的向日葵 spring

正文

Spinrg WebFlux中Cookie的读写 原 荐

Spinrg WebFlux中Cookie的读写

原

荐

Spinrg WebFlux中Cookie的读写 原 荐
  随风溜达的向日葵 发布于 46分钟前

字数 705

阅读 7

收藏 0

年底了,该给自己写个总结了,一个六年女Java程序员的心声 >>> 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 。

© 著作权归作者所有

共有人打赏支持

上一篇: 非常重要 却被世人忽略的Java基础知识

下一篇: 概率与统计——条件概率、全概率、贝叶斯、似然函数、极大似然估计

Spinrg WebFlux中Cookie的读写 原 荐

随风溜达的向日葵

粉丝 276

博文 78

码字总数 167367

作品 0

广州

其他

提问

相关文章 最新文章

(6)Spring WebFlux性能测试——响应式Spring的道法术器

本系列文章索引《响应式Spring的道法术器》 前情提要 响应式流 | Reactor 3快速上手 | Spring WebFlux快速上手 本文源码 1.4 从负载测试看异步非阻塞的优势 前面总是“安利”异步非阻塞的好处...

享学IT

06/26

0

0

Spinrg WebFlux中Cookie的读写 原 荐
Spring Boot 2.0 WebFlux 上手系列课程:快速入门(一)

02:WebFlux 快速入门实践 ## Spring Boot 2.0 spring.io 官网有句醒目的话是: BUILD ANYTHING WITH SPRING BOOT Spring Boot (Boot 顾名思义,是引导的意思)框架是用于简化 Spring 应用从...

泥沙砖瓦浆木匠

04/15

0

0

SpringBoot2使用WebFlux函数式编程

本文只是简单使用SpringBoot2使用WebFlux的函数式编程简单使用,后续会继续写关于Webflux相关的文章。 最近一直在研究WebFlux,后续会陆续出一些相关的文章。 首先看一下Srping官网上的一张图...

dalaoyang

08/02

0

0

Spinrg WebFlux中Cookie的读写 原 荐
Spring 5 WebFlux

作者: 一字马胡 转载标志 【2017-11-26】 更新日志 日期 更新内容 备注 2017-11-26 新建文章 Spring 5 WebFlux demo Reactor Spring 5的一大亮点是对响应式编程的支持,下面的图片展示了传统...

一字马胡

2017/11/26

0

0

Spinrg WebFlux中Cookie的读写 原 荐
Spring Boot 2 Webflux的全局异常处理

本文首先将会回顾Spring 5之前的SpringMVC异常处理机制,然后主要讲解Spring Boot 2 Webflux的全局异常处理机制。 SpringMVC的异常处理 Spring 统一异常处理有 3 种方式,分别为: 使用 注解...

aoho

12/20

0

0

Spinrg WebFlux中Cookie的读写 原 荐

没有更多内容

加载失败,请刷新页面

加载更多
解决spring boot返回数据Long精度丢失的问题

参考地址: https://orchidflower.oschina.io/2018/06/22/Handling-Bigint-using-Jackson-in-Springboot/...

happyeveryday32

16分钟前

2

0

php 当前持续时间

$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

Spinrg WebFlux中Cookie的读写 原 荐
百度,阿里,腾讯等互联网公司,Java开发的最新招聘标准

金九银十的跳槽热潮已经过去了,在这两个月的跳槽的旺季中,作为互联网行业的三大巨头,百度、阿里巴巴、腾讯对于互联网人才有很大的吸引力,他们的员工也是众多互联网同行觊觎的资深工程师、...

Java填坑路

21分钟前

3

0

Spinrg WebFlux中Cookie的读写 原 荐
布隆过滤

前言 布隆过滤在代码开发中有巨大的使用场景,经典的面试题在一亿个数字中查找是否存在某个值,同时要求内存使用尽量少,基本都是围绕bitmap和布隆过滤来的。 业务开发中的布隆过滤使用的场景...

春哥大魔王的博客

27分钟前

2

0

Spinrg WebFlux中Cookie的读写 原 荐

没有更多内容

加载失败,请刷新页面

加载更多
原文  https://my.oschina.net/chkui/blog/2993002
正文到此结束
Loading...