问题解决 利用切面 通过自定义注解 实现日至记录功能

本文介绍如何在SpringMVC和Shiro项目中使用切面和自定义注解实现操作日志记录功能。通过创建自定义注解@Log和切面类OperateLogAop,可在指定方法上记录业务操作和请求参数。文章讨论了配置aop:aspectj-autoproxy导致的404问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:
打算利用切面 通过自定义注解 在项目中实现日至记录功能。
项目技术:
项目中使用了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" />这段配置,因此尝试着将其注释掉,重新运行项目,一切正常了。

暂且记录,后续空的时候深入研究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值