我有一个Spring Boot项目,其中包含一些Rest API。我有两个分别名为 request_date
和 tenant
的自定义标头。
我正在尝试在拦截器中读取这些标头的值,但它仅读取 tenant
的值,并为 request_date
返回null。 strong>。
重要
当我在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);
}
}
答案 0 :(得分:6)
某些网络工具可以删除名称中包含下划线的标头。根据{{3}},下划线是合法字符,但并不常见,有时工具需要进行其他配置才能支持它。
将标题重命名为requestDate
或request-date
,看看是否有帮助。如果没有底线就可以检查客户端和服务器之间的网络路由,例如也许有代理将其丢弃?
答案 1 :(得分:4)
问题出在nginx配置上。
我为服务器设置了 underscores_in_headers on;
,现在它不会删除标有下划线的标头。
@Karol Dowbecki建议的解决方案也有效。当我将标题重命名为 requestDate
时,我能够成功读取该值。