针对特定API的Spring Boot拦截器,不应该被所有API调用。

3

在 Spring Boot 控制器类中,暴露了 2 个 API。我有一个要求,只拦截其中的 1 个 API,并且不应该拦截其他 API。请问有人可以帮忙如何实现吗?

以下是代码:

public class HeaderValidationInterceptor extends HandlerInterceptorAdapter{
    
    private static final Logger logger = Logger.getLogger(HeaderValidationInterceptor.class);

    //before the actual handler will be executed
    public boolean preHandle(HttpServletRequest request, 
        HttpServletResponse response, Object handler)
        throws Exception {
        
        validateHeaderParam(request);
        request.setAttribute("startTime", startTime);
        
        return true;
    }
    
    }
    

我有一个配置类来添加拦截器,如下所示:

此外,我还有一个配置类来添加拦截器,如下所示:

Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

  @Autowired 
  HeaderValidationInterceptor headerValidationInterceptor;

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(headerValidationInterceptor)
    }
    
}

控制器类

@RestController
public class MyController {

    @Autowired
    private ICityService cityService;

    @GetMapping(value = "/cities")
    public List<City> getCities() {

        List<City> cities = cityService.findAll();

        return cities;
    }
    
    
@GetMapping(value = "/cities/{cityId}")
    public City getCityById(@PathVariable("cityId") String cityId) {

        City city = cityService.findCityById(cityId);

        return cities;
    }
}
2个回答

2

在您的拦截器中,您可以检查请求URI以拦截所需的端点。

您可以使用正则表达式匹配URI。以下是匹配/cities/{cityId}端点的示例。

if (request.getRequestURI().matches("(\\/cities\\/[a-zA-Z0-9]+\\/?)")) {
    validateHeaderParam(request);
    request.setAttribute("startTime", startTime);
}

我不确定您在拦截器中想要做什么,但是对于您的示例,您也可以在控制器中执行此操作。就像这样,

@GetMapping(value = "/cities/{cityId}")
public City getCityById(@PathVariable("cityId") String cityId, HttpServletRequest request) {

    // Here you can use HttpServletRequest and do your validation
    // validateHeaderParam(request);
    // request.setAttribute("startTime", startTime);
    
    City city = cityService.findCityById(cityId);
    return cities;
}

1

更加简洁的方式是使用基于Java的配置。在这里阅读更多。

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LocaleInterceptor());
        registry.addInterceptor(new ThemeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
        registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接