问题需求: 在执行系统中的某些方法后(如执行类名包含有Controller关键字的类中的方法后,再去执行打印某短信息的方法)。
解决办法<->:
一、在Spring的配置文件中配置名为BeanNameAutoProxyCreator的interceptor
<bean id="accessAdvisor" class="com.wsheng.uiservices.advisors.RestAPIAccessAdvisor" />
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>*RestAPI</value> <value>*Controller</value> </list> </property> <property name="interceptorNames"> <list> <value>accessAdvisor</value> </list> </property> </bean>
二、创建类RestAPIAccessAdvisor并实现接口:AfterReturningAdvice
这样当调用完*Controller.java或者是*RestAPI.java这样的类中的方法后,将会执行其中的afterRutrning()方法,
public void afterReturning(Object returnValue, Method method, Object[] params, Object target) throws Throwable { try { String methodName = method.getName(); // 在这里执行相应的逻辑 System.out.println(methodName); } catch (Exception e) { logger.error("Building Rest API Access Metrics Failure!!!", e); } }
解决办法<二>
一、同样在spring的配置文件中启动Spring的MVC配置。
<mvc:annotation-driven> <context:component-scan base-package="com.chuanliu.platform.activity"/>
二、配置相关的Interceptor类并制定interceptor的url
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/rest/relation/contacts/add/*"/> <bean class="com.chuanliu.platform.activity.basic.advisor.ActionAdvisor"/> </mvc:interceptor> </mvc:interceptors>
三、完成ActionAdvisor类
/** * */ package com.chuanliu.platform.activity.basic.advisor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; /** * @author Josh Wang(Sheng) * * @email josh_wang23@hotmail.com */ @Component("actionAdvisor") public class ActionAdvisor extends HandlerInterceptorAdapter { @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub System.out.println(" ---- afterCompletion"); super.afterCompletion(request, response, handler, ex); } @Override public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub System.out.println(" --- afterCOncurrentHandlingStarted"); super.afterConcurrentHandlingStarted(request, response, handler); } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub System.out.println(" --- postHandle"); System.out.println("=== " + request.getRequestURL()); System.out.println(" === " + response.getStatus()); super.postHandle(request, response, handler, modelAndView); } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub System.out.println(" --- preHandle"); System.out.println("--- " + request.getRequestURL()); return super.preHandle(request, response, handler); } }
执行测试会发现前拦截器中复写的方法都被执行了。
相关推荐
每个请求都会按照配置的顺序通过这些拦截器,直到某个拦截器返回`false`,或者所有拦截器都返回`true`并执行完控制器方法。 6. **与过滤器(Filter)的区别** 虽然拦截器和过滤器都能在请求处理过程中插入自定义...
例如,你可以配置只对特定Action或Action的某些方法应用拦截器。 4. **实战示例**: - 创建一个简单的日志拦截器,记录Action执行前后的信息。 - 配置拦截器栈,将日志拦截器添加到默认栈或者只对特定Action生效...
在Spring AOP中,拦截器是一种特殊的Advice,它可以在方法调用前后执行某些操作。Spring AOP通过拦截器链的方式,实现了对多个切面的调用顺序的控制。 - **MethodBeforeAdvice**:前置通知接口,表示在方法调用之前...
开发者可以通过实现拦截器来监控Job的执行流程,并在必要时对其进行干预。 **4.1.3 Inheriting from a Parent Job** Spring Batch支持Job继承机制,子Job可以从父Job中继承已定义的Step,从而减少重复代码。 **...
Spring AOP实现了基于代理(proxy-based)的AOP机制,通过代理对象拦截目标对象的方法调用并执行额外的逻辑。 **3.1.2 Spring AOP基础概念** Spring AOP的核心概念包括切面(aspect)、连接点(join point)、通知...
- **AccessDecisionManager**:决定用户是否有权限执行某个特定操作。 - **RunAsManager**:在执行特定操作时,根据需要替换当前的Authentication对象。 - **SecureObject拦截器**:协调AuthenticationManager、...
6. **拦截器**:Spring MVC支持在请求处理过程中使用拦截器(Interceptor)来实现某些功能,例如权限验证、日志记录等。拦截器可以通过实现`HandlerInterceptor`接口或者继承`HandlerInterceptorAdapter`类来定义,...