spring AOP 为系统增加操作日志
来源:互联网 发布:勇士队球员得分数据 编辑:程序博客网 时间:2024/06/11 15:45
spring AOP 为系统增加操作日志
方法一:
1. 实现操作日志的类
package com.huaxia.log.interceptor;import java.lang.reflect.Method;import java.util.Date;import javax.servlet.http.HttpServletRequest;import org.apache.commons.lang.StringUtils;import org.apache.log4j.Logger;import org.springframework.aop.MethodBeforeAdvice;import com.huaxia.auth.domain.UserAccount;import com.huaxia.base.service.UserAccountService;import com.huaxia.log.domain.LogNameConfig;import com.huaxia.log.domain.OperateLog;import com.huaxia.log.service.OperateLogService;public class LoggerBefore implements MethodBeforeAdvice {/** * Logger for this class */private static final Logger logger = Logger.getLogger(LoggerBefore.class);/** * OperateLogService */private OperateLogService logService;/** * userAccountService */private UserAccountService userAccountService;/** * @param method * @param objects * @param o * @throws Throwable */public void before(Method method, Object[] objects, Object o)throws Throwable {UserAccount curUser = null;String methodName = "execute";String userIp = null;String sessionId = null;String clazzName = o.getClass().getSimpleName();for (Object obj : objects) {if (null == obj) {continue;}if (obj instanceof HttpServletRequest) {HttpServletRequest request = (HttpServletRequest) obj;if ("LoginAction".equals(clazzName)) {curUser = userAccountService.getUserAccountByUserid(request.getParameter("userID"));} else {curUser = (UserAccount) request.getSession().getAttribute("HUAXIA_CURRENT_USER");}sessionId = request.getSession().getId();if (StringUtils.isNotEmpty(request.getParameter("method"))) {methodName = request.getParameter("method");}userIp = request.getRemoteAddr();break;}}if (null == curUser) {logger.info("can not get session user.");logger.info("logging before:" + o.getClass().getSimpleName()+ methodName);return;}LogNameConfig logCfg = this.logService.getLogNameConfig(clazzName,methodName);if (null != logCfg) {if ("1".equals(logCfg.getLogFlag())) {OperateLog log = new OperateLog();log.setUserId(curUser.getUserID());log.setUserName(curUser.getUserName());log.setOperateTime(new Date());log.setClassName(clazzName);log.setOperateMethod(methodName);log.setUserIp(userIp);log.setSessionId(sessionId);String operateName = logCfg.getOperateCnName();if (null != operateName) {log.setOperateCnName(operateName);}logService.addLog(log);logger.info("userId:" + log.getUserId() + ",userIp:"+ log.getUserIp() + ",className:" + log.getClassName()+ ",operateMethod:" + log.getOperateMethod()+ ",operateTime:" + log.getOperateTime());}}}/** * @param pLogService * the logService to set */public void setLogService(OperateLogService pLogService) {logService = pLogService;}public void setUserAccountService(UserAccountService userAccountService) {this.userAccountService = userAccountService;}}2.配置spring.xml文件
<bean name="logger" class="com.huaxia.log.interceptor.LoggerBefore"><property name="logService" ref="logService" /><property name="userAccountService" ref="userAccountService" /></bean><bean name="loggerAutoProxy"class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"><property name="beanNames"><list><value>/*</value></list></property><property name="interceptorNames"><list><value>logger</value></list></property></bean>
方法二:采用注解的方式
1.生成自定义注解
package com.huaxia.traffic.app.common.log;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target({ ElementType.PARAMETER, ElementType.METHOD })@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface SystemControllerLog { String description() default "";}
2.spring AOP 拦截切入点
package com.huaxia.traffic.app.common.log;import java.lang.reflect.Method;import java.util.Date;import org.apache.log4j.Logger;import org.apache.shiro.SecurityUtils;import org.apache.shiro.subject.Subject;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.aspectj.lang.annotation.Pointcut;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import com.huaxia.traffic.app.common.domain.OperateLog;import com.huaxia.traffic.app.common.log.service.OperateLogService;import com.huaxia.traffic.app.enterprise.domain.EnterpriseOperator;import com.huaxia.traffic.app.enterprise.domain.EnterpriseOperatorLogin;@Component@Aspectpublic class LoggerBefore { /** * Logger for this class */ private static final Logger logger = Logger.getLogger(LoggerBefore.class); /** * OperateLogService */ @Autowired private OperateLogService logService; @Pointcut("@annotation(com.huaxia.traffic.app.common.log.SystemControllerLog)") public void controllerAspect() { } @SuppressWarnings("rawtypes") public static String getControllerMethodDescription(JoinPoint joinPoint) throws Exception { 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 description = ""; for (Method method : methods) { if (method.getName().equals(methodName)) { Class[] clazzs = method.getParameterTypes(); if (clazzs.length == arguments.length) { description = method.getAnnotation(SystemControllerLog.class).description(); break; } } } return description; } /** * @param method * @param objects * @param o * @throws Throwable */ @After("controllerAspect()") public void before(JoinPoint joinPoint) throws Throwable { EnterpriseOperator curUser = null; String userIp = null; String sessionId = null; String clazzName = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); Object[] objects = joinPoint.getArgs(); Class targetClass = Class.forName(clazzName); Method[] methods = targetClass.getMethods(); String description = ""; for (Method method : methods) { if (method.getName().equals(methodName)) { Class[] clazzs = method.getParameterTypes(); if (clazzs.length == objects.length) { description = method.getAnnotation(SystemControllerLog.class).description(); break; } } } logger.info("clazzName=" + clazzName + ",method=" + methodName + ",args=" + objects); Subject subject = SecurityUtils.getSubject(); userIp=subject.getSession().getHost(); sessionId=subject.getSession().getId().toString(); Object user = subject.getPrincipal(); logger.info(user); if (user instanceof EnterpriseOperator) { curUser = (EnterpriseOperator) user; OperateLog log = new OperateLog(); log.setUserId(String.valueOf(curUser.getId())); log.setUserName(curUser.getUsername()); log.setOperateTime(new Date()); log.setClassName(clazzName); log.setOperateMethod(methodName); log.setUserIp(userIp); log.setSessionId(sessionId); log.setOperateCnName(description); logService.addLog(log); } }}
3.自定义注解用法
@ResponseBody @RequestMapping(value = "/logout") @SystemControllerLog(description="登出") public ReturnBean logout(HttpServletRequest request) { Subject currentUser = SecurityUtils.getSubject(); EnterpriseOperator user = (EnterpriseOperator) currentUser.getPrincipal(); LOGGER.info(ToStringBuilder.reflectionToString(user)); enterpriseOperatorLoginService.invalidToken(user); if (currentUser.isAuthenticated()) { currentUser.logout(); //session.invalidate(); } ReturnBean bean = new ReturnBean(); bean.setSuccess(ReturnBean.SUCCESS); bean.setData(null); bean.setMessage("注销用户成功"); return bean; }
方法二 可以自己给方法取名字比方法一好用
0 0
- spring AOP 为系统增加操作日志
- 利用Spring AOP与action注解为系统增加日志功能
- Spring AOP 实现系统操作日志记录
- Spring AOP 实现系统操作日志记录
- springMVC +Mybatis +spring aop 实现用户系统操作日志记录
- 为应用程序增加日志操作
- Spring AOP记录系统日志
- Spring AOP 系统日志记录
- Spring -aop 实现系统日志
- Spring AOP 系统日志记录
- spring AOP的 操作日志记录功能
- spring的AOP实现记录操作日志
- Spring aop切面做日志处理操作
- Spring AOP 自定义注解记录操作日志
- Spring的AOP实现日志管理操作
- spring aop 实现操作日志记录
- Spring AOP解决系统日志备忘
- Spring AOP实现系统日志记录
- Android MVVM Architecture
- andriod 断点下载
- c语言中,结构体做参数调用例子结构体形参例子
- 巴爷微信商城
- C#语言编写代码逻辑
- spring AOP 为系统增加操作日志
- https-ssl-nginx-apache-httpd-tomat申请ssl证书小结
- Emacs v25.1 win7 卡顿
- 电话相关操作
- CRC校验原理及查表码表由来
- C# 访问修饰符(知识要点归纳总结)
- 2016年终总结
- 数列还原
- 图灵机