由于项目用的是注解的方式进行注入的如:@Controller 所以在加AOP拦截的时候有时用其它方法拦截不到。
可通过如下方式进行拦截:
<bean id="aopAspect" class="com.test.aop.AopAspect"/>
<aop:config>
<aop:aspect ref="aopAspect">
<aop:pointcut id="businessController" expression="execution(* org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(..))"/>
<aop:before method="doBefore" pointcut-ref="businessController"/>
<aop:after method="doAfter" pointcut-ref="businessController"/>
<aop:around method="doAround" pointcut-ref="businessController"/>
<aop:after-throwing method="doThrowing" pointcut-ref="businessController" throwing="ex"/>
</aop:aspect>
</aop:config>
其中AopAspect.java的内容如下:
package com.test.aop;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
/*
* JoinPoint介绍:
* java.lang.Object[] getArgs():获取连接点方法运行时的入参列表;
* Signature getSignature() :获取连接点的方法签名对象;
* java.lang.Object getTarget() :获取连接点所在的目标对象;
* java.lang.Object getThis() :获取代理对象本身;
*
* ReqestFacade、ResponseFacade、具体的Controller
*/
/**
* 权限控制(切面类)
*/
public class AopAspect {
public void doBefore(JoinPoint jp) throws Exception {
HttpServletRequest request = null;
HttpServletResponse response = null;
Object[] objs = jp.getArgs();
System.out.println("-----------------log Begining method: "
+ jp.getClass().getName() + "." + jp.getSignature().getName());
for (Object o : objs) {
System.out.println("args = " + o);
if (o instanceof HttpServletRequest) {
request = (HttpServletRequest) o;
System.out.println("---------------servletPath----- " + request.getServletPath());
}
}
}
public void doAfter(JoinPoint jp) throws Exception {
System.out.println("-----------------log Ending method: "
+ jp.getClass().getName() + "." + jp.getSignature().getName());
}
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
long time = System.currentTimeMillis();
HttpServletRequest request = null;
HttpServletResponse response = null;
time = System.currentTimeMillis() - time;
Object[] objs = pjp.getArgs();
for (Object o : objs) {
if (o instanceof HttpServletRequest) {
request = (HttpServletRequest) o;
}
if (o instanceof HttpServletResponse) {
response = (HttpServletResponse) o;
}
}
Object retVal = pjp.proceed();
System.out.println("-----------------around process time: " + time
+ " ms");
return retVal;
}
public void doThrowing(JoinPoint jp, Throwable ex) {
System.out.println("-----------------throwing method "
+ jp.getTarget().getClass().getName() + "."
+ jp.getSignature().getName() + " throw exception");
System.out.println(ex.getMessage());
}
/**
* 判断是否为ajax请求
* @param request
* @return true为ajax语法,false为其它。
*/
private boolean isAjaxRequest(HttpServletRequest request) {
if (request != null) {
String requestType = request.getHeader("X-Requested-With");
if (requestType != null && "XMLHttpRequest".equals(requestType)) {
return true;
}
}
return false;
}
}