我正在使用Java / Jersy Framework(Tomcat)进行REST API开发.一种此类Web服务的功能是将HTTP 302重定向(HTTP 302)到文件的S3签名URL.我们使用“授权”标头来检查请求的有效性.调用此Web服务时,该服务将生成带有签名的签名URL,并重定向到签名Url.
REST Web服务中的Java代码(uri是签名的URL)
return Response.status(HttpStatus.SCMOVEDTEMPORARILY).location(uri).build();
发生重定向时,还会将Authorization标头与签名一起传递.由于Amazon接受签名URL中的授权或签名,但不能两者都接受,因此它会从Amazon S3引发如下错误.
仅允许一种身份验证机制;仅应指定X-Amz-Algorithm查询参数,签名查询字符串参数或Authorization标头
有没有一种方法可以删除重定向发生时正在发送的标头…
我尝试添加一个过滤器,并使用自定义HttpServletResponseWrapper实现覆盖了ServletResponse,并在addHeader和setHeader方法中记录了标头名称.它永远不会为Authorization标头调用此方法.
将标头设置为nulll或“”的修改代码均无效.
return Response.status(HttpStatus.SCMOVEDTEMPORARILY).location(uri).header("Authorization",null).build();
return Response.status(HttpStatus.SCMOVEDTEMPORARILY).location(uri).header("Authorization","").build();
解决方法:
基本上,重定向响应没有任何“授权”标头,“授权”标头只是请求的一部分.因此,对于任何HTTP客户端来说,重新发送所有标头以将其已发送到原始URL的位置重定向都是正常的行为.在这里您无能为力.
但是,大多数HTTP客户端仅在重定向位置在同一域/源上时才重新发送“授权”标头.在您的情况下,您可以尝试为S3 URL创建一个单独的域并重定向到该域,并希望客户端HTTP客户端在检测到该域已更改时会删除“ Authorization”标头(这是重新发送“ Authorization”的安全问题重定向到新域/源之后,则为“标题”).