首页 > 学院 > 开发设计 > 正文

spring aop开发日志管理

2019-11-08 18:24:19
字体:
来源:转载
供稿:网友

aop是sPRing框架的两大核心之一,即面向切面编程,它是对oo编程的补充。那么spring aop在实际项目开发中有什么作用呢?它最大的作用就是完成日志记录,一个简单的例子,你在ATM上取款系统是会记录下来一些信息的,比如取款时间、银行卡号、ATM位置、等等。不管是一般还是不一般的项目,应该来说,只要是敏感的数据,只要用户对它进行操作了,牵扯到数据库了,系统都应该以日志的形式记录下来。有日志记录功能,当用户对数据进行“非法”操作的时候,spring aop会很容易帮你找到当事人。

使用spring aop开发日志管理相当常见,现在几乎可以说每个业务系统都需要有日志管理模块,有的叫审计,间接地和安全挂上了钩。 1、定义Log实体

import java.util.Date;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name = "SYS_LOG")public class Log { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", unique = true, nullable = false) private Integer id; /** * 操作账户 * */ @Column(name = "USERUID") private String useruid; /** * 操作用户名称 * */ @Column(name = "USERNAME") private String username; /** * 操作位置 * */ @Column(name = "OPPOSIT") private String opposit; /** * 操作内容 * */ @Column(name = "OPCONT") private String opcont; /** * 操作时间 * */ @Column(name = "CREATETIME") private Date createtime; //setters and getters}

2、自定义注解AnnotationLog

import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documented@Inheritedpublic @interface AnnotationLog { /** * 功能说明:日志名 * @return */ String name() default ""; /** * 功能说明:日志描述 * @return */ String description() default "";}

其中@Target等4个注解的作用

这里写图片描述

3、实现AOPLog

import java.lang.reflect.Method;import java.util.HashMap;import java.util.Map;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.reflect.MethodSignature;import org.springframework.beans.factory.annotation.Autowired;import com.onenzg.common.hibernate.HibernateDAO;import com.onezg.common.log.domain.Log;import com.onezg.common.log.service.LogService;import com.onezg.sys.usermanage.domain.UserInfo;import com.onezg.sys.usermanage.services.UserServices;public class AopLog extends HibernateDAO<Log> { /** * 引入LogService */ @Autowired private LogService logservice; @Autowired private UserServices userServices; /** * 功能说明:输出log信息 */ public void writeLogInfo(JoinPoint point) throws Throwable { Method method = ((MethodSignature) point.getSignature()).getMethod(); AnnotationLog ann = method.getAnnotation(AnnotationLog.class); if (ann != null) { UserInfo cui = userServices.getCurrentUser(); if (null != cui) { Map<String, Object> map = new HashMap<String, Object>(); map.put("uid", cui.getuId()); map.put("givenName", cui.getuName()); logservice.insertLog(ann.name(), ann.description(), map); } } }}

4、LogDAO和LogDAOImpl

import java.util.Map;public interface LogDao { /** * 功能说明:AOP保存日志信息 * @param strLocation 参数 * @param strContent 参数 * @param userInfo 要保存的信息集合 */ void insertLog(String strLocation, String strContent, @SuppressWarnings("rawtypes") Map userInfo);}import java.util.Date;import java.util.Map;import org.springframework.stereotype.Repository;import com.onezg.common.exception.DatabaseException;import com.onezg.common.hibernate.HibernateDAO;import com.onezg.common.log.dao.LogDao;import com.onezg.common.log.domain.Log;@Repository(value = "logdao")public class LogDaoImpl extends HibernateDAO<Log> implements LogDao { @SuppressWarnings("rawtypes") @Override public void insertLog(String strLocation, String strContent, Map userInfo) { //useruid String useruid = String.valueOf(userInfo.get("uid")); //username, 操作账户. String userName = String.valueOf(userInfo.get("givenName")); //opposit, 操作位置. String opposit = strLocation; //opcont, 操作内容. String opcont = strContent; try { Log log = new Log(); //bean对象 //封装bean数据处理 log.setUseruid(useruid); log.setUsername(userName); log.setOpposit(opposit); log.setOpcont(opcont); log.setCreatetime(new Date()); //保存对象 this.save(log); } catch (Exception ex) { throw new DatabaseException("插入登录日志失败", ex.getMessage()); } }}

5、配置文件写spring aop配置,本人例子是在Spring-context.xml里写配置

<!-- Aop配置——开始 --> <aop:config proxy-target-class="true"> <aop:aspect id="goLogAspect" ref="AfterReturningAdvice"> <aop:pointcut id="actionPointcut" expression="within(com.onezg..*)" /> <aop:before pointcut-ref="actionPointcut" method="writeLogInfo" /> </aop:aspect> </aop:config> <beans:bean id="AfterReturningAdvice" class="com.onezg.common.aop.AopLog"></beans:bean> <!-- Aop配置——结束 -->

6、使用注解

@AnnotationLog(name = "用户管理", description = "修改用户") @RequestMapping(value = "/userupdate") public void getUserUpdate(Httpsession session, HttpServletRequest request, HttpServletResponse response, Model model, UserInfoDTO dto) { try { userServices.updateUser(dto); } catch (Exception e) { throw new ParameterException("用户修改失败", e.getMessage()); } }

到这里,使用spring aop完成日志记录就结束了。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表