cors - 向 HTTP 请求添加更多标头时出错
问题描述
我正在为我的一个项目使用 Angular-8/Spring/AWS。
在从客户端进行 HTTP 调用时,之前我只需要发送Authorization
标头,它与服务器配合得很好。
最近,我的服务器希望我发送一些自定义标头(例如 x-request-time、x-correaltion-id 等)。我尝试在拦截器中将这些标头设置为我的请求,如下所示:
const headers = this.getRequestHeaders();
// cloning the request for updating the headers and url
const authReq = req.clone({ headers, url: fullReqUrl });
return next.handle(authReq).pipe(
map(res => res),
catchError(err => this.handlerError(err))
);
和
getRequestHeaders() {
return new HttpHeaders( {
'Authorization': this.awsService.getAccessToken(),
'x-request-time': 'new Date().toISOString()'
// I am setting few more headers, skipping them here for simplicity
});
}
但是,在这样做之后,我不断得到
Access-Control-Allow-Headers 在预检响应中不允许请求标头字段 x-request-time。
我试图研究这个错误并阅读了多篇文章。我想这个here详细解释了它。所以我需要使用设置更新我的服务器以允许 OPTION 方法并允许自定义标头。
我检查并发现我的服务器已经这样做了。这是服务器 CORS 过滤器的样子:
@Component
@Order(1)
public class CORSFilter implements Filter{
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", "*");
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) {}
@Override
public void destroy() {}
}
所以服务器允许所有的方法和所有的头文件(*)。我仍然不断收到以下错误。
解决此问题的正确方法是什么。我是否缺少客户端或服务器上的某些内容。请帮忙。
解决方案
该行chain.doFilter(req, res);
应更改为 chain.doFilter(req, response);
。因为您正在向铸造对象添加属性,但您没有使用它。
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", "*");
chain.doFilter(req, response);
}
推荐阅读
- javascript - 以编程方式提交重力表
- python - 从视频/图像中提取检测到的对象
- python - 如何通过 tkinter 在 Python 中检查多项选择(复选框)?
- python - 在python中循环并将数据写入csv文件
- c++ - 生产者消费者程序中的段错误
- sql-server - SQL Server:如何删除架构级联其所有对象?
- assembly - 汇编中的浮点异常 [NASM]
- flutter - 带有颤振块的滚动控制器
- ubuntu - 安装 Certbot XAMPP Ubuntu
- python - 在 vscode 中使用 python anaconda 作为我的解释器时无法安装格式化程序