【问题标题】:Execute code before controller in Spring Boot application is called在调用 Spring Boot 应用程序中的控制器之前执行代码
【发布时间】:2016-09-16 05:42:16
【问题描述】:

在调用 Spring Boot 应用程序中的控制器之前,我需要做一些工作。是否可以只拦截对我的控制器的调用?

我知道我可以通过拦截 http 请求或注册过滤器来实现这一点,但是我必须处理 URI 模式,以便代码只执行一次。

在调用控制器之前执行我的代码就足够了。

【问题讨论】:

  • 为什么不试试 Spring Aspect 呢?
  • 我只有一种情况需要这种行为。此外,我很确定 Spring Boot 可以实现这样的基本功能,而我只是缺乏如何做到这一点的信息。
  • 如果你想在创建控制器 bean 之前或之后做一些事情,你也可以使用 BeanPostProcessor,但它只会在这种情况下被触发,而不是在控制器调用中触发
  • 如果是针对单个控制器的,为什么不直接在控制器中处理呢?你需要/想要做什么而你不能在控制器中做。

标签: java spring-boot controller


【解决方案1】:

是否可以只拦截对我的控制器的调用?

您可以定义一个拦截器以仅拦截特定 uri/控制器上的调用。

这是通过以这种方式添加拦截器来完成的:

registry.addInterceptor(new MyInterceptor()).addPathPatterns("/your/uri");

完整代码:

@Configuration
public class AnnotationSecurityConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/your/uri");
    }
}

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception {
        System.out.println("afterCompletion");
    }
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception {
        System.out.println("postHandle");
    }
    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        System.out.println("preHandle");
        return true;
    }
}

【讨论】:

  • 我想拦截对每个控制器的每个调用。但我不想拦截请求,例如静态资源(js、css、图片)。
  • @T3rm1 ,您始终可以在此处指定控制器方法链接到的路径。
【解决方案2】:

我已经用 Spring Aspect 概念来解决这样的问题,这里是一些简短的例子:

@Component
@Aspect
public class MyAspect {


    private final static String pointcutExpr = "execution(* com.example.myApp.myMethod(..)) || execution(* com.example.myApp.mySecondMethod(..))";

    @Before(pointcutExpr)
    public void doSomethingBefore(JoinPoint joinPoint) throws Exception {

        //here your code
    }
}

这里的myMethod和mySecondMethod代表你要在它们之前执行代码的方法,希望对你有帮助

【讨论】:

    猜你喜欢
    • 2019-06-19
    • 1970-01-01
    • 2019-12-27
    • 2019-01-07
    • 2021-05-02
    • 2019-11-18
    • 2010-12-16
    • 2022-08-03
    • 1970-01-01
    相关资源
    最近更新 更多