亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

aop注解方式實現全局日志管理方法

2024-07-13 10:17:07
字體:
來源:轉載
供稿:網友

1:日志實體類

public class SysLog { /** */ private Integer id; /** 日志描述*/ private String description; /** 執行的方法*/ private String method; /** 日志類型 0:操作日志;1:異常日志*/ private Integer logType; /** 客戶端請求的ip地址*/ private String requestIp; /** 異常代碼*/ private String exceptionCode; /** 異常詳細信息*/ private String exceptionDetail; /** 請求參數*/ private String params; /** 操作人*/ private String createBy; /** 操作時間*/ private String createDate; public Integer getId() {  return id; } public void setId(Integer id) {  this.id = id; } public String getDescription() {  return description; } public void setDescription(String description) {  this.description = description; } public String getMethod() {  return method; } public void setMethod(String method) {  this.method = method; } public Integer getLogType() {  return logType; } public void setLogType(Integer logType) {  this.logType = logType; } public String getRequestIp() {  return requestIp; } public void setRequestIp(String requestIp) {  this.requestIp = requestIp; } public String getExceptionCode() {  return exceptionCode; } public void setExceptionCode(String exceptionCode) {  this.exceptionCode = exceptionCode; } public String getExceptionDetail() {  return exceptionDetail; } public void setExceptionDetail(String exceptionDetail) {  this.exceptionDetail = exceptionDetail; } public String getParams() {  return params; } public void setParams(String params) {  this.params = params; } public String getCreateBy() {  return createBy; } public void setCreateBy(String createBy) {  this.createBy = createBy; } public String getCreateDate() {  return createDate; } public void setCreateDate(String createDate) {  this.createDate = createDate; }}

2:maven需要的jar

<dependency>    <groupId>org.aspectj</groupId>    <artifactId>aspectjrt</artifactId>    <version>1.7.4</version>   </dependency>  <dependency>    <groupId>org.aspectj</groupId>    <artifactId>aspectjweaver</artifactId>    <version>1.7.4</version>  </dependency> <dependency>    <groupId>cglib</groupId>    <artifactId>cglib</artifactId>    <version>2.1_3</version>  </dependency><dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-aop</artifactId>  <version>4.2.5.RELEASE</version></dependency> 

這里要求項目使用的是jdk1.7

3:springServlet-mvc.xml

<!--proxy-target-class="true"強制使用cglib代理 如果為false則spring會自動選擇--> <aop:aspectj-autoproxy proxy-target-class="true"/> 

加上proxy-target-class="true"是為了可以攔截controller里面的方法

4:定義切面,我這里主要寫前置通知和異常通知

下面開始自定義注解

import java.lang.annotation.*;@Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Log {	/** 要執行的操作類型比如:add操作 **/ 	 public String operationType() default ""; 	 /** 要執行的具體操作比如:添加用戶 **/ 	 public String operationName() default "";}

切面類

import java.lang.reflect.Method;import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Date;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import org.aspectj.lang.JoinPoint;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.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import com.gtcity.user.model.SysLog;import com.gtcity.user.model.SysUser;import com.gtcity.user.service.SysLogService;/** * @author panliang * @version 創建時間:2017-3-31  * @desc 切點類  * */@Aspect@Componentpublic class SystemLogAspect {	//注入Service用于把日志保存數據庫 	@Resource 	private SysLogService systemLogService;	private static final Logger logger = LoggerFactory.getLogger(SystemLogAspect. class); 		//Controller層切點 	//第一個*代表所有的返回值類型	//第二個*代表所有的類	//第三個*代表類所有方法	//最后一個..代表所有的參數。	 @Pointcut("execution (* com.gtcity.web.controller..*.*(..))") 	 public void controllerAspect() { 	 } 	 	 /**	 * 	 * @author: panliang	 * @time:2017-3-31 下午2:22:16	 * @param joinPoint 切點	 * @describtion:前置通知 用于攔截Controller層記錄用戶的操作 	 */	 @Before("controllerAspect()")	 public void doBefore(JoinPoint joinPoint) {		/* System.out.println("==========執行controller前置通知===============");		 if(logger.isInfoEnabled()){			 logger.info("before " + joinPoint);		 }*/		 		 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();    HttpSession session = request.getSession();    //讀取session中的用戶    SysUser user = (SysUser) session.getAttribute("user");    if(user==null){  	 user=new SysUser();  	 user.setUserName("非注冊用戶");   }   //請求的IP    String ip = request.getRemoteAddr();   try {         String targetName = joinPoint.getTarget().getClass().getName();     String methodName = joinPoint.getSignature().getName();     Object[] arguments = joinPoint.getArgs();     Class targetClass = Class.forName(targetName);     Method[] methods = targetClass.getMethods();    String operationType = "";    String operationName = "";    for (Method method : methods) {      if (method.getName().equals(methodName)) {       Class[] clazzs = method.getParameterTypes();       if (clazzs.length == arguments.length) {        operationType = method.getAnnotation(Log.class).operationType();       operationName = method.getAnnotation(Log.class).operationName();       break;       }      }     }    //*========控制臺輸出=========*//     System.out.println("=====controller前置通知開始=====");     System.out.println("請求方法:" + (joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()")+"."+operationType);     System.out.println("方法描述:" + operationName);     System.out.println("請求人:" + user.getUserName());     System.out.println("請求IP:" + ip);     //*========數據庫日志=========*//     SysLog log = new SysLog();     log.setDescription(operationName);     log.setMethod((joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()")+"."+operationType);     log.setLogType(0);     log.setRequestIp(ip);     log.setExceptionCode(null);     log.setExceptionDetail( null);     log.setParams( null);     log.setCreateBy(user.getUserName());    log.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));     log.setRequestIp(ip);    //保存數據庫     systemLogService.insert(log);     System.out.println("=====controller前置通知結束=====");    } catch (Exception e) {     //記錄本地異常日志     logger.error("==前置通知異常==");     logger.error("異常信息:{}", e.getMessage());    } 		 		 	 } 	 	    /**	 * 	 * @author: panliang	 * @time:2017-3-31 下午2:24:36	 * @param joinPoint 切點 	 * @describtion:異常通知 用于攔截記錄異常日志 	 */  @AfterThrowing(pointcut = "controllerAspect()", throwing="e")   public void doAfterThrowing(JoinPoint joinPoint, Throwable e) {  	  	 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();    HttpSession session = request.getSession();    //讀取session中的用戶    SysUser user = (SysUser) session.getAttribute("user");    if(user==null){   	 user=new SysUser();   	 user.setUserName("非注冊用戶");   }   //請求的IP    String ip = request.getRemoteAddr();      String params = "";    if (joinPoint.getArgs() != null && joinPoint.getArgs().length > 0) {      	 params=Arrays.toString(joinPoint.getArgs());   }    try {         String targetName = joinPoint.getTarget().getClass().getName();     String methodName = joinPoint.getSignature().getName();     Object[] arguments = joinPoint.getArgs();     Class targetClass = Class.forName(targetName);     Method[] methods = targetClass.getMethods();    String operationType = "";    String operationName = "";    for (Method method : methods) {      if (method.getName().equals(methodName)) {       Class[] clazzs = method.getParameterTypes();       if (clazzs.length == arguments.length) {        operationType = method.getAnnotation(Log.class).operationType();       operationName = method.getAnnotation(Log.class).operationName();       break;       }      }     }    /*========控制臺輸出=========*/     System.out.println("=====異常通知開始=====");     System.out.println("異常代碼:" + e.getClass().getName());     System.out.println("異常信息:" + e.getMessage());     System.out.println("異常方法:" + (joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()")+"."+operationType);     System.out.println("方法描述:" + operationName);     System.out.println("請求人:" + user.getUserName());     System.out.println("請求IP:" + ip);     System.out.println("請求參數:" + params);     //==========數據庫日志=========     SysLog log = new SysLog();    log.setDescription(operationName);     log.setExceptionCode(e.getClass().getName());     log.setLogType(1);     log.setExceptionDetail(e.getMessage());     log.setMethod((joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()"));     log.setParams(params);     log.setCreateBy(user.getUserName());     log.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));     log.setRequestIp(ip);     //保存數據庫     systemLogService.insert(log);     System.out.println("=====異常通知結束=====");    } catch (Exception ex) {     //記錄本地異常日志     logger.error("==異常通知異常==");     logger.error("異常信息:{}", ex.getMessage());    }    //==========記錄本地異常日志==========    logger.error("異常方法:{}異常代碼:{}異常信息:{}參數:{}", joinPoint.getTarget().getClass().getName() + joinPoint.getSignature().getName(), e.getClass().getName(), e.getMessage(), params);    } 	 }

5:在controller里面

/**	 * 根據用戶名去找密碼 判斷用戶名和密碼是否正確	 * @author panliang	 * @param request	 * @param response	 * @throws IOException 	 */	@RequestMapping("/skipPage.do")	@Log(operationType="select操作:",operationName="用戶登錄")//注意:這個不加的話,這個方法的日志記錄不會被插入	public ModelAndView skipPage(HttpServletRequest request,HttpServletResponse response) throws IOException{				ModelAndView result=null;		String username = request.getParameter("email");		String password = request.getParameter("password");		int flag = sysUserService.login(request, username, password);		if(flag==1){//登錄成功			result=new ModelAndView("redirect:/login/dispacher_main.do");		}else if(flag==2){//用戶名不存在					result=new ModelAndView("redirect:/login/login.do?errorCode=1");					} else{//密碼不正確				result=new ModelAndView("redirect:/login/login.do?errorCode=2");					}		return result;	}

對于想要了解其他三種通知的可以參考這篇博文:點擊打開鏈接

這樣用戶在訪問后臺時,不管是正常訪問還是出現bug數據庫都有記錄

aop,注解,全局,日志管理

以上這篇aop注解方式實現全局日志管理方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人性生交大片免费看小说| 欧美在线视频观看免费网站| 日韩av网址在线| 久久精品电影网站| 2025国产精品视频| 性日韩欧美在线视频| 中文字幕av一区中文字幕天堂| 97在线观看视频| 97欧美精品一区二区三区| 在线观看91久久久久久| 日韩va亚洲va欧洲va国产| 欧美成人黄色小视频| 丝袜亚洲另类欧美重口| 懂色av一区二区三区| 欧美国产精品人人做人人爱| 欧美成aaa人片在线观看蜜臀| 亚洲亚裔videos黑人hd| 欧美日韩裸体免费视频| 久久国产一区二区三区| 日日噜噜噜夜夜爽亚洲精品| 国产不卡精品视男人的天堂| 欧美色另类天堂2015| 欧美超级乱淫片喷水| 黑人精品xxx一区一二区| 精品一区二区三区三区| 欧美一级片免费在线| 亚洲欧美日韩精品久久| 久久久女女女女999久久| 欧美影院久久久| 国产欧美日韩中文字幕| 久久久国产视频| 欧美高清不卡在线| 性欧美xxxx交| 欧美黑人性视频| 国产欧美日韩亚洲精品| 欧美在线视频播放| 久久av在线播放| 成人精品一区二区三区电影免费| 久久久久久午夜| 国产一区二区三区高清在线观看| 久久久亚洲精选| 97激碰免费视频| 日韩免费视频在线观看| 日本一区二区不卡| 欧美高清不卡在线| 欧美日韩亚洲国产一区| 欧美中文在线免费| 日本伊人精品一区二区三区介绍| 国内精品久久久久影院优| 97在线免费观看视频| 日本中文字幕久久看| 91九色视频在线| 国产成人精品最新| 亚洲第五色综合网| 日韩精品视频在线观看免费| 国产欧美日韩91| 欧美人交a欧美精品| 欧美成人国产va精品日本一级| 国产成人亚洲精品| 欧美肥老太性生活视频| 国产精品爽爽爽爽爽爽在线观看| 欧洲成人午夜免费大片| 国产精品久久久久久久7电影| 亚洲精品中文字幕女同| 亚洲高清一区二| 欧美福利视频在线观看| 8050国产精品久久久久久| 精品国产一区二区三区久久久| 91免费精品国偷自产在线| 亚洲欧美综合图区| 国产精品久久久| 性色av一区二区三区红粉影视| 国产精品第一页在线| 久久久久久国产精品美女| 97在线视频免费观看| 欧美体内谢she精2性欧美| 精品国产91乱高清在线观看| 国产91色在线免费| 色综合视频一区中文字幕| 中文字幕日韩欧美| 日韩电影中文字幕在线观看| 最近2019好看的中文字幕免费| 国产欧美精品日韩精品| 亚洲精品国产精品国自产观看浪潮| 久久久视频在线| xvideos国产精品| 91精品国产综合久久香蕉922| 91免费精品视频| 日韩欧美精品网站| 7777kkkk成人观看| 欧美日韩一区免费| 精品久久久91| 欧美精品福利视频| 亚洲一区二区福利| 久久精品这里热有精品| 日韩美女激情视频| 日韩久久免费电影| 中文字幕精品久久久久| 亚洲第一国产精品| 欧美激情视频在线| 91精品国产成人| 成人a在线视频| 久久久99久久精品女同性| 欧美有码在线视频| 亚洲美女精品久久| 美女少妇精品视频| 国产精品久在线观看| 欧美日韩精品在线| 欧美日韩中文字幕综合视频| 日韩免费观看视频| 久久人人爽人人爽人人片av高清| 欧美性jizz18性欧美| 亚洲国产精品va在线观看黑人| 欧洲日本亚洲国产区| 成人性生交大片免费看小说| 一本色道久久88综合日韩精品| 91社影院在线观看| 国产在线精品自拍| 91精品国产91久久久久福利| 日韩一区二区久久久| 国产精品观看在线亚洲人成网| 高清在线视频日韩欧美| 精品一区二区三区四区在线| 久久精品91久久香蕉加勒比| 亚洲午夜性刺激影院| 国外成人性视频| 欧美床上激情在线观看| 欧美日韩中文在线| 国产精品成人一区二区| 日韩av色在线| 日韩av最新在线| www.日韩av.com| 午夜精品视频在线| 欧美极品欧美精品欧美视频| 国产一区二区三区三区在线观看| 久久躁狠狠躁夜夜爽| 亚洲视频日韩精品| 国产福利视频一区二区| 精品成人av一区| 福利视频导航一区| 亚洲综合第一页| 欧美日韩人人澡狠狠躁视频| 精品国产自在精品国产浪潮| 国产精品久久久999| 国产一区二区三区在线观看视频| 在线观看欧美日韩国产| 亚洲黄页视频免费观看| 国产在线拍揄自揄视频不卡99| 狠狠躁夜夜躁人人爽天天天天97| 精品久久久久久久久久久| 欧美黑人巨大精品一区二区| 欧美精品一区在线播放| 日韩欧美999| 国内揄拍国内精品| 欧美疯狂做受xxxx高潮| 欧美丰满少妇xxxxx做受| 中文字幕欧美专区| 成人国产精品一区二区| 国产日韩中文字幕| 九九精品在线视频| 久久久av亚洲男天堂| 国产综合久久久久| 97国产在线视频| 91av网站在线播放|