spring-boot - 拦截请求并发送到外部

标签 spring-boot spring-mvc

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

我的 Controller 的一个例子:

@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;
    }
}

我也实现了其他端点。

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

我的粗略想法是使用 HandlerIntercept ,但我不确定我是否朝着正确的方向前进。有人可以分享一些经验,实现这一目标的最佳方法是什么?如果您能展示一些示例代码,那就太好了。提前致谢。

最佳答案

您可以使用 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;
        }
    }

}

注册 HandlerInterceptorAdapter
@Configuration
public class PathMatchingConfigurationAdapter extends WebMvcConfigurerAdapter {

    @Autowired
    private RequestInterceptor requestInterceptor;

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

使用 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);
    }
}

关于spring-boot - 拦截请求并发送到外部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57255761/

相关文章:

java - NetBeans:带有 Swing 应用程序的 Spring 启动

java - 实例化对象上的 NullPointerException

java - Spring+Hibernate+Cassandra的组合如何运行

javascript - 如何发送提交按钮名称作为参数;使用 JQuery/Spring MVC 提交表单?

java - 创建类路径资源 [spring/business-config.xml] 中定义的名称为 'entityManagerFactory' 的 bean 时出错

java - 我的 Spring Boot 应用程序加载后立即退出,不会出现错误

java - 在 ControllerTest 中使用 @WebAppConfiguration 而不是 @SpringBootTest 时,Spring Data JPA 中会忽略延迟初始化

java - 无法使用 Thymeleaf 渲染对象 : Property or field cannot be found on object of type 'org.parse4j.ParseObject' - maybe not public?

java - @Transactional 在 Spring Web MVC 中不起作用?

java - Thymeleaf 页面布局问题