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


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

    在数据库中建立一张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();
    	}
    
    }
    



  • 相关阅读:
    Eclipse新建工程编译R cannot be resolved to a variable问题
    Eclipse如何生成jar包
    Springmvc+Shiro实战
    封装springmvc处理ajax请求结果
    jquery操作cookie
    探讨jsp相对路径和绝对路径
    spring集成quartz
    Spring-Task
    bootstrap table分页(前后端两种方式实现)
    jquery file upload示例
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3174407.html
Copyright © 2020-2023  润新知