拦截请求并发送给外部

Lee*_*eem 5 spring-mvc spring-boot

我正在开发一个Spring Boot项目。

我的控制器的一个例子:

@Controller
public class RestController {

    @GetMapping(value = "/student/{studentId}")
    public @ResponseBody Student getData(@PathVariable Integer studentId) {
        Student student = new Student();
        student.setName("Peter");
        student.setId(studentId);

        return student;
    }
}
Run Code Online (Sandbox Code Playgroud)

我还实现了其他端点。

我需要拦截每个命中端点的请求,并将请求转发到另一个服务(微服务),换句话说,我需要根据该响应将每个请求转发到与当前本地计算机运行在同一本地计算机上的另一个Web应用程序服务来决定是否继续转发请求。

我的粗略想法是使用HandlerIntercept,但是我不确定我是否朝着正确的方向发展。有人可以分享一些经验吗?如果您可以显示一些示例代码,那就太好了。提前致谢。

das*_*sum 0

您可以使用HandlerInterceptorAdapter。

定义拦截器如下。

@Component
public class RequestInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object object) throws Exception {
        System.out.println("In preHandle we are Intercepting the Request");
        System.out.println("____________________________________________");
        //Call the Rest API and Validate 
        if (conditionsNotMet()) {
           response.getWriter().write("something");
           response.setStatus(someErrorCode);

           return false;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

注册HandlerInterceptorAdapter

@Configuration
public class PathMatchingConfigurationAdapter extends WebMvcConfigurerAdapter {

    @Autowired
    private RequestInterceptor requestInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(requestInterceptor);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用WebMvcConfigurer

@Configuration
public class PathMatchingConfigurationAdapter implements WebMvcConfigurer {

    @Autowired
    private RequestInterceptor requestInterceptor;

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

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry resourceHandlerRegistry) {

    }

    @Override
    public void addCorsMappings(CorsRegistry corsRegistry) {

    }

    @Override
    public void addViewControllers(ViewControllerRegistry viewControllerRegistry) {

    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry viewResolverRegistry) {

    }

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> list) {

    }

    @Override
    public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> list) {

    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> list) {

    }

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> list) {

    }

    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> list) {

    }

    @Override
    public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> list) {

    }

    @Override
    public Validator getValidator() {
        return null;
    }

    @Override
    public MessageCodesResolver getMessageCodesResolver() {
        return null;
    }

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorPathExtension(false);
    }

    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer asyncSupportConfigurer) {

    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer defaultServletHandlerConfigurer) {

    }

    @Override
    public void addFormatters(FormatterRegistry formatterRegistry) {

    }

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setUseSuffixPatternMatch(false);
    }
}
Run Code Online (Sandbox Code Playgroud)