SSM应用AOP完成日志功能(保存到数据库)

0、目录结构
在这里插入图片描述

1、数据库创建一张日志表

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

2、创建一个实体类

package cn.orz.bean;

import java.util.Date;

public class Log {
    private String id;
    private Date visitTime;

    private String username;
    private String ip;
    private String url;
    private Long executionTime;
    private String method;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Date getVisitTime() {
        return visitTime;
    }

    public void setVisitTime(Date visitTime) {
        this.visitTime = visitTime;
    }




    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public Long getExecutionTime() {
        return executionTime;
    }

    public void setExecutionTime(Long executionTime) {
        this.executionTime = executionTime;
    }

    public String getMethod() {
        return method;
    }

    public void setMethod(String method) {
        this.method = method;
    }

    @Override
    public String toString() {
        return "SysLog{" +
                "id='" + id + '\'' +
                ", visitTime=" + visitTime +
                ", username='" + username + '\'' +
                ", ip='" + ip + '\'' +
                ", url='" + url + '\'' +
                ", executionTime=" + executionTime +
                ", method='" + method + '\'' +
                '}';
    }
}

3、创建AOP切面类

package cn.orz.aop;

import cn.orz.bean.Log;
import cn.orz.bean.User;
import cn.orz.controller.LogController;
import cn.orz.service.LogService;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;

@Component
@Aspect
public class LogAop {

    @Autowired
    private HttpServletRequest request;

    @Autowired
    private LogService LogService;

    private Date visitTime;//访问时间
    private Class clazz;//访问的类
    private Method method;//访问的方法
    //主要获取访问的时间、访问的类、访问的方法

    @Before("execution(* cn.orz.controller.*.*(..))")
    public void doBefore(JoinPoint jp) throws NoSuchMethodException,SecurityException{
        System.err.println("123");
        visitTime = new Date();//访问时间
        clazz = jp.getTarget().getClass();//具体要访问的类
        String methodName = jp.getSignature().getName();//获取访问的方法名称
        Object[] args = jp.getArgs();//获取访问的方法参数

        //获取具体执行的方法的Method对象
        if(args==null&&args.length==0){
            method = clazz.getMethod(methodName);//只能获取无参数的方法
        }else{
            Class[] classArgs = new Class[args.length];
            for(int i=0;i<args.length;i++){
                classArgs[i] = args[i].getClass(); //如果传递的方法参数类型为基本数据类型,一定要用它的包装类,如int 应改为Integer
            }
            method = clazz.getMethod(methodName,classArgs);
        }
    }

    //后置通知
    @After("execution(* cn.orz.controller.*.*(..))")
    public void doAfter(JoinPoint jp) throws Exception{
        System.err.println("123");

        long time = new Date().getTime() - visitTime.getTime();//获取访问的时长

        String url = "";

    if (clazz!=null&&method!=null&&clazz!=LogAop.class&&clazz!= LogController.class){
            //获取url
            //获取类上的@RequestMapping(value="/**")
        RequestMapping classAnnotation = (RequestMapping) clazz.getAnnotation(RequestMapping.class);
       if (classAnnotation!=null){
                String[] classValue = classAnnotation.value();
                //获取方法上的@RequestMapping(value="/**")
                RequestMapping methodAnnotation = method.getAnnotation(RequestMapping.class);
                if (methodAnnotation!=null){
                    String[] methodValue = methodAnnotation.value();
                    url = classValue[0]+methodValue[0];
                }
            }

            //获取访问的ip地址
            String ip= request.getRemoteAddr();

            //获取当前操作的用户
            User user =(User) request.getSession().getAttribute("user");

         // SecurityContext context = SecurityContextHolder.getContext();//从上下文中获取当前登录的用户
           // User user = (User) context.getAuthentication().getPrincipal();
            Object[] objs = jp.getArgs();
           System.err.println(objs.toString());
                 //循环输出参数
                 for (Object obj : objs) {
                        System.err.println(obj.toString());
                 }

            //将日志相关信息封装到SysLog对象
            Log sysLog = new Log();
            sysLog.setExecutionTime(time);//执行时长
            sysLog.setIp(ip);
            sysLog.setMethod("[类名]"+clazz.getName()+"[方法名]"+method.getName());
            if (user == null){
                sysLog.setUsername("无登录账户");
            }else {
                String useremail = user.getEmail();
                sysLog.setUsername(useremail);
            }
            sysLog.setVisitTime(visitTime);
            sysLog.setUrl(url);
            System.err.println(sysLog);
            //调用Service完成操作
            LogService.savelog(sysLog);

        }
    }

}

4、SpringMVC配置基于AOP切面的配置

<aop:aspectj-autoproxy proxy-target-class="true"/>

5、web.xml定义一个request监听器

<!--定义一个request监听器-->
  <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  </listener>

6、LogService类

package cn.orz.service;

import cn.orz.bean.Log;
import cn.orz.dao.LogMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class LogService {

    @Autowired
    private LogMapper logMapper;

    public void savelog(Log sysLog) {
        logMapper.savelog(sysLog);
    }
}


7、LogController类

package cn.orz.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping(value = "SysLog")
public class LogController {

}

8、LogMapper

package cn.orz.dao;

import cn.orz.bean.Log;

public interface LogMapper {
    void savelog(Log sysLog);
}

9、LogMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC
        "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- 命名空间 -->
<mapper namespace="cn.orz.dao.LogMapper">

    <insert id="savelog"  parameterType="cn.orz.bean.Log">
        insert into sysLog
        values(
        SYS_GUID(),
        #{visitTime},
        #{username},
        #{ip},
        #{url},
        #{executionTime},
        #{method})
    </insert>


</mapper>
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java SSM 是指 Spring + SpringMVC + MyBatis 技术栈的结合体,是一种常用的 Java Web 开发框架。它的主要功能包括: 1. Spring 框架:提供了 IoC 和 AOP功能,使得开发者可以更加方便地管理和维护应用程序的各个组件。 2. SpringMVC 框架:提供了 MVC 架构的支持,使得开发者可以更加方便地实现业务逻辑和界面展示的分离。 3. MyBatis 框架:提供了 ORM(对象关系映射)功能,使得开发者可以更加方便地操作数据库。 Java SSM实现步骤如下: 1. 配置 Spring 框架:在 Spring 配置文件中配置需要管理的组件,如数据源、事务管理器、日志记录器等。 2. 配置 SpringMVC 框架:在 SpringMVC 配置文件中配置控制器、视图解析器、拦截器等。 3. 配置 MyBatis 框架:在 MyBatis 配置文件中配置数据库连接信息、映射文件等。 4. 开发 DAO(数据访问对象)层:使用 MyBatis 框架实现数据库操作,将数据从数据库中取出来并封装成 Java 对象返回给 Service 层。 5. 开发 Service 层:实现业务逻辑,调用 DAO 层获取数据并进行处理后返回给 Controller 层。 6. 开发 Controller 层:负责处理用户请求和响应,将请求和响应信息封装成 Model 对象返回给视图解析器进行展示。 7. 配置 web.xml 文件:配置 DispatcherServlet、编码过滤器等相关信息。 通过以上步骤的实现,就可以开发出一个基于 Java SSM 技术栈的 Web 应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值