ssm整合 权限管理demo AOP日志实现

1.数据库与表结构

1.1 日志表信息描述sysLog

字段名称字段类型字段描述
idVARCHAR2主键 无意义uuid
visitTimetimestamp访问时间
usernameVARCHAR2操作者用户名
ipVARCHAR2访问ip
urlVARCHAR2访问资源url
executionTimeint执行时长
methodVARCHAR2访问方法

2.sql语句

CREATE TABLE sysLog(
    id VARCHAR2(32) default SYS_GUID() PRIMARY KEY,    
    visitTime timestamp,    
    username VARCHAR2(50),    
    ip VARCHAR2(30),    
    url VARCHAR2(50),    
    executionTime int,    
    method VARCHAR2(200) 
)

3.实体类

public class SysLog {
    private String id;    
    private Date visitTime;    
    private String visitTimeStr;    
    private String username;    
    private String ip;    
    private String url;    
    private Long executionTime;    
    private String method;

2. 基于AOP日志处理

2.1 创建切面类处理日志


@Component
@Aspect
public class LogAop {

    @Autowired
    private SysLogService sysLogService;

    @Autowired
    private HttpServletRequest request;

    private Date visitTime; //开始访问时间

    private Class visitClass;   //访问的类

    private Method method;  //访问的方法

    //前置通知 主要是获取开始时间,执行的类是哪一个,执行的是哪一个方法
    @Before("execution(* cn.itcast.controller.*.*(..))")
    public void doBefore(JoinPoint joinPoint) throws NoSuchMethodException {
        visitTime = new Date(); //当前时间就是开始访问的时间
        visitClass = joinPoint.getTarget().getClass(); //获取具体要访问的类
        String methodName = joinPoint.getSignature().getName();//获取访问方法的名称

        Object[] args = joinPoint.getArgs();    //获取访问方法参数的数组

        if (args == null || args.length == 0) {
            //如果方法空参,则执行
            method = visitClass.getMethod(methodName);  //只能获取无参数的方法
        } else {
            //如果方法有参,则执行else
            Class[] classArgs = new Class[args.length];
            for (int i = 0; i < args.length; i++) {
                classArgs[i] = args[i].getClass();
            }
            method = visitClass.getMethod(methodName, classArgs);

        }
    }

    /**
     * 后置通知
     * @param joinPoint
     */
    @After("execution(* cn.itcast.controller.*.*(..))")
    public void doAfter(JoinPoint joinPoint){
        Long executionTime = new Date().getTime() - visitTime.getTime();    //获得访问时长

        String url = "";
        //获取访问资源的url
        if (visitClass != null && method != null && visitClass != LogAop.class && visitClass != SysLogController.class){
            //1.获取类上的@RequestMapping("/xxx")
            RequestMapping classAnnotation = (RequestMapping) visitClass.getAnnotation(RequestMapping.class);
            String[] classUrl = classAnnotation.value();
            if (classAnnotation != null){
                //2.获取方法上的@RequestMapping(/xxx)
                RequestMapping methodAnnotation = method.getAnnotation(RequestMapping.class);
                String[] methodUrl = methodAnnotation.value();

                url = classUrl[0]+ methodUrl[0];

                //获取ip
                String ip  = request.getRemoteAddr();

                //获取操作用户名
                SecurityContext securityContext = SecurityContextHolder.getContext();//从上下文中获取登录用户
                User user = (User) securityContext.getAuthentication().getPrincipal();
                String username = user.getUsername();

                SysLog sysLog  = new SysLog();
                sysLog.setExecutionTime(executionTime);
                sysLog.setIp(ip);
                sysLog.setMethod("[类名:]"+ visitClass.getName() + " " + "[方法名:]" + method.getName());
                sysLog.setUrl(url);
                sysLog.setUsername(username);
                sysLog.setVisitTime(visitTime);

                sysLogService.save(sysLog);
            }
        }


    }
}

在切面类中我们需要获取登录用户的username,还需要获取ip地址,我们怎么处理?

  • username获取
    SecurityContextHolder获取
  • ip地址获取
    ip地址的获取我们可以通过request.getRemoteAddr()方法获取到。
    在Spring中可以通过RequestContextListener来获取request或session对象。
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值