Tengo un proyecto de arranque resorte que tiene algunas API de descanso en él. Tengo dos cabeceras personalizadas nombrados request_date
y tenant
, respectivamente.
Estoy tratando de leer el valor de estas cabeceras en un interceptor, pero lee el valor por sólo tenant
y vuelve nulo para request_date
.
Importante
- Yo uso un filtro para envolver el objeto de la petición porque quiero leer el cuerpo de la petición más tarde.
- Hay un filtro para agregar encabezados CORS.
Cuando ejecuto mi proyecto en el servidor local y depurar el código, soy capaz de leer correctamente los valores tanto de los encabezados.
Sin embargo, cuando despliego mi aplicación en la producción y hacer la solicitud utilizando cartero o algún otro cliente, el request_date
valor de cabecera siempre se lee como nulo.
No estoy seguro de lo que parece ser el problema con esto. Estoy utilizando Spring boot v1.5.10.RELEASE
yJDK 1.8
Nota:
- He tratado de cambiar el nombre de la cabecera para algo así
input_date
. Sin embargo, todavía se puede leer nula.
El siguiente es el código en cuestión
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);
}
}
El problema fue con la configuración nginx.
He establecido la underscores_in_headers on;
para el servidor y ahora no baja las cabeceras con subrayado en sus nombres.
La solución sugerida por @Karol Dowbecki funciona tan bien. Cuando Retitulé mi cabecera a requestDate
, yo era capaz de leer el valor éxito.