背景:
打算利用切面 通过自定义注解 在项目中实现日至记录功能。
项目技术:
项目中使用了springmvc,shiro等
代码:
1.注解类
/**
* 自定义操作日志记录注解
*/
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log{
/**
* 功能
*/
public BusinessType businessType() default BusinessType.OTHER;
/**
* 是否保存请求的参数
*/
public boolean isSaveRequestData() default true;
}
2.切面
@Aspect
@Component
public class OperateLogAop {
public OperateLogAop() {
System.out.println("OperateLogAop");
}
@Pointcut("@annotation(com.zbmes.common.annotation.Log)")
public void log() {
System.out.println("我是一个切入点");
}
/**
* 在所有标注@Log的地方切入
* @param joinPoint
*/
@Before("log()")
public void beforeExec(JoinPoint joinPoint) {
System.out.println("我是一个切入点");
}
@After("log()")
public void afterExec(JoinPoint joinPoint) {
System.out.println("我是一个切入点");
}
/*@Around("log()")
public Object aroundExec(ProceedingJoinPoint pjp) throws Throwable {
return pjp.proceed();
}
@AfterThrowing(pointcut = "log()", throwing = "e")
public void doAfterThrowing(JoinPoint joinPoint, Throwable e) {
e.printStackTrace();
}
private String getRemoteHost(javax.servlet.http.HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;
}*/
}
3.配置文件,在xml文件中添加以下配置
<aop:aspectj-autoproxy proxy-target-class="true" />
问题描述:
在未添加<aop:aspectj-autoproxy proxy-target-class="true" />
这段代码之前,项目均可以正常访问。添加<aop:aspectj-autoproxy proxy-target-class="true" />
该段代码后,登录页面可以访问,登录成功后,重定向访问项目首页,页面报404错误。debug模式下查看,首页controller类里面的对应方法确实没有得到执行。
问题解决
参考这篇博文https://blog.csdn.net/u011121146/article/details/81735084,发现项目中确实存在<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor" />
这段配置,因此尝试着将其注释掉,重新运行项目,一切正常了。
暂且记录,后续空的时候深入研究。