Spring Boot请求头返回null值

11

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

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

重要

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

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

然而,当我在生产环境中部署应用程序并使用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);
    }
}

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);
    }
}
请求缓存过滤器
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);
    }
}

如果您调用 request.getHeaderNames(),那么缺失的标头中是否可能设置为 null? - StanislavL
我没有调用request.getHeaderNames(),但我可以读取其他标头的值。问题只出现在“request_date”标头上。 - greenPadawan
2个回答

7
一些网络工具可能会删除包含下划线的标头。根据这个答案,下划线是一个合法字符,但它不常见,有时需要额外配置才能支持它。
请将您的标题重命名为requestDaterequest-date,看看是否有帮助。如果没有下划线就可以正常工作,则检查客户端和服务器之间的网络路径,例如可能有代理程序会删除它们。

7
问题出在nginx配置上。
我为服务器设置了underscores_in_headers on;,现在它不会删除名称中带下划线的标头。
@Karol Dowbecki建议的解决方案也有效。当我将我的标头重命名为requestDate时,我成功读取了值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接