繁体   English   中英

Spring Boot请求标头返回null值

[英]Spring Boot request header return null value

我有一个spring boot项目,里面有一些Rest API。 我有两个名为request_datetenant自定义标头。

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

重要

  • 我使用过滤器来包装请求对象,因为我想稍后读取请求主体。
  • 有一个过滤器可以添加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);
    }
}

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

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

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

问题在于nginx配置。

我设置了underscores_in_headers on; 对于服务器,现在它不会删除名称中带下划线的标题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM