【问题标题】:How does he knows about my request headers?他怎么知道我的请求标头?
【发布时间】:2020-11-17 10:00:32
【问题描述】:

所以我为自己找到了一个有趣的问题,我无法回答。这里我有一个控制器,它带有处理 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 中删除了令牌。然后从标头对象中删除标头“授权”。所以问题是,它如何从我的请求中获取标头?我不是从头开始实例化一个对象吗?

我假设它是自动完成的,但是我可以在哪里阅读它,所以将来我不会遇到这样的问题?

非常感谢!

【问题讨论】:

  • 只是想知道,curl 会为您的 POST 请求生成什么?
  • headers 对象是否包含Authorization 标头您删除它之前?请求 Authorization 标头不应自动复制到响应标头中。
  • 没有被删除。在新建的HttpHeaders 中没有要删除的标题。该代码是偶然起作用的,因为它无论如何都会返回空标题。糟糕的代码,没有什么“神奇”的事情发生。
  • 您周围是否还有任何请求/响应拦截器或网络过滤器?
  • @fluffy 他们将如何影响在空的headers 上调用headers.remove(AUTH);?在实例化一个局部变量和执行一个无用的操作之间,没有什么可以拦截发生的事情。

标签: java spring-boot http-headers http-post


【解决方案1】:

这里没有 Spring 魔法,只有糟糕的开发者巫术。

由于HttpHeaders headers = new HttpHeaders(); 创建了一个empty 标头,调用headers.remove(AUTH); 不会做任何事情,因为没有什么可以删除。

所以无论logout(token) 返回什么,这个方法都会返回空头。由于空标头没有 AUTH 标头,这看起来像是代码“删除”了 AUTH 标头,但这只是一个副作用。代码看起来像是在做某事,而意外的行为几乎就像它一样。

如果您使 logout() 失败,您会注意到也没有 AUTH 标头,即使它应该仅在成功注销时才被删除。

也许您想在方法中注入完整的标头?

public ResponseEntity<AuthResponse> logout(@RequestHeader HttpHeaders headers) {

【讨论】:

  • 我在 GitHub 中找到了这段代码,以了解如何将安全性应用于微服务和 Zuul。现在使用 @RequestHeader 访问 HttpHeaders。
猜你喜欢
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
相关资源
最近更新 更多