向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
      });
   }

但是,这样做之后,我不断得到

  

请求标头字段x-request-time不允许   飞行前响应中的access-Control-Allow-Header。

我尝试研究该错误并阅读了多个帖子。我猜这个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() {}

}

因此服务器允许所有方法和所有标头(*)。仍然出现以下错误。

解决此问题的正确方法是什么。我在客户端或服务器上缺少什么吗?请帮忙。

yxsyg 回答:向HTTP请求添加更多标头时出错

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);
}
本文链接:https://www.f2er.com/2943874.html

大家都在问