Spring Aop实现简单日志记录

日志类

package com.jusfoun.estate.log.domain;


import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.*;


import com.itmuch.core.entity.BaseEntity;


@Table(name = "B_LOG")
public class Log  extends BaseEntity implements Serializable {
    private Long id;


    //操作用户
    @Column(name = "member_id")
    private Long memberId;


    //操作内容
    private String operation;


    //操作类型 1新增2修改3删除
    @Column(name = "operation_type")
    private Short operationType;


    //
    @Column(name = "login_to")
    private Short loginTo;


    private Date time;


    private String ip;


    @Column(name = "create_time")
    private Date createTime;


    @Column(name = "update_time")
    private Date updateTime;


    @Column(name = "create_id")
    private Long createId;


    @Column(name = "update_id")
    private Long updateId;


    private static final long serialVersionUID = 1L;


    /**
     * @return id
     */
    public Long getId() {
        return id;
    }


    /**
     * @param id
     */
    public void setId(Long id) {
        this.id = id;
    }


    /**
     * @return member_id
     */
    public Long getMemberId() {
        return memberId;
    }


    /**
     * @param memberId
     */
    public void setMemberId(Long memberId) {
        this.memberId = memberId;
    }


    /**
     * @return operation
     */
    public String getOperation() {
        return operation;
    }


    /**
     * @param operation
     */
    public void setOperation(String operation) {
        this.operation = operation;
    }


    /**
     * @return operation_type
     */
    public Short getOperationType() {
        return operationType;
    }


    /**
     * @param operationType
     */
    public void setOperationType(Short operationType) {
        this.operationType = operationType;
    }


    /**
     * @return login_to
     */
    public Short getLoginTo() {
        return loginTo;
    }


    /**
     * @param loginTo
     */
    public void setLoginTo(Short loginTo) {
        this.loginTo = loginTo;
    }


    /**
     * @return time
     */
    public Date getTime() {
        return time;
    }


    /**
     * @param time
     */
    public void setTime(Date time) {
        this.time = time;
    }


    /**
     * @return ip
     */
    public String getIp() {
        return ip;
    }


    /**
     * @param ip
     */
    public void setIp(String ip) {
        this.ip = ip;
    }


    /**
     * @return create_time
     */
    public Date getCreateTime() {
        return createTime;
    }


    /**
     * @param createTime
     */
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }


    /**
     * @return update_time
     */
    public Date getUpdateTime() {
        return updateTime;
    }


    /**
     * @param updateTime
     */
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }


    /**
     * @return create_id
     */
    public Long getCreateId() {
        return createId;
    }


    /**
     * @param createId
     */
    public void setCreateId(Long createId) {
        this.createId = createId;
    }


    /**
     * @return update_id
     */
    public Long getUpdateId() {
        return updateId;
    }


    /**
     * @param updateId
     */
    public void setUpdateId(Long updateId) {
        this.updateId = updateId;
    }
}


service类

package com.jusfoun.estate.log.service;


import java.util.List;


import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.springframework.http.HttpRequest;
import org.springframework.stereotype.Service;


import com.github.pagehelper.PageHelper;
import com.google.common.collect.Lists;
import com.itmuch.core.constants.CodeConstant;
import com.itmuch.core.page.PageInfo;
import com.itmuch.core.page.PageVo;
import com.itmuch.core.service.BaseService;
import com.itmuch.core.util.DozerUtil;
import com.itmuch.core.util.ErrorMsgUtil;
import com.itmuch.core.util.SaltUtil;
import com.itmuch.core.util.SubjectUtil;
import com.itmuch.core.web.converter.Result;
import com.jusfoun.estate.admin.domain.User;
import com.jusfoun.estate.admin.persistence.UserMapper;
import com.jusfoun.estate.admin.vo.PageInfoVo;
import com.jusfoun.estate.admin.vo.UserAdminEditVo;
import com.jusfoun.estate.admin.vo.UserAdminRegVo;
import com.jusfoun.estate.admin.vo.UserVo;
import com.jusfoun.estate.log.domain.Log;
import com.jusfoun.estate.log.persistence.LogMapper;


@Service
public class LogService extends BaseService<LogMapper, Log> {


	private static final int SALT_SIZE = 8;


	/**
	 * 分页显示条件查询
	 * 
	 * @param vo
	 * @param queuryVo
	 * @return
	 */
	public PageInfoVo<UserVo> conditionPageQuery(PageVo vo, UserVo queuryVo) {
		String order = vo.getOrder();


		if ((queuryVo.getRoleIds() != null) && (queuryVo.getRoleIds().size() == 0)) {
			queuryVo.setRoleIds(null);
		}


		PageHelper.startPage(vo.getPage(), vo.getRows(), order);
		List<User> list = this.dao.conditionPageQuery(queuryVo);
		PageInfo<User> info = new PageInfo<User>(list);
		List<UserVo> voList = Lists.newArrayList();


		if ((list != null) && !list.isEmpty()) {


			for (User admin : list) {
				UserVo adminVo = DozerUtil.map(admin, UserVo.class);
				adminVo.setPassword(null);


				// 查询用户的角色
				List<Long> roleIds = this.dao.selectRoleIdListByUserId(admin.getId());
				adminVo.setRoleIds(roleIds);
				voList.add(adminVo);
			}


			PageInfoVo<UserVo> infoVo = new PageInfoVo<UserVo>(info.getList(), voList);
			return infoVo;
		}
		return null;
	}


	public PageInfo<UserVo> listAllPaged(PageVo vo) {
		String order = vo.getOrder("CREATE_TIME");
		PageHelper.startPage(vo.getPage(), vo.getRows(), order);


		List<User> list = this.dao.selectAll();
		PageInfo<User> info = new PageInfo<User>(list);


		List<UserVo> voList = Lists.newArrayList();


		if ((list != null) && !list.isEmpty()) {


			for (User admin : list) {
				UserVo adminVo = DozerUtil.map(admin, UserVo.class);
				adminVo.setPassword(null);


				// 查询用户的角色
				List<Long> roleIds = this.dao.selectRoleIdListByUserId(admin.getId());
				// 之所以要加这个判断,是因为easyui 的combobox
				if ((roleIds != null) && roleIds.isEmpty()) {


				}
				adminVo.setRoleIds(roleIds);
				voList.add(adminVo);
			}
			PageInfo<UserVo> pageInfo = new PageInfo<UserVo>(null);
			pageInfo.setTotal(info.getTotal());
			pageInfo.setList(voList);


			return pageInfo;
		}
		return null;


	}


	public void insertLog(Log vo) {


		 this.dao.insertLog(vo);
	}
}


AOP实现类

package com.jusfoun.estate.aop;


import java.lang.reflect.Method;
import java.net.InetAddress;
import java.util.Date;


import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;


import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;


import com.itmuch.core.util.SubjectUtil;
import com.jusfoun.estate.log.domain.Log;
import com.jusfoun.estate.log.service.LogService;


/**
 * 日志记录,添加、删除、修改方法AOP 
 * @author myl
 *
 */
@Aspect 
public class LogAspect {


	 @Resource
	 public LogService logService;
	 
	 /**
	  * 新增操作切入点
	  */
	 @Pointcut("execution(* com.jusfoun.estate.*.service.*.insert*(..))")
	 public void insertServiceCall(){};
	
	 /**
	  * 修改操作切入点
	  */
	 @Pointcut("execution(* com.jusfoun.estate.*.service.*.update*(..))")
	 public void updateServiceCall(){};
	 
	 /**
	  * 删除操作切入点
	  */
	 @Pointcut("execution(* com.jusfoun.estate.*.service.*.delete*(..))")
	 public void deleteServiceCall(){};
	 
	 /**
	  * 新增操作日志(后置通知)
	  * @param joinPoint
	  * @param rtv
	  * @throws Throwable
	  */
	 @AfterReturning(value="insertServiceCall()", argNames="rtv", returning="rtv")  
	 public void insertServiceCallCalls(JoinPoint joinPoint, Object rtv) throws Throwable{  
	     
		 //HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); 
	     //判断参数  
	     if(joinPoint.getArgs() == null){//没有参数  
	         return;  
	     }  
	     String jMethod = joinPoint.getSignature().getName();
	     String opContent = adminOptionContent(joinPoint.getArgs(), jMethod); 
	     
	     //创建日志对象  
	     Log log = new Log();  
	     log.setMemberId(SubjectUtil.getUser().getId());//设置操作员id  
	     log.setOperation(opContent);//操作  
	     log.setOperationType((short) 1); 
	     log.setIp(InetAddress.getLocalHost().getHostAddress());
	     log.setTime(new Date());
	     
	     logService.insertLog(log);//添加日志  
	 }  
	 
	 /**
	  * 修改操作日志(后置通知)
	  * @param joinPoint
	  * @param rtv
	  * @throws Throwable
	  */
	 @AfterReturning(value="updateServiceCall()", argNames="rtv", returning="rtv")  
	 public void updateServiceCallCalls(JoinPoint joinPoint, Object rtv) throws Throwable{  
	     
		 //HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); 
	     //判断参数  
	     if(joinPoint.getArgs() == null){//没有参数  
	         return;  
	     }  
	     String jMethod = joinPoint.getSignature().getName();
	     String opContent = adminOptionContent(joinPoint.getArgs(), jMethod); 
	     
	     //创建日志对象  
	     Log log = new Log();  
	     log.setMemberId(SubjectUtil.getUser().getId());//设置操作员id  
	     log.setOperation(opContent);//操作  
	     log.setOperationType((short) 2); //1新增2修改3删除
	     log.setIp(InetAddress.getLocalHost().getHostAddress());
	     log.setTime(new Date());
	     
	     logService.insertLog(log);//添加日志  
	 } 
	 
	 /**
	  * 删除操作日志(前置通知)
	  * 前置环绕通知在操作对象被删除前获取操作对象信息用于日志中
	  * @param joinPoint
	  * @param rtv
	  * @throws Throwable
	  */
	 @Before(value="deleteServiceCall()", argNames="rtv")  
	 public void deleteServiceCallCalls(JoinPoint pjp) throws Throwable{  
	     
		 //HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); 
	     //判断参数  
	     if(pjp.getArgs() == null){//没有参数  
	         return;  
	     }  
	     String jMethod = pjp.getSignature().getName();
	     System.out.println(pjp.getArgs()[0]);
	     String opContent = jMethod+"[参数1,类型:Long,值:"+pjp.getArgs()[0]+"]"; 
	     
	     //创建日志对象  
	     Log log = new Log();  
	     log.setMemberId(SubjectUtil.getUser().getId());//设置操作员id  
	     log.setOperation(opContent);//操作  
	     log.setOperationType((short) 3); //1新增2修改3删除
	     log.setIp(InetAddress.getLocalHost().getHostAddress());
	     log.setTime(new Date());
	     
	     logService.insertLog(log);//添加日志  
	 } 
	 
	 /** 
	   * 使用Java反射来获取被拦截方法(insert、update)的参数值, 
	   * 将参数值拼接为操作内容 
	   */  
	  public String adminOptionContent(Object[] args, String mName) throws Exception{  
		
	      if (args == null) {  
	          return null;  
	      }  
	        
	      StringBuffer rs = new StringBuffer();  
	      rs.append(mName);  
	      String className = null;  
	      int index = 1;  
	      // 遍历参数对象  
	      for (Object info : args) {  
	            
	          //获取对象类型  
	          className = info.getClass().getName();  
	          className = className.substring(className.lastIndexOf(".") + 1);  
	          rs.append("[参数" + index + ",类型:" + className + ",值:");  
	            
	          // 获取对象的所有方法  
	          Method[] methods = info.getClass().getDeclaredMethods();  
	            
	          // 遍历方法,判断get方法  
	          for (Method method : methods) {  
	                
	              String methodName = method.getName();  
	              // 判断是不是get方法  
	              if (methodName.indexOf("get") == -1) {// 不是get方法  
	                  continue;// 不处理  
	              }  
	                
	              Object rsValue = null;  
	              try {  
	                    
	                  // 调用get方法,获取返回值  
	                  rsValue = method.invoke(info);  
	                    
	                  if (rsValue == null) {//没有返回值  
	                      continue;  
	                  }  
	                    
	              } catch (Exception e) {  
	                  continue;  
	              }  
	                
	              //将值加入内容中  
	              rs.append("(" + methodName + " : " + rsValue + ")");  
	          }  
	            
	          rs.append("]");  
	            
	          index++;  
	      }  
	        
	      return rs.toString();  
	  }  


	  //获取客户端ip
	  public static String getIp(HttpServletRequest request) {
          String ip = request.getHeader("X-Forwarded-For");
          if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
              //多次反向代理后会有多个ip值,第一个ip才是真实ip
              int index = ip.indexOf(",");
              if(index != -1){
                  return ip.substring(0,index);
              }else{
                  return ip;
              }
          }
          ip = request.getHeader("X-Real-IP");
          if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
              return ip;
          }
          return request.getRemoteAddr();
      }
}
applicationContext.xml

<!-- 加入Aspectj配置 -->  
    <aop:aspectj-autoproxy />  
    <bean id="logAspect" class="com.jusfoun.estate.aop.LogAspect" />  




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值