当前位置: 首页 > 知识库问答 >
问题:

无法为spring boot 2应用程序中的拦截器添加配置WebMvcConfigurer

郁灿
2023-03-14

我试图在我的spring boot应用程序中首次创建一个拦截器,但不知何故,它不是自动创建的,如教程中所述。

我试图创建一个WebConfig类来扩展WebMvcConfigurerAdapter类,并将其注释为@Component,但没有成功。我还试图创建一个WebConfig,用@configuration和@enableWebMVC注释实现WebMvcConfigurer接口,但也没有成功。

@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个答案

路裕
2023-03-14

经过一些搜索,我发现我有一个注册的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);
  }

}

 类似资料:
  • 我想在我的Quarkus应用程序中添加一个HTTP拦截器,这样我就可以拦截所有HTTP请求。如何实现?

  • 谁能帮我读取 Spring 引导拦截器( 方法)中的应用程序属性值? 我试图在中编写一些逻辑。这个逻辑需要从文件中获取一些值。我使用注释,但它总是空的。 谢谢。

  • 我想添加spring mvc拦截器作为Java配置的一部分。我已经有了一个基于xml的配置,但是我正在尝试使用Java的配置。对于拦截器,我从spring的文档中知道可以这样做- 但我的拦截器使用了一个spring豆,就像下面这样- SomeService类如下所示- 我使用这样的注释来扫描bean,并且没有在配置类中将它们指定为 根据我的理解,由于Java配置使用new来创建对象,所以sprin

  • 谢谢你的提示 问候Rizzi

  • 问题内容: 我正在使用Java EE 6和Jboss AS7.1,并尝试使用拦截器绑定(来自jboss网站的示例)。 我有一个InterceptorBinding注解: 拦截器: 还有一个豆: 但是拦截器没有被称为。。。 在编写此代码时将调用拦截器: 谢谢你的帮助。 问题答案: 您是否按照参考示例中的说明启用了拦截器? 缺省情况下,bean档案没有通过拦截器绑定绑定的已启用拦截器。必须通过将侦听器

  • 在这个问题中,我遇到了与Struts 2相反的问题:仅从defaultStack截取器中排除验证方法 上面的问题涉及到所有的方法都被排除在外,我的问题是没有任何方法被排除在外! 我正在尝试让authenticationInterceptor忽略LoginAction的showLogin方法: 但是,每次我转发到loginInitial时,拦截器都会抓取它,即使我的showLogin方法被排除在外。