java - 他怎么知道我的请求标头?
问题描述
所以我为自己找到了一个有趣的问题,我无法回答。在这里,我有一个带有处理 POST 请求的方法的控制器:
@CrossOrigin("*")
@PostMapping("/signout")
@ResponseBody
public ResponseEntity<AuthResponse> logout(@RequestHeader(value = AUTH) String token) {
HttpHeaders headers = new HttpHeaders();
if (loginningService.logout(token)) {
headers.remove(AUTH);
return new ResponseEntity<>(new AuthResponse("logged out"), headers, HttpStatus.CREATED);
}
return new ResponseEntity<>(new AuthResponse("Logout failed"), headers, HttpStatus.NOT_MODIFIED);
}
这里创建了 HttpHeader 实例,然后 loginningService 从 DB 中删除了令牌。然后从标头对象中删除标头“授权”。所以问题是,它如何从我的请求中获取标头?我不是从头开始实例化一个对象吗?
我假设它是自动完成的,但是我可以在哪里阅读它,所以将来我不会遇到这样的问题?
非常感谢!
解决方案
这里没有 Spring 魔法,只有糟糕的开发人员巫术。
由于HttpHeaders headers = new HttpHeaders();
创建了一个空标题,调用headers.remove(AUTH);
不会做任何事情,因为没有什么可以删除。
所以无论返回什么logout(token)
,这个方法都会返回空头。由于空标头没有 AUTH 标头,这看起来像是代码“删除”了 AUTH 标头,但这只是一个副作用。代码看起来像是在做某事,而意外的行为几乎就像它一样。
如果您logout()
失败,您会注意到也没有 AUTH 标头,即使它应该仅在成功注销时才被删除。
也许您想在方法中注入完整的标头?
public ResponseEntity<AuthResponse> logout(@RequestHeader HttpHeaders headers) {
推荐阅读
- java - LocalTime 的 @JsonFormat 模式
- scipy - 如何在 kivy buildozer 中包含 scipy 模块?
- rest - 通过 REST 为 GeoServer 配置密码加密
- css - 如何仅使用 HTML 和 CSS 使用 grid(fr) 划分网格的相等部分
- apache-spark - SPARK df.show() 函数算法
- snowflake-cloud-data-platform - 按列修剪雪花查询
- c++ - 获取指向模板化 lambda 运算符 () 的指针,无需捕获
- rstudio - R笔记本全屏模式
- javascript - HowTo Google 登录 - 理解、安全 - 如何处理数据
- c++ - 在 C++ 模板函数中接收相同类型的可变参数大小的原始数组