拦截请求有很多种方法,最简单的用拦截器,但是拦截器并不能获取返回的数据(比如@ResponseBody),上网找了一段时间,可以利用spring的AOP特性拦截并获取,还能修改返回的数据。
- 准备
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
- 拦截代码
package com.jujin.riskmanager.interceptor;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jujin.common.JsonList;
public class ResultInterceptor implements MethodInterceptor {
private final static ObjectMapper jsonMapper = new ObjectMapper();
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
//获取返回的数据
Object result = invocation.proceed();
// 随意处理结果吧,例如把result改成hello world
if (obj instanceof String) {
result = "hello world";
}
return result; //此时接口返回的就是hello world
}
}
- spring配置
<!-- AOP -->
<bean id="controllerMethodInterceptor" class="com.jujin.riskmanager.interceptor.ResultInterceptor"/>
<aop:config proxy-target-class="true">
<aop:pointcut id="controllerMethodPointcut" expression="execution(* com.jujin.riskmanager.controller..*(..)) and @annotation(org.springframework.web.bind.annotation.RequestMapping)"/>
<aop:advisor advice-ref="controllerMethodInterceptor" pointcut-ref="controllerMethodPointcut" />
</aop:config>