我正在使用Java / Jersy Framework(Tomcat)进行REST API开发。一种这样的Web服务的功能是将(HTTP 302)重定向到文件的S3签名URL。我们使用“授权”标头来检查请求的有效性。调用此Web服务时,该服务会生成一个带签名的签名URL并重定向到已签名的URL。
来自REST Web服务的Java代码(uri是签名网址)
return Response.status(HttpStatus.SCMOVEDTEMPORARILY).location(uri).build();
当重定向发生时,Authorization标头也会与签名一起传递。由于亚马逊接受签名URL中的授权或签名,但不是两者都从Amazon S3抛出如下错误。
只允许一种身份验证机制;只应指定X-Amz-Algorithm查询参数,签名查询字符串参数或授权标头
有没有办法在重定向发生时删除正在发送的标头...
我尝试添加一个过滤器,并使用自定义的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();
答案 0 :(得分:4)
基本上,重定向响应没有任何“授权”标头,“授权”标头只是请求的一部分。因此,这是任何HTTP客户端重新发送所有标头以重定向它们已发送到原始URL的位置的正常行为。你在这里无能为力。 但是,只有重定向位置位于同一域/源上时,大多数HTTP客户端才会重新发送“授权”标头。在您的情况下,您可以尝试为S3 URL创建一个单独的域并重定向到它,并希望客户端HTTP客户端在检测到域已更改时将丢弃“授权”标头(这是重新发送“授权”的安全问题“关注重定向到新域/来源时的标题。”