Spring Boot 无法写出 Cookie
Spring Boot Java Cookie 大约 1420 字问题描述
在使用了前后端分离、Spring Security
和Spring Session
的Spring Boot
后端项目(Undertow
作为web
容器)后,当返回的body
包含了中文
且大于15KB
时(不确定是否是这个原因),返回的response header
里没有Set-Cookie
字段,导致前端无法保存SESSION
。
发现问题
在Spring Security
的onAuthenticationSuccess
认证成功后,HttpServletResponse
写出用户信息时使用了PrintWriter
的write(String content)
方法,部分代码如下。
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
PrintWriter printWriter = response.getWriter();
printWriter.write(objectMapper.writeValueAsString(result));
printWriter.flush();
printWriter.close();
}
解决方法
将PrintWriter
的write(String content)
方法替换为response.getOutputStream()
的write(byte[] b)
方法即可。
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
response.getOutputStream().write(objectMapper.writeValueAsBytes(result));
}
具体原因
具体原因目前还没有来得及细追,考虑是Content-Length
计算字符时的问题,因为两个write
方法一个是字节数组,一个是字符串,可能在转换过程中有编码问题。并且使用的web
容器是Undertow
而非Tomcat
,也不确定是Spring Session
还是Undertow
原因。
希望有大神能留言帮忙解惑,万分感谢。
参考
阅读 2999 · 发布于 2020-04-21
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb扫描下方二维码关注公众号和小程序↓↓↓
昵称:
随便看看
换一批
-
GoJS 浏览器窗口缩放后自动居中对齐阅读 2280
-
Maven import scope 解析阅读 669
-
Prometheus+Grafana+redis_exporter 监控 Redis 服务阅读 1359
-
OpenResty get_body_data 无法获取请求体数据阅读 3229
-
MySQL 规约阅读 4242
-
Java 并发编程之 AtomicInteger AtomicLong阅读 1502
-
MySQL 使用的是 BTree 还是 B+Tree阅读 2933
-
Vue mavonEditor 获取 HTML 代码阅读 2292
-
CSS var 函数阅读 1577
-
PostgreSQL distinct on 用法阅读 421