转载

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 协议。所以在使用的时候会发现 HttpServletRequestHttpServletResponse 这些 Servlet 层级的接口根本就无法使用。

CookieServlet 并没有太直接的关系,前者是属于 HTTP 规范的而后者是一个 J2EE 的规范,在应用层面仅有的联系就是 Servlet 会读写 Cookie 中的 JSESSIONID 来标记与前端浏览器和服务端的关系。而 HttpServletRequestHttpServletResponse 仅是 Servlet 为请求和响应提供 headerbody 管理的接口。

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 是直接标记 Cookiekey 来获取 value 。而使用 RequestEntity 需要从头中先获取 Cookie 的内容,然后再解析 keyvalue ,存在一个 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...