<!-- Spring 整合 Hibernate --> <filter> <filter-name>hibernateFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> <init-param> <param-name>singleSession</param-name> <param-value>true</param-value> <param-name> flushMode </param-name> <param-value>AUTO </param-value> </init-param> </filter>
1.部署切面
applicationContext.xml
<!-- 定义事务属性 --> <aop:config proxy-target-class="true"> <aop:advisor pointcut="execution(java.lang.String com.sunwin.*.service.*.*(..))" advice-ref="txAdvice" order="1" /> <!-- 定义操作日志切入点(Service包下的所有类的以sav,upd,del开头的方法) --> <aop:aspect id="logAspect" ref="logInterceptor" order="2"> <aop:pointcut id="logPointcut" expression="execution(* com.sunwin.*.service.*.sav*(..)) || execution(* com.sunwin.*.service.*.del*(..))|| execution(* com.sunwin.*.service.*.upd*(..))" /> <aop:after pointcut-ref="logPointcut" method="serviceIntercept" /> </aop:aspect> </aop:config> <!-- 用户操作日志拦截器类 --> <bean id="logInterceptor" class="com.sunwin.interceptor.EventLogInterceptor"> <property name="baseService" ref="baseService"></property> <property name="userAction" ref="userAction"></property> </bean>
2.创建日志拦截器类
/** * 拦截操作日志类 * @param point * @return * @throws Throwable */ public Object serviceIntercept(JoinPoint point) throws Throwable{ //获取操作方法名称 String methodName = point.getSignature().getName(); //获取方法参数 Object[] args =point.getArgs(); //操作日志信息 String logUserId=null; String logUserName=null; String bizType1=GlobalConstants.OPERATE; if (methodName.startsWith("sav")) { logUserId=(String) userAction.getSession().get(SessionConstants.LOGIN_USER_ID); logUserName=(String) userAction.getSession().get(SessionConstants.LOGIN_USER_NAME); userAction.setLogType(GlobalConstants.CREATE); //保存操作日志 this.baseService.saveLog(args[0], userAction.getIpAddr(), logUserId, logUserName, userAction.getLogType(), bizType1); } else if(methodName.startsWith("upd")) { logUserId=(String) userAction.getSession().get(SessionConstants.LOGIN_USER_ID); logUserName=(String) userAction.getSession().get(SessionConstants.LOGIN_USER_NAME); userAction.setLogType(GlobalConstants.UPDATE); //保存操作日志 this.baseService.saveLog(args[0], userAction.getIpAddr(), logUserId, logUserName, userAction.getLogType(), bizType1); } else if(methodName.startsWith("del")) { logUserId=(String) userAction.getSession().get(SessionConstants.LOGIN_USER_ID); logUserName=(String) userAction.getSession().get(SessionConstants.LOGIN_USER_NAME); userAction.setLogType(GlobalConstants.DELETE); //保存操作日志 this.baseService.saveLog(args[0], userAction.getIpAddr(), logUserId, logUserName, userAction.getLogType(), bizType1); } return null; }
3.反射方法智能解析pojo对象(或对象列表)中定义的表名anotation:table_id、主键值(包括联合主键,逗号分隔)
/** * 保存操作日志 * * @param obj * @param logIp * @param logUserId * @param logUserName * @param logType * @param bizType1 */ public void saveLog(Object obj, String logIp, String logUserId, String logUserName, String logType, String bizType1) { try { // 初始化log表 CahsmsLog log = new CahsmsLog(); if (null != obj) // 业务操作 { Object logRecordPk = "";//主键值 if (obj instanceof List) { List logList = new ArrayList<CahsmsLog>(); List list = (List) obj; // 获取物理表名 AbstractEntityPersister classMetadata = (SingleTableEntityPersister) this.logDao .getSessionFactory().getClassMetadata( list.get(0).getClass()); for (int i = 0; i < list.size(); i++) { log=new CahsmsLog(); if (classMetadata != null) { String logTable = classMetadata.getTableName(); log.setLogTable(logTable); } // 获取主键值 logRecordPk = this.logDao.getSessionFactory() .getCurrentSession().getIdentifier(list.get(i)); if(logRecordPk instanceof String )//非联合主键 { log.setLogRecordPk((String)logRecordPk); } else//联合主键 { Field[] field = logRecordPk.getClass().getDeclaredFields(); String logRecordPkValue="";//主键值 for(int j=0;j<field.length;j++) { String attributeName = field[j].getName(); //获取属性的名字 String methodName=attributeName.substring(0, 1).toUpperCase() + attributeName.substring(1); Method m = logRecordPk.getClass().getMethod("get"+methodName); String attributeValue = (String) m.invoke(logRecordPk); //调用getter方法获取属性值 logRecordPkValue+=attributeName+":"+attributeValue; if(j<field.length-1) { logRecordPkValue+=","; } } log.setLogRecordPk(logRecordPkValue); } log.setLogId(DataTypeUtil .getDateTimeStemp(GlobalConstants.PREFIX_LOG )+ i);// 日志id log.setLogDate(new Date(new Date().getTime()));// 获取操作时间 log.setLogUserId(logUserId);// 登陆用户id log.setLogUserName(logUserName);// 登陆用户姓名 log.setLogIp(logIp);// ip地址 log.setLogType(logType);// 操作类型(C:Create;R: // Read;U:Update;D:Delete) log.setBizType1(bizType1);// 业务大类(1:登陆;2:业务操作;3:退出) logList.add(log); } this.logDao.getHibernateTemplate().getSessionFactory() .getCurrentSession().setFlushMode(FlushMode.AUTO); this.logDao.saveList(logList); this.logDao.getHibernateTemplate().getSessionFactory() .getCurrentSession().flush(); } else { // 获取物理表名 AbstractEntityPersister classMetadata = (SingleTableEntityPersister) this.logDao .getSessionFactory().getClassMetadata( obj.getClass()); if (classMetadata != null) { String logTable = classMetadata.getTableName(); log.setLogTable(logTable); } // 获取主键值 logRecordPk = this.logDao.getSessionFactory() .getCurrentSession().getIdentifier(obj); if(logRecordPk instanceof String )//非联合主键 { log.setLogRecordPk((String)logRecordPk); } else//联合主键 { Field[] field = logRecordPk.getClass().getDeclaredFields(); String logRecordPkValue="";//主键值 for(int j=0;j<field.length;j++) { String attributeName = field[j].getName(); //获取属性的名字 String methodName=attributeName.substring(0, 1).toUpperCase() + attributeName.substring(1);//设置属性值的方法名 Method m = logRecordPk.getClass().getMethod("get"+methodName); String attributeValue = (String) m.invoke(logRecordPk); //调用getter方法获取属性值 logRecordPkValue+=attributeName+":"+attributeValue; if(j<field.length-1) { logRecordPkValue+=","; } } log.setLogRecordPk(logRecordPkValue); } log.setLogId(DataTypeUtil .getDateTimeStemp(GlobalConstants.PREFIX_LOG));// 日志id log.setLogDate(new Date(new Date().getTime()));// 获取操作时间 log.setLogUserId(logUserId);// 登陆用户id log.setLogUserName(logUserName);// 登陆用户姓名 log.setLogIp(logIp);// ip地址 log.setLogType(logType);// 操作类型(C:Create;R: // Read;U:Update;D:Delete) log.setBizType1(bizType1);// 业务大类(1:登陆;2:业务操作;3:退出) this.logDao.getHibernateTemplate().getSessionFactory() .getCurrentSession().setFlushMode(FlushMode.AUTO); this.logDao.save(log); this.logDao.getHibernateTemplate().getSessionFactory() .getCurrentSession().flush(); } } else//登录和退出操作 { log.setLogId(DataTypeUtil .getDateTimeStemp(GlobalConstants.PREFIX_LOG));// 日志id log.setLogDate(new Date(new Date().getTime()));// 获取操作时间 log.setLogUserId(logUserId);// 登陆用户id log.setLogUserName(logUserName);// 登陆用户姓名 log.setLogIp(logIp);// ip地址 log.setLogType(logType);// 操作类型(C:Create;R: // Read;U:Update;D:Delete) log.setBizType1(bizType1);// 业务大类(1:登陆;2:业务操作;3:退出) this.logDao.getHibernateTemplate().getSessionFactory() .getCurrentSession().setFlushMode(FlushMode.AUTO); this.logDao.save(log); this.logDao.getHibernateTemplate().getSessionFactory() .getCurrentSession().flush(); } } catch (Exception e) { e.printStackTrace(); } }