在调用Spring Boot应用程序中的控制器之前执行代码

时间:2016-09-15 10:25:54

标签: java spring-boot controller

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

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

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

2 个答案:

答案 0 :(得分:2)

  

是否可以仅拦截对我的控制器的呼叫?

您可以将拦截器定义为仅拦截特定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;
    }
}

答案 1 :(得分:0)

我已经习惯了这样的问题,这里的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表示你想在它们之前执行代码的方法,我希望有帮助