无法在Spring Boot 2应用程序中为添加拦截器配置WebMvcConfigurer

塔尔·阿罗尼(Tal Aloni)

我试图在我的spring boot应用程序中第一次创建一个拦截器,但是由于教程中的描述,它以某种方式不会自动创建。

我试图创建一个WebConfig类,该类扩展了WebMvcConfigurerAdapter类并将其注释为@Component,但没有用。我还尝试创建一个使用@Configuration和@EnableWebMvc注释实现WebMvcConfigurer接口的WebConfig,但是它也没有起作用。

当前的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);
        }
    }
}

塔尔·阿罗尼(Tal Aloni)

经过一番搜索,我发现我已经注册了WebMvcConfigurationSupport配置。但是,如果有人在寻找并希望使用拦截器来修改标头,请不要为此使用拦截器,因为如果您返回ResponseEntity或控制器方法返回@ ResponseBody,spring将无法很好地处理它。取而代之的(至少对于我来说,每次接收到有效请求时,它都会过滤并更新令牌)使用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);
  }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Spring Boot中配置拦截器?

无法在Spring Boot应用程序中配置ViewResolver

Spring Boot:无法配置

Spring Boot 应用程序无法启动?

Spring Boot添加Http请求拦截器

在Spring Boot应用程序中无法解析表“'xx”

无法从JUnit的Spring Boot中读取应用程序属性?

在Spring Boot应用程序中无法解析占位符

无法加载在Docker中运行的Spring Boot应用程序

无法在IntelliJ中启动Spring Boot + thymeleaf应用程序

Intellij Spring Boot应用程序无法在Tomcat中运行

Spring Boot应用程序无法在CloudFoundry中启动

Spring Data Cassandra无法启动的Spring Boot应用程序

我可以在同一个Spring Boot应用程序上使用两个拦截器吗?

无法从Spring-boot应用程序中的Consul读取配置

Spring Boot @JmsListener拦截器

如何使用配置类在 Spring Boot 中为我的应用程序配置属性?

在Spring Boot应用程序中无法从浏览器访问http:inbound-gateway映射

在Spring Boot应用程序中为多个登录页面配置Spring Security

配置spring-session-data-redis后无法启动spring-boot应用程序

我如何在 Spring Boot 2 应用程序中为资产管道(bertramlabs)配置静态版本控制(摘要)?

无法在Openshift中部署Spring Boot应用程序

无法启动Spring Boot Web应用程序

无法将Spring Boot应用程序部署到Azure

无法执行Spring Boot应用程序

无法使用Spring Boot应用程序映射HTML文件

无法使用Spring Boot运行Web应用程序

Spring Boot + Tomcat + Jetty - 应用程序无法启动

JUnit Spring Boot应用程序-无法自动装配字段