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等。


  1. @RestController
  2. @RequestMapping("/cookie")
  3. public class CookieReadAWriteController {
  4. @GetMapping("/write")
  5. public ResponseEntity<String> cookieWrite() {
  6. HttpHeaders headers = new HttpHeaders();
  7. String cookie = new CookieBuilder().setKey("cookie-text")
  8. .setValue(cookieText)
  9. .setMaxAge(840000)
  10. .setPath("/")
  11. .build();
  12. headers.add("Set-Cookie", cookie);
  13. return new ResponseEntity<String>("hi," + userName, headers, HttpStatus.OK);
  14. }
  15. }
  16. class CookieBuilder {
  17. private String key;
  18. private String value;
  19. private String expires;
  20. private String domain;
  21. private String path;
  22. public CookieBuilder setKey(String key) {
  23. this.key = key;
  24. return this;
  25. }
  26. public CookieBuilder setValue(String value) {
  27. this.value = value;
  28. return this;
  29. }
  30. public CookieBuilder setMaxAge(long ms) {
  31. //cookie的过期日期为GMT格式的时间。
  32. Date date = new Date(new Date().getTime() + ms);
  33. SimpleDateFormat sdf = new SimpleDateFormat("EEE d MMM yyyy HH:mm:ss 'GMT'", Locale.US);
  34. sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
  35. this.expires = sdf.format(date);
  36. return this;
  37. }
  38. public CookieBuilder setDomain(String domain) {
  39. this.domain = domain;
  40. return this;
  41. }
  42. public CookieBuilder setPath(String path) {
  43. this.path = path;
  44. return this;
  45. }
  46. public String build() {
  47. StringBuilder sb = new StringBuilder();
  48. sb.append(this.key);
  49. sb.append("=");
  50. sb.append(this.value);
  51. sb.append(";");
  52. if (null != this.expires) {
  53. sb.append("expires=");
  54. sb.append(this.expires);
  55. sb.append(";");
  56. }
  57. if (null != this.domain) {
  58. sb.append("domain=");
  59. sb.append(this.domain);
  60. sb.append(";");
  61. }
  62. if (null != this.path) {
  63. sb.append("path=");
  64. sb.append(this.path);
  65. sb.append(";");
  66. }
  67. return sb.toString();
  68. }
  69. }

读cookie

获取cookie就比较直观,可以直接使用@CookieValue这个Annotation来获取:


  1. @RestController
  2. @RequestMapping("/cookie")
  3. public class CookieReadAWriteController {
  4. @GetMapping("/read/annotation")
  5. /**
  6. * @param value
  7. * @return
  8. */
  9. public String cookieReadAnnotation(@CookieValue("cookie-text") String value) {
  10. return "当前Cookie中的内容" + value;
  11. }
  12. }

也可以直接从Request的Header中获取:


  1. @RestController
  2. @RequestMapping("/cookie")
  3. public class CookieReadAWriteController {
  4. @GetMapping("/read/annotation")
  5. /**
  6. * @param value
  7. * @return
  8. */
  9. @GetMapping("/read/entity")
  10. public String cookieReadEntity(RequestEntity<String> entity) {
  11. HttpHeaders headers = entity.getHeaders();
  12. List<String> cookie = headers.get("Cookie");
  13. return "当前Cookie中的内容" + cookie;
  14. }
  15. }

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

原文链接:https://my.oschina.net/chkui/blog/2993002

Spinrg WebFlux中Cookie的读写的更多相关文章

  1. 关于jsonp跨域过程中 cookie中的值一直为null的原因

    今天技术交流群里的小伙伴一直被一个问题而困扰,就是写入cookie里面的值 再次进行请求时 cookie 就为空了 他被问题纠结了一天  我也好奇了一天 终于在快下班的时候 他解决掉了 下面我来收一个 ...

  2. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  3. JavaScript中Cookie的用法

    Javascript中Cookie主要存储于客户端的计算机中,用于存放已访问的站点信息,Cookie最大约为4k.以下实例主要用于页面在刷新时保存数据,具体的用法如下所示: <html> ...

  4. Python中Cookie的处理(一)Cookie库

    Cookie用于服务器实现会话,用户登录及相关功能时进行状态管理.要在用户浏览器上安装cookie,HTTP服务器向HTTP响应添加类似以下内容的HTTP报头: Set-Cookie:session= ...

  5. 使用OKHttp模拟登陆知乎,兼谈OKHttp中Cookie的使用!

    本文主要是想和大家探讨技术,让大家学会Cookie的使用,切勿做违法之事! 很多Android初学者在刚开始学习的时候,或多或少都想自己搞个应用出来,把自己学的十八般武艺全都用在这个APP上,其实这个 ...

  6. php中cookie实现二级域名可访问操作的方法

    本文实例讲述了php中cookie实现二级域名可访问操作的方法.分享给大家供大家参考.具体方法如下: cookie在一些应用中很常用,假设我有一个多级域名要求可以同时访问主域名绑定的cookie,下面 ...

  7. Laravel5中Cookie的使用

    今天在Laravel框架中使用Cookie的时候,碰到了点问题,自己被迷糊折腾了半多小时.期间研究了Cookie的实现类,也在网站找了许多的资料,包括问答.发现并没有解决问题.网上的答案都是互相抄袭, ...

  8. C++中文件的读写

    C++中文件的读写 在C++中如何实现文件的读写? 一.ASCII 输出 为了使用下面的方法, 你必须包含头文件<fstream.h>(译者注:在标准C++中,已经使用<fstrea ...

  9. lr 中cookie的解释与用法

    Loadrunner 中 cookie 解释与用法loadrunner 中与 cookie 处理相关的常用函数如下: web_add_cookie(): 添加新的 cookie 或者修改已经存在的 c ...

随机推荐

  1. Hdu-1452-Happy 2004-费马小定理推除法逆元+同余定理+积性函数

    Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your ...

  2. 网络安全系列 之 MySQL数据库安全

    目录 数据库安全使用规则 1. 数据库版本及运行要求 2. 通用加固项 3. 用户权限 4. 连接设置 5. ssl安全认证 6. 涉及操作系统相关配置 6.1 系统资源 6.2 文件权限 数据库安全 ...

  3. springboot跨域访问

    写一个WebMvc配置类重写addCorsMappings即可 @Configuration public class MyMvcConfig implements WebMvcConfigurer ...

  4. flexbox属性速览及常见布局实现

    CSS3 弹性盒子(Flex Box)弹性盒子是即 CSS2 浮动布局后, CSS3 的一种新的布局模式. CSS3 弹性盒( Flexible Box 或 flexbox),是一种当页面需要适应不同 ...

  5. Linux使用crontab定时执行Python脚本清理日志

    Linux中,周期执行的任务一般由crond这个守护进程来处理.cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间.crond的配置文件称为"crontab", ...

  6. UBOOT的的 C 语言代码部分

    调用一系列的初始化函数 1. 指定初始函数表: init_fnc_t *init_sequence[] = { cpu_init,           /* cpu 的基本设置         */ ...

  7. apache反向代理和监听多个端口设置

    修改apache配置文件httpd.conf 一.监听多个端口 在Listen 80后添加监听端口,如 Listen 80 Listen 8080 Listen 8008 二.反向代理设置 1.取消一 ...

  8. QSerialPort类

    一.简介     QSerialPort类是Qt5封装的串口类,可以与串口进行通信.QSerialPortInfo是一个辅助类,提供串口的一些信息,如可用的串口名称,描述,制造商,序列号,串口16位产 ...

  9. 运行 composer update,提示 Allowed memory size of bytes exhausted

    composer update运行之后,提示 PHP Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to ...

  10. Vim操作 -- 多段复位粘贴

    Vim可以多段复制.粘贴.即,内容X复制到寄存器“1”,内容Y复制到寄存器“2”:粘贴时可以选择从“1”还是“2”粘贴. (1) Vim有13个粘贴板,分别是0.1.2.....9.a.“.+:用:r ...