Spring Boot请求标头返回空值

时间:2019-02-28 10:35:52

标签: java spring rest spring-boot http

我有一个Spring Boot项目,其中包含一些Rest API。我有两个分别名为 request_date tenant 的自定义标头。

我正在尝试在拦截器中读取这些标头的值,但它仅读取 tenant 的值,并为 request_date返回null。 strong>。

重要

  • 我使用过滤器包装请求对象,因为我想稍后再读取请求正文。
  • 有一个用于添加CORS标头的过滤器。

当我在localhost上运行项目并调试代码时,我能够成功读取两个标头的值。

但是,当我将应用程序部署到生产环境中并使用邮递员或其他客户端发出请求时, request_date 标头的值始终读为null。

我不确定这似乎是什么问题。我正在使用 Spring boot v1.5.10.RELEASE JDK 1.8

注意:

  • 我尝试将标头重命名为 input_date 。但是,它仍为null。

以下是相关代码

TestInterceptor

public class TestInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String requestDate = request.getHeader("request_date");
        String tenant = request.getHeader("Tenant");

        /*Perform some checks*/

        return super.preHandle(request, response, handler);
    }
}

CorsFilter

public class ApiCorsFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, OPTIONS, DELETE, PUT");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers," +
                " X-Requested-With, Origin, X-Auth-Token, Tenant, request_date");
        response.addHeader("Access-Control-Expose-Headers", "X-Auth-Token, Content-Disposition");
        chain.doFilter(request, response);
    }
}

RequestCacheFilter

public class RequestCacheFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
                                    FilterChain filterChain) throws ServletException, IOException {

        HttpServletRequest req = new RequestWrapper(request);
        String body = ((RequestWrapper) req).getBody();

        /*Do some operation*/

        filterChain.doFilter(req, response);
    }
}

2 个答案:

答案 0 :(得分:6)

某些网络工具可以删除名称中包含下划线的标头。根据{{​​3}},下划线是合法字符,但并不常见,有时工具需要进行其他配置才能支持它。

将标题重命名为requestDaterequest-date,看看是否有帮助。如果没有底线就可以检查客户端和服务器之间的网络路由,例如也许有代理将其丢弃?

答案 1 :(得分:4)

问题出在nginx配置上。

我为服务器设置了 underscores_in_headers on; ,现在它不会删除标有下划线的标头。

@Karol Dowbecki建议的解决方案也有效。当我将标题重命名为 requestDate 时,我能够成功读取该值。