Как изменить заголовки Http перед выполнением запроса в Spring boot mvc

У меня несколько конечных точек отдыха. 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) 
        {
           ...
        }
    }

Вы можете использовать перехватчик

Angelo Immediata 26.05.2018 17:50
3
1
13 223
2

Ответы 2

Один из вариантов, который я могу придумать для использования фильтров, то есть создать фильтр для проверки заголовка userId и обрезать его, если он присутствует, или предоставить ему значение по умолчанию, если его нет, и сохранить его в другом заголовке, скажем, customUserId. В вашем контроллере вы можете удобно использовать свои собственные заголовки, чтобы быть уверенным в том, что они будут действительны в соответствии с вашими требованиями. Вы можете обратиться к статье ниже для создания универсального bean-компонента.

https://www.baeldung.com/spring-boot-add-filter

Вы можете это попробовать?

@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), если модификация должна быть до какой-либо логики

vzhemevko 02.09.2020 12:03

Другие вопросы по теме