【问题标题】:Custom header param - Spring Boot自定义标头参数 - Spring Boot
【发布时间】:2020-11-06 18:16:10
【问题描述】:

我在尝试将自定义标头参数从我的前端发送到控制器时遇到问题。

我已经设置了端点来获取头部参数:

public ResponseEntity<DashboardBean> atualizarDadosDashboard(@RequestHeader(name = "idEmpresa") Long idEmpresa){

但是当我尝试使用这个端点时,我得到了失败的响应并且应用程序没有记录任何错误。

这里有显示失败请求的浏览器控制台:

第二个仪表板请求是 OPTIONS 类型。第一个是 GET 请求。

在这里您可以看到带有自定义标头“idEmpresa”的失败请求标头:

我在前端使用 Angular。如下所示,我将标头添加到请求中:

....

protected httpOptions = {
    headers: new HttpHeaders({
        'Content-Type': 'application/json',
        'Authorization': this.token,
        'idEmpresa': String(this.idEmpresa)
    })
};

atualizarDashboard(): Observable<DashboardModel> {
    return this.httpClient.get<DashboardModel>(this.baseUrl, this.httpOptions);
}

....

在我的 Spring Boot 应用程序中,日志中没有关于此请求的任何内容!!

【问题讨论】:

  • 如果标头作为字符串或数字传递,则检查前端代码?这可能是问题
  • 谢谢@PandeyAmit !!问题出在我的 CORS 过滤器上。我已经在下面发布了答案
  • 根据要求,我添加了有关该问题的更多信息

标签: java angular spring-boot filter cors


【解决方案1】:

问题解决了。

我的应用程序中有一个 CORS 过滤器。我必须将自定义标头参数添加到

访问控制允许标头

列表以允许它。之后,端点被消耗并按预期工作。

这就是我的过滤器现在的样子:

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class SimpleCORSFilter implements Filter {

    private final Log logger = LogFactory.getLog(this.getClass());

    @Override
    public void init(FilterConfig fc) throws ServletException {
        logger.info("SimpleCORSFilter loaded");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) resp;
        HttpServletRequest request = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", 
                "x-requested-with, authorization, Content-Type, " +
                "Authorization, credential, X-XSRF-TOKEN, idEmpresa");

        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, resp);
        }

    }

    @Override
    public void destroy() {
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2012-04-23
    相关资源
    最近更新 更多