欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[置顶] 使用sping AOP 操作日志管理

程序员文章站 2022-04-25 19:30:46
...

记录后台操作人员的登陆、退出、进入了哪个界面、增加、删除、修改等操作

在数据库中建立一张SYSLOG表,使用Sping 的AOP实现日志管理,在Sping.xml中配置

   <!-- Spring 获取配置文件中定义的bean -->

    <aop:aspectj-autoproxy proxy-target-class="true"/><!-- 开启切面编程功能 -->  

    <context:component-scan base-package="com.geeboo.wxbus.service.impl,com.geeboo.wxbus.interceptor"/>

<context:annotation-config/>

 

然后在interceptor包下创建一个MyInterceptor类,里面有anyMethod ()。doBefore(),doAfterReturning(),doAfterThrowing(),

doAfter(),doAround()等方法。

 

在doAround()中执行判断用户进行进入那个类并且那个方法,然后添加日志记录。

// 调用方法名称

String methodName =pjp.getSignature().getName();

//获取进入的类名

StringclassName=

pjp.getSignature().getDeclaringTypeName();

className =

className.substring(className.lastIndexOf(".") 1).trim();

 

package com.geeboo.wxbus.interceptor;



import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.UUID;
import java.util.regex.Pattern;

import net.sf.json.JSONObject;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.jeecgframework.core.util.ContextHolderUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.geeboo.wxbus.entity.FeedbackInfo;

import com.geeboo.wxbus.entity.SnackCollect;
import com.geeboo.wxbus.entity.SysLog;
import com.geeboo.wxbus.entity.Tuser;
import com.geeboo.wxbus.entity.UserSuggest;
import com.geeboo.wxbus.pageModel.FeedbackInfoPage;
import com.geeboo.wxbus.pageModel.SnackCollectPage;
import com.geeboo.wxbus.pageModel.User;
import com.geeboo.wxbus.pageModel.UserSuggestPage;
import com.geeboo.wxbus.service.FeedbackInfoServiceI;
import com.geeboo.wxbus.service.SnackCollectServiceI;
import com.geeboo.wxbus.service.SysLogServiceI;
import com.geeboo.wxbus.service.UserServiceI;
import com.geeboo.wxbus.service.UserSuggestServiceI;

@Aspect
@Component
public class MyInterceptor {
	
	private SysLogServiceI logServiceI;//日志
	private UserServiceI userService;//用户
	private FeedbackInfoServiceI feedbackInfoService;//反馈
	private SnackCollectServiceI snackCollectService;//商店
	private UserSuggestServiceI userSuggestService;//用户建议
	
	public UserServiceI getUserService() {
		return userService;
	}
	@Autowired
	public void setUserService(UserServiceI userService) {
		this.userService = userService;
	}
	public FeedbackInfoServiceI getFeedbackInfoService() {
		return feedbackInfoService;
	}
	@Autowired
	public void setFeedbackInfoService(FeedbackInfoServiceI feedbackInfoService) {
		this.feedbackInfoService = feedbackInfoService;
	}
	public SnackCollectServiceI getSnackCollectService() {
		return snackCollectService;
	}
	@Autowired
	public void setSnackCollectService(SnackCollectServiceI snackCollectService) {
		this.snackCollectService = snackCollectService;
	}
	public UserSuggestServiceI getUserSuggestService() {
		return userSuggestService;
	}
	@Autowired
	public void setUserSuggestService(UserSuggestServiceI userSuggestService) {
		this.userSuggestService = userSuggestService;
	}
	public SysLogServiceI getLogServiceI() {
		return logServiceI;
	}
	@Autowired
	public void setLogServiceI(SysLogServiceI logServiceI) {
		this.logServiceI = logServiceI;
	}

	/**
	 * 第一个* 代表任意的返回类型 (..) 所有参数
	 */
	@Pointcut("execution(* com.geeboo.wxbus.service.impl.*.*(..))")
	private void anyMethod() {
	}; // 声明一个切入点

	@Before("anyMethod() && args(object)")
	public void doBefore(Object object) {
		//System.out.println("前置通知" + object);
	}

	@AfterReturning(pointcut = "anyMethod()", returning = "name")
	public void doAfterReturning(String name) {
		//System.out.println("后置通知:" + name);
	}

	@AfterThrowing("anyMethod()")
	public void doAfterThrowing() {
		//System.out.println("例外通知");
	}

	@After("anyMethod()  && args(object)" )
	public void doAfter(Object object) {
		//System.out.println("最终通知"+object);
	}

	@Around("anyMethod()")
	public Object doAround(ProceedingJoinPoint pjp) throws Throwable { // 要执行pip.proceed方法
		
		// 调用方法名称
		  String methodName = pjp.getSignature().getName();
		//获取进入的类名
		  String className = pjp.getSignature().getDeclaringTypeName();
		  className = className.substring(className.lastIndexOf(".") + 1).trim();
		 
		 if(className.equals("SysLogServiceImpl")||className.equals("TotalMsgServiceImpl")||className.equals("TotalUserServiceImpl")||className.equals("MessageServiceImpl")){  //如果是日志的就不用
			 return pjp.proceed();
		 }
		  // 调用参数
		  Object[] args = pjp.getArgs();
		  Object object = null;
		 // System.out.println("==============进去的方法"+methodName);
		  if(Pattern.matches("(add|update|delete)[\\S]*",
				  methodName)) {
			  
			  String logMsg="";//日志消息内容
			   
			  	Tuser user=(Tuser) ContextHolderUtils.getSession().getAttribute("USER_SESSION");//获取用户名
				SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				String time=sdf.format(new Date());//获取当前时间
				
				//System.out.println("进入的类名"+className);
				
			 JSONObject msg = new JSONObject();
			  for (Object temp : args) {
				  Class<? extends Object> paramClazz = temp.getClass();
				     String classType = paramClazz.getName();
				     if (classType.equals("java.lang.String")) {
				      msg.put("key", temp);
				     } else if (classType.equals("java.util.HashMap")) {
				      msg.putAll((HashMap<?, ?>) temp);
				     } else if (classType.startsWith("com.")) {
				      try {
				       Field[] f = paramClazz.getDeclaredFields();
				       for (Field field : f) {
				        String fieldName = field.getName();
				        field.setAccessible(true);
				        msg.put(fieldName, field.get(temp));
				       }
				      } catch (SecurityException e) {
				       e.printStackTrace();
				      } catch (IllegalArgumentException e) {
				       e.printStackTrace();
				      }
				     }
			  }
			  //用户管理
			  if(className.equals("UserServiceImpl")){	
					if(user!=null){
						logMsg="用户名:"+user.getCname()+"-在-"+"操作用户";
					}else{
						logMsg="";
					}
					JSONObject msg1 = new JSONObject();//保存在JSON中然后添加进去
					if(methodName.equals("update")){	//修改之前获取原来的数据
						User u=new User();
						u.setCid(msg.getString("cid").toString());//获取删除的主键
						Tuser lastUser=userService.get(u);
						msg1.put("user", lastUser);		
						logMsg=logMsg+"-进入修改!修改前数据为:"+msg1+"****************修改后数据为:"+msg;
					}else if(methodName.equals("delete")){
						User u=new User();
						u.setCid(msg.getString("key").toString());//获取删除的主键
						Tuser lastUser=userService.get(u);
						msg1.put("user", lastUser);
						logMsg=logMsg+"-进入删除操作值为:"+msg1;
					}
					
				}
			  //反馈管理
			  else if(className.equals("FeedbackInfoServiceImpl")){
					logMsg=user.getCname()+"-在-"+"操作反馈信息";
					JSONObject msg1 = new JSONObject();//保存在JSON中然后添加进去
					if(methodName.equals("update")){		//进入修改界面						
						FeedbackInfoPage f=new FeedbackInfoPage();
						//System.out.println("反馈信息"+msg);
						f.setFeedbackId(msg.getString("feedbackId"));
						FeedbackInfo lastFeebackInfo=feedbackInfoService.get(f);					
						msg1.put("feebackInfo", lastFeebackInfo);
					}else if(methodName.equals("delete")){
						FeedbackInfoPage f=new FeedbackInfoPage();
						//System.out.println("反馈信息"+msg);
						f.setFeedbackId(msg.getString("key"));
						FeedbackInfo lastFeebackInfo=feedbackInfoService.get(f);					
						msg1.put("feebackInfo", lastFeebackInfo);
					}
					if(methodName.equals("update")){
						logMsg=logMsg+"-进入修改!修改前数据为:"+msg1+"****************修改后数据为:"+msg;
					}else if(methodName.equals("delete")){
						logMsg=logMsg+"-进入删除操作值为:"+msg1;
					}					
				}
			  //用户建议管理
			  else if(className.equals("UserSuggestServiceImpl")){
					logMsg=user.getCname()+"-在-"+"操作用户建议";
					JSONObject msg1 = new JSONObject();//保存在JSON中然后添加进去
					if(methodName.equals("delete")){
						UserSuggestPage suggest=new UserSuggestPage();
						//System.out.println("用户建议"+msg);
						suggest.setSuggestId(msg.getString("key"));
						UserSuggest lastSuggest=userSuggestService.get(suggest);
						msg1.put("suggest", lastSuggest);
						logMsg=logMsg+"-进入删除操作值为:"+msg1;
					}					
					
				}
			  //店家管理
			  else if(className.equals("SnackCollectServiceImpl")){
					logMsg=user.getCname()+"-在-"+"操作商店";
					JSONObject msg1 = new JSONObject();//保存在JSON中然后添加进去
					if(methodName.equals("update")){
						SnackCollectPage snackCollect=new SnackCollectPage();
						//System.out.println("店家管理"+msg);
						snackCollect.setSnackCollectId(msg.getString("snackCollectId"));
						SnackCollect lastSnack=snackCollectService.get(snackCollect);
						msg1.put("snack", lastSnack);
						logMsg=logMsg+"-进入修改!修改前数据为:"+msg1+"****************修改后数据为:"+msg;
						//System.out.println("店家管理修改后的数据"+logMsg);
					}else if(methodName.equals("delete")){
						SnackCollectPage snackCollect=new SnackCollectPage();
						//System.out.println("店家管理"+msg);
						snackCollect.setSnackCollectId(msg.getString("key"));
						SnackCollect lastSnack=snackCollectService.get(snackCollect);
						msg1.put("snack", lastSnack);
						logMsg=logMsg+"-进入删除操作值为:"+msg1;
					}						
				}
				if(methodName.equals("add")){			//进入获取添加方法
					logMsg=logMsg+"-进入添加操作值为:"+msg;
				}
			  			  
			  SysLog log=new SysLog();
			  log.setLogId(UUID.randomUUID().toString());
			  log.setLogMsg(logMsg);
			  log.setLogTime(time);
			  logServiceI.add(log);
		  }
		return pjp.proceed();
	}

}