У меня несколько конечных точек отдыха. userId (заголовок http) является общим для всех конечных точек. Я хочу применить логику, скажем, установить значение по умолчанию, если оно не указано, или обрезать его, если оно указано в запросе, до того, как запрос войдет в метод (например, сердцебиение). Как добиться этого в Spring boot rest mvc.
@RestController
public class MyResource {
@RequestMapping(value = "/heartbeat", method= RequestMethod.GET)
public String heartbeat (@RequestHeader (value = "userId", required=false) String userId)
{
...
}
}
Один из вариантов, который я могу придумать для использования фильтров, то есть создать фильтр для проверки заголовка userId и обрезать его, если он присутствует, или предоставить ему значение по умолчанию, если его нет, и сохранить его в другом заголовке, скажем, customUserId. В вашем контроллере вы можете удобно использовать свои собственные заголовки, чтобы быть уверенным в том, что они будут действительны в соответствии с вашими требованиями. Вы можете обратиться к статье ниже для создания универсального bean-компонента.
Вы можете это попробовать?
@Configuration
@Slf4j
public class HttpHeaderModificationConfig implements Filter {
private static final String HEADER_DEMO_NAME = "name";
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
final HttpServletRequest req = (HttpServletRequest) request;
// modify HTTP Request Header
final HttpServletRequestWrapper reqWrapper = new HttpServletRequestWrapper(req) {
@Override
public String getHeader(String name) {
if (HEADER_DEMO_NAME.equals(name)) {
return "Changed";
}
return super.getHeader(name);
}
};
log.info("After Changed with Name {}", reqWrapper.getHeader(HEADER_DEMO_NAME));
chain.doFilter(reqWrapper, response);
}
}
Я бы добавил @Order (Ordered.HIGHEST_PRECEDENCE), если модификация должна быть до какой-либо логики
Вы можете использовать перехватчик