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。
原文链接:https://my.oschina.net/chkui/blog/2993002
最新文章
- 用html5的canvas和JavaScript创建一个绘图程序
- 微信接口-获取用户openid基本信息
- MySQL Workbench “Error Code: 1175” 的解决方法
- NHibernate系列文章二十五:NHibernate查询之Query Over查询(附程序下载)
- git/ssh捋不清的几个问题
- 30年的Hello world
- 《A First Course in Probability》-chaper3-条件概率和独立性-P(&#183;|F)是概率
- 见过的最好的Layout讲解,挺全的
- nodejs partials 分布视图
- Oracle SQL语句执行过程
- Linux第三节
- C# GUID介绍和的使用
- 五、Redis持久化配置
- 【POJ1015】Jury compromise 多个费用的背包
- Caffe源码阅读(1) 全连接层
- Web Services and C# Enums
- 【Java并发编程】5、java中ConcurrentLinkedQueue类
- android 随手记 摄像头录像
- OpenStack IceHouse 部署 - 2 - 网络与软件环境初始化
- T-SQL查询:WITH AS 递归计算某部门的所有上级机构或下级机构
热门文章
- POJ-2752-Seek the Name-kmp的变形
- MySQL初始化(35-03)
- <;爬虫>;黑板爬虫闯关02
- JS规则 我或你都可以 (逻辑或操作符)||逻辑或操作符,相当于生活中的“或者”,当两个条件中有任一个条件满足,“逻辑或”的运算结果就为“真”
- sqllocaldb
- 廖雪峰Java14Java操作XML和JSON-1XML-1XML介绍
- 高速网络下的http协议优化
- day09 samba、nginx服务配置
- day08 网络设置、软件包管理
- 使用vue-awesome-swiper滑块插件