Не удается настроить WebMvcConfigurer для добавления перехватчиков в приложении весенней загрузки 2 - PullRequest
0 голосов
/ 19 мая 2019

Я впервые пытаюсь создать перехватчик в моем приложении для весенней загрузки, но каким-то образом он не создается автоматически, как описано в руководствах.

Я пытался создать класс WebConfig, который расширяет класс WebMvcConfigurerAdapter и аннотирует его как @Component, но он не работает. Я также пытался создать WebConfig, который реализует интерфейс WebMvcConfigurer с аннотациями @Configuration и @EnableWebMvc, но он также не работал.

текущий класс WebConfig:

@Configuration
@EnableWebMvc
@ComponentScan("com.*")
public class WebConfig implements WebMvcConfigurer {


    public WebConfig() {
        super();
    }

    @Autowired
    HandlerInterceptor headerModifierInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        System.out.println("------------------hi");
        registry.addInterceptor(headerModifierInterceptor);
    }

}

Класс применения

@SpringBootApplication
@EnableWebSecurity
@ComponentScan(basePackages = {"com.*"})
@EntityScan("com")
public class CoreRestAPIApplication {

    public static void main(String[] args) {

        SpringApplication.run(CoreRestAPIApplication.class, args);

    }
}

Мой класс перехватчиков:

@Component
public class RestTemplateHeaderModifierInterceptor
        implements HandlerInterceptor {

    @Autowired
    AuthUtil authUtil;

    @Autowired
    JwtTokenProvider jwtTokenProvider;

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        String resolvedToken = jwtTokenProvider.resolveToken(request);
        if (!StringUtils.isEmpty(resolvedToken)) {
            String updatedToken = jwtTokenProvider.createToken(jwtTokenProvider.getUsername(resolvedToken), jwtTokenProvider.getAuthentication(resolvedToken).getAuthorities());
            response.addHeader(authUtil.AUTH_HEADER_NAME, updatedToken);
        }
    }
}

1 Ответ

0 голосов
/ 19 мая 2019

После некоторого поиска я обнаружил, что у меня есть зарегистрированная конфигурация WebMvcConfigurationSupport.Однако, если кто-то ищет и хочет изменить заголовки, используя перехватчик, НЕ используйте перехватчик для этого, так как для Spring это будет плохо обрабатываться, если вы возвращаете ResponseEntity или ваш метод контроллера возвращает @ResponseBody,Вместо этого (по крайней мере, для моего использования, которое фильтрует и обновляет токен каждый раз, когда поступает действительный запрос), используйте метод doFilterInternal, чтобы добавить заголовок к ответу (или добавить cookie, если хотите ..), вот пример того, какЯ сделал это:

public class JwtTokenFilter extends OncePerRequestFilter {

  private JwtTokenProvider jwtTokenProvider;

  public JwtTokenFilter(JwtTokenProvider jwtTokenProvider) {
    this.jwtTokenProvider = jwtTokenProvider;
  }

  @Override
  protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
    String token = jwtTokenProvider.resolveToken(httpServletRequest);
    try {
      if (token != null && jwtTokenProvider.validateToken(token)) {
        Authentication auth = jwtTokenProvider.getAuthentication(token);
        SecurityContextHolder.getContext().setAuthentication(auth);
        if(!jwtTokenProvider.isExpired(token)) {
          httpServletResponse.setHeader("authKey", jwtTokenProvider.createToken(jwtTokenProvider.getUsername(token), auth.getAuthorities()));
        }
      }
    } catch (ClientErrorException ex) {
      //this is very important, since it guarantees the models is not authenticated at all
      SecurityContextHolder.clearContext();
      httpServletResponse.sendError(ex.getStatus().value(), ex.getMessage());
      return;
    }

    filterChain.doFilter(httpServletRequest, httpServletResponse);
  }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...