基于ssm整合AOP实现记录日志 访问历史 功能

感觉以后会用到记录一下
1.配置springmvc.xml文件

		<!-- aop的自动代理 -->
		<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
		<!--配置开启security的注解支持-->
		<security:global-method-security secured-annotations="enabled"/>

2.日志表

create table sys_log(
id int primary key auto_increment, -- 主键
visitTime date,-- 访问时间
username varchar(50),-- 访问用户名
ip varchar(30),-- 访问的ip地址
method varchar(200)-- 访问的方法 类名+方法名
)

3.编写日志切面类


/**
 * 日志切面类 (切入点和通知(又叫增强)的组合 )
 *
 *  注解完成 切面类编写
 *      注意:1.当前类需交给spring容器 管理 (当前类创建对象由spring容器管理)
 *            2.因为是切面类,加入@Aspect
 */

@Component
@Aspect
public class LogAspect {

    @Autowired
    private HttpServletRequest request; //spring容器默认已经管理了HttpServletRequest

    @Autowired
    private LogService logService; //logservice中有一保存方法其mapper配置如下
	 
   // <insert id="save" parameterType="sysLog">
   //     insert into sys_log(visitTime,username,ip,method) values(now(),#{username},#{ip},#{method})
    //</insert>
    /**
     * 环绕通知一般会有返回值 ,Object
     * @param joinPoint  参数用于 对目标执行环绕后,需提供一个返回值
     * @return
     */
    @Around(value="pointcut1()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {

        //1. 创建日志对象
        SysLog log = new SysLog();
        //2. 将需要的数据封装到 日志对象
        log.setIp(request.getRemoteAddr()); //将客户机ip存入log

        //可以从security上下文对象中得到用户名
        SecurityContext context = SecurityContextHolder.getContext();
        Authentication authentication = context.getAuthentication();
        User user = (User) authentication.getPrincipal();   //拿到 用户对象重要信息
        log.setUsername(user.getUsername());    //得到用户名

        Object target = joinPoint.getTarget();  //拿到被增强目标类(就是所有xxxController类)对象
        String className = target.getClass().getName(); //拿到被增强类名字

        String methodName = joinPoint.getSignature().getName();//拿到 实际被增强方法的签名
        log.setMethod(className+"."+methodName);

        //3. 将日志存入到 数据库
        logService.save(log);

        //对目标 环绕增强后,得到的返回值
        Object proceed = joinPoint.proceed();
        //环绕后,只需要将当前proceed对象返回
        return proceed;
    }

    @Pointcut(value="execution(* cn.hp.controller.*.*(..))")
    private void pointcut1(){}
}
发布了59 篇原创文章 · 获赞 70 · 访问量 3043

猜你喜欢

转载自blog.csdn.net/qq_44784185/article/details/104683298