博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spinrg WebFlux中Cookie的读写
阅读量:6339 次
发布时间:2019-06-22

本文共 3240 字,大约阅读时间需要 10 分钟。

  hot3.png

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
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
("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
entity) { HttpHeaders headers = entity.getHeaders(); List
cookie = headers.get("Cookie"); return "当前Cookie中的内容" + cookie; }}

使用Annotatin是直接标记Cookiekey来获取value。而使用RequestEntity需要从头中先获取Cookie的内容,然后再解析keyvalue,存在一个key对应多个value的情况需要使用RequestEntity

转载于:https://my.oschina.net/chkui/blog/2993002

你可能感兴趣的文章
pca
查看>>
php实战案例
查看>>
Python爬虫6-利用ProxyHandler设置代理服务器
查看>>
hive连接MySQL报错
查看>>
SQL Server 数据库用户权限设置
查看>>
爱的链条
查看>>
AC日记——网络最大流 洛谷 P3376
查看>>
城堡 (spfa+cheng)
查看>>
使用Dialog实现全局Loading加载框
查看>>
软件测试职业规划的思考(转)(作者Findyou
查看>>
微信小程序---picker
查看>>
用户体验(《构建之法》读书笔记4)
查看>>
python系统编程(七)
查看>>
hdu 5909 Tree Cutting
查看>>
写给妹妹的信
查看>>
Log4j(3)--rootLogger根配置和appender输出类型配置
查看>>
Fiddler使用总结(二)
查看>>
(进阶篇)浅谈COOKIE和SESSION关系和区别
查看>>
Tip:SCO 2012 R2控制台注意事项
查看>>
【VMCloud云平台】拥抱Docker(五)Volume(2)
查看>>