`
edisonlv2010
  • 浏览: 43641 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

利用Hibernate 3 Interceptor生成审计日志

 
阅读更多
在实际应用中,有可能需要审计对数据库中重要数据的更新历史。如:每当发生向T_USER表中插入或更新记录的事件时,就向审计日志表插入一条记录。

对于此种业务场景,可以采用数据库的触发器来生成审计日志,这种方法较为简便,并且有很好的性能,但是不支持跨数据库平台,缺乏灵活性。因此我们可以采用Hibernate 3以后提供的拦截器来实现相应的功能。当Session执行save()、update()、saveOrUpdate()、delete()以及flush()方法时,就会调用拦截器的相关方法,然后在这些方法中实现审计日志的业务逻辑。

用户定义的拦截器必须实现org.hibernate.Interceptor接口,在这个接口中主要定义了以下方法。

onDelete():当Session删除一个对象之前调用此方法。
onFlushDirty():当Session的flush()方法检查到脏对象时调用此方法。
onSave():当Session保存一个对象之前调用本方法,如果在这个方法中修改了持久化对象的数据,就返回true,否则返回null。
postFlush():当Session的flush()方法执行完所有SQL语句后调用此方法。

在org.hibernate包中还提供了Interceptor接口的一个实现类EmptyInterceptor,这个类中的所有方法实际上什么也不做,用户自定义的拦截器类也可以扩展此类。

package com.jintoufs.common.hibernate;

import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Date;

import org.cosmos.core.orm.entity.AuditableEntity;
import org.hibernate.EmptyInterceptor;
import org.hibernate.type.Type;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class AuditInterceptor extends EmptyInterceptor {

	private static final long serialVersionUID = -7481545873785342485L;
	private static Logger logger = LoggerFactory.getLogger(AuditInterceptor.class);

	/**
	 *  拦截hibernate save方法(即保存对象之前回调此方法),添加审计信息
	 *  entity - POJO Instance
	 *  id - POJO OID
	 *  state - POJO Instance中每一个属性的值所组成的集合(OID属性除外)     
	 *  propertyNames - POJO Instance中每一个属性的属性名组成的集合(OID属性除外)    
	 *  types - POJO Instance中每一个属性所属类型所对应的Hibernate类型组成的集合(OID属性除外)
	 */
	@Override
	public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {

		String operUserStr = getCurrentUser();

		if (entity instanceof AuditableEntity) {
			for (int index = 0; index < propertyNames.length; index++) {
				if ("createTime".equals(propertyNames[index])) {
					state[index] = new Timestamp(new Date().getTime());
				}
				if ("createBy".equals(propertyNames[index])) {
					state[index] = getCurrentUser();
				}
			}
			logger.info("{}对象(ID:{}) 被 {} 在 {} 创建", new Object[] { entity.toString(), id, operUserStr, new Date() });
			return true;
		}
		return false;
	}

	/**
	 *  拦截hibernate flush方法(即检查到脏对象时回调此方法),添加审计信息
	 *  entity - POJO Instance
	 *  id - POJO OID
	 *  state - POJO Instance中每一个属性的值所组成的集合(OID属性除外)     
	 *  propertyNames - POJO Instance中每一个属性的属性名组成的集合(OID属性除外)    
	 *  types - POJO Instance中每一个属性所属类型所对应的Hibernate类型组成的集合(OID属性除外)
	 */
	public boolean onFlushDirty(Object entity, Serializable id, Object[] state, Object[] previousState,
			String[] propertyNames, Type[] types) {

		String operUserStr = getCurrentUser();

		if (entity instanceof AuditableEntity) {
			for (int index = 0; index < propertyNames.length; index++) {
				if ("lastModifyTime".equals(propertyNames[index])) {
					state[index] = new Timestamp(new Date().getTime());
				}
				if ("lastModifyBy".equals(propertyNames[index])) {
					state[index] = getCurrentUser();
				}
			}
			logger.info("{}对象(ID:{}) 被 {} 在 {} 修改", new Object[] { entity.toString(), id, operUserStr, new Date() });
			return true;
		}
		return false;
	}

	/**
	 * @description 得到当前的操作用户
	 * @return 
	 */
	private String getCurrentUser() {
		String loginName = "test_user";
		//String loginName = SpringSecurityUtils.getCurrentUserName();
		return loginName;
	}
}



applicationContext.xml
<!-- sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
......
<property name="entityInterceptor" ref="auditInterceptor"></property>
......
</bean>

<!-- hibernate审计拦截器 -->
<bean id="auditInterceptor" class="com.jintoufs.common.hibernate.AuditInterceptor" />


以上为Spring 3和Hibernate 4整合时的配置方式

将审计拦截器作为sessionFactory的属性进行配置,即表示此拦截器可以被所有Session实例共享。等同的代码表示方式为:Configuration.setInterceptor(Interceptor inter)。


分享到:
评论
1 楼 shnsvyu 2019-05-04  
  

相关推荐

    HibernateInterceptor.java

    Hibernate4,Interceptor,spring,quartz

    Spring2.5+Hibernate3整合

    2. **Hibernate 3 ORM**:利用 Hibernate,开发者可以将 Java 对象直接映射到数据库表,简化数据操作。它支持 Criteria 查询、HQL(Hibernate Query Language)以及 SQL 自定义查询。 3. **SessionFactory 和 ...

    利用反射和动态代理机制实现自定义拦截器Interceptor

    拦截器Interceptor是一种常见的设计模式,用于在方法调用前后执行某些操作,以实现日志记录、安全检查、性能监控等功能。下面我们将一步步地实现一个自定义的拦截器Interceptor。 一、准备工作 要实现自定义拦截器...

    Struts2 Spring3 Hibernate3 整合必须包(很完整)

    Struts2、Spring3和Hibernate3是Java Web开发中的三个重要框架,它们分别负责MVC模式中的表现层、业务层和服务层。这三个框架的整合能够实现高效、灵活且可维护的Web应用程序。以下是对这三个框架及其整合的详细知识...

    struts2+spring2+hibernate3注册查询搜索分页实例

    Struts2的拦截器(Interceptor)机制也在此发挥作用,可以添加验证、日志等通用功能。 其次,Spring2作为一款全面的后端管理框架,负责管理应用的组件,如Bean的生命周期和依赖注入。在本实例中,Spring2可以管理...

    struts2与hibernate3的完美整合

    2. **拦截器(Interceptor)**:拦截器是Struts2的一个强大特性,它可以插入到Action调用的流程中,实现如日志、权限检查等通用功能。 3. **结果类型(Result)**:Action执行后,根据配置返回不同的结果类型,如...

    struts2-hibernate3-spring整合需要的全部jar包

    Struts2、Hibernate3和Spring是Java开发中常用的三大框架,它们各自负责不同的职责:Struts2用于控制应用程序的流程,Hibernate3则是优秀的对象关系映射(ORM)框架,Spring则提供全面的依赖注入(DI)和面向切面...

    struts2hibernate3spring3项目整合搭建需要的jar包

    Struts2、Hibernate3和Spring3是Java Web开发中的三个重要框架,它们分别负责MVC模式的展现层、持久层和业务层管理。将这三个框架整合在一起,可以构建出高效、灵活的企业级应用。下面我们将详细讲解在项目整合中所...

    struts2+hibernate3源码

    当Struts2与Hibernate3结合使用时,通常会通过Action类调用Service层的方法,Service层再利用Hibernate的Session进行数据操作。这样,业务逻辑被封装在Service层,Action只负责接收请求、传递参数,并将Service返回...

    整合struts2+spring3+hibernate3所需的jar包

    Struts2、Spring3和Hibernate3是Java Web开发中的三个重要框架,它们分别负责MVC模式中的Action层、业务逻辑层和服务容器层。这三大框架的整合能够提供一个高效、可扩展的后端架构,方便开发者进行复杂的企业级应用...

    Java代码生成工具 绿色版_生成Struts2.1.8,Spring2.5,Hibernate3代码

    Java代码生成工具是一种高效开发辅助软件,主要用于自动化生成基于Java技术栈的Web应用程序代码,尤其针对Struts2.1.8、Spring2.5和Hibernate3这三个经典框架的集成应用。这样的工具能够显著提高开发效率,减少手动...

    struts2 +hibernate3.x + sping 所有类库 jar包

    Struts2、Hibernate3.x和Spring是Java Web开发中的三个重要框架,它们分别负责MVC模式中的控制器、持久层管理和应用上下文管理。这组框架的整合使用,通常被称为S2SH,为开发者提供了强大的功能,提高了开发效率。...

    Postman-Interceptor-V1.1.2.zip

    5. **文档生成**: 使用Interceptor,开发者可以轻松获取真实环境中应用产生的API调用,将这些数据用于生成详细的API文档,确保文档与实际操作保持一致。 安装过程如下: 1. 首先,你需要在Chrome浏览器中安装...

    struts2+spring3+hibernate3 jar

    Struts2、Spring3和Hibernate3是Java Web开发中的三个核心框架,它们分别负责MVC模式中的表现层、业务层和服务层。这个压缩包“struts2+spring3+hibernate3 jar”很可能是为了方便开发者快速搭建基于SSH(Struts2、...

    使用struts拦截器+注解实现日志审计功能

    本文将详细介绍如何利用Struts拦截器和注解来实现日志审计功能。 首先,我们需要了解Struts拦截器的工作原理。拦截器是基于Java的动态代理模式实现的,它们在Action调用前后执行,形成一个拦截器链。每个拦截器都...

    Struts2.1+Spring2.5+Hibernate3的jar包

    Struts2.1、Spring2.5和Hibernate3是经典的Java Web开发框架组合,被称为SSH框架。这个组合在过去的几年中被广泛使用,为开发者提供了强大的功能和灵活的架构。以下将详细介绍这三个框架的主要功能、如何协同工作...

    struts2+hibernate3项目

    【标题】"struts2+hibernate3项目"是一个基于Java Web开发的典型应用,它结合了两个强大的开源框架——Struts2和Hibernate3,用于构建高效、可维护的Web应用程序。Struts2作为MVC(Model-View-Controller)架构的...

    《数据采集与预处理》教学教案—12用Flume Interceptor对日志信息进行数据预处理.pdf

    本教学教案重点介绍了如何利用Flume的Interceptor功能对日志信息进行预处理。 Flume Interceptors是Flume在数据流动过程中插入的数据处理模块,它们允许用户在数据被发送到存储之前进行修改或过滤。以下是Flume提供...

    Interceptor框架的实现

    总之,Interceptor框架的实现依赖于Java的代理和反射技术,它可以方便地插入额外的逻辑到方法调用中,实现诸如日志记录、权限检查等功能。通过分析和学习“stear-interceptor”项目,开发者可以更好地理解和掌握这一...

Global site tag (gtag.js) - Google Analytics