Spring Boot请求标头返回null值

gre*_*wan 9 java rest spring http spring-boot

我有一个spring boot项目,里面有一些Rest API.我有两个自定义标题命名request_datetenant分别.

我试图在拦截器中读取这些头的值,但它只读取值tenant并返回null request_date.

重要

  • 我使用过滤器来包装请求对象,因为我想稍后读取请求主体.
  • 有一个过滤器可以添加CORS标头.

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

但是,当我在生产中部署我的应用程序并使用postman或其他客户端发出请求时,request_date标头的值始终读为null.

我不确定这似乎是什么问题.我正在使用Spring boot v1.5.10.RELEASEJDK 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Kar*_*cki 7

某些网络工具可以删除其名称中包含下划线的标头.根据这个答案,下划线是一个合法的字符,但它并不常见,有时工具需要额外的配置来支持它.

将标题重命名为 requestDaterequest-date查看是否有帮助.如果它没有下划线而不检查客户端和服务器之间的网络路由,例如可能有一个代理丢弃它们?


gre*_*wan 5

问题出在nginx配置上。

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

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