Spring Boot 无法写出 Cookie
Spring Boot Java Cookie About 1,420 words问题描述
在使用了前后端分离、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
原因。
希望有大神能留言帮忙解惑,万分感谢。
参考
Views: 3,411 · Posted: 2020-04-21
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...