`
jeffenchung
  • 浏览: 11849 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

S2SH配置部署日志切面拦截器

阅读更多
0.为了防止service切面影像hibernate过滤器参数,需声明设定后者初始参数。
<!-- 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();
		}

	}
分享到:
评论

相关推荐

    S2SH整合 S2SH整合

    Struts2提供了丰富的拦截器机制,可以方便地进行权限控制、日志记录、异常处理等操作。 Spring则是一个全面的企业级应用框架,不仅支持IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,...

    S2SH 整合 企业级开发 配置详解 详细代码 学Java的必学

    Spring框架则在业务层起到了核心作用,它是一个全面的企业应用框架,支持依赖注入(DI)、面向切面编程(AOP)、事务管理等关键特性。Spring2.5版本进一步完善了这些功能,增强了对其他框架如Struts和Hibernate的...

    S2SH配置文件

    1. **struts.properties**:这是Struts2框架的核心配置文件,它定义了Struts2的基本属性,如全局的默认主题、拦截器栈等。例如,你可以在这里指定是否开启调试模式,或者设置应用的默认结果类型。通过修改这个文件,...

    s2sh配置步骤java

    - **AOP编程**:Spring的面向切面编程允许你定义拦截器和通知,实现如日志、事务管理等功能。 3. **Hibernate配置**: - **添加依赖**:在项目中引入Hibernate的相关库。 - **创建Hibernate配置文件(hibernate....

    s2sh整合demo源码

    2. **Spring**: 作为依赖注入(DI)和面向切面编程(AOP)的容器,Spring允许开发者管理对象的生命周期和依赖关系。在S2SH中,Spring负责协调其他两个框架,例如配置数据源、事务管理、Bean的实例化等。Spring 2.5.5...

    s2sh整合实例

    Spring是一个全面的企业级应用开发框架,它通过依赖注入(DI)和面向切面编程(AOP)来简化Java应用的开发。在S2SH整合中,Spring主要负责管理Bean的生命周期,包括初始化、装配和销毁,同时也提供了事务管理和数据...

    简单的s2shdemo

    同时,Struts2支持多种插件和拦截器,可以实现灵活的权限控制和日志记录等功能。 **三、Spring框架** Spring是一个全面的企业级应用开发框架,它的核心特性包括依赖注入(DI)和面向切面编程(AOP)。Spring通过DI...

    s2sh ssh 架包和配置文档集合

    【标题】"s2sh ssh 架包和配置文档集合" 涉及的主要知识点是企业级Java开发中的三大框架整合——Struts2、Spring和Hibernate(简称S2SH),以及相关的jar包管理和XML配置文件。 【Struts2】:Struts2是一个基于MVC...

    S2SH 整合 导入即可完整包

    通过IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)理念,Spring能够简化应用程序的开发和维护。在S2SH整合中,Spring主要负责事务管理和数据源配置,以及Struts2和...

    s2sh框架源码

    Spring是一个全面的企业级应用框架,提供IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)等核心功能。在S2SH框架中,Spring主要负责管理对象的生命周期,实现依赖注入,...

    s2sh整合配置

    1. **struts.xml**:配置Struts 2的Action、结果类型、拦截器等。 2. **spring.xml**:定义Bean,包括Service、DAO和它们的依赖。这里也可以配置事务管理策略。 3. **persistence.xml**:JPA的配置文件,声明实体...

    S2SH的基础框架

    Spring框架是Java企业级应用的核心,它提供了一个全面的编程和配置模型,支持依赖注入(DI)和面向切面编程(AOP)。在S2SH中,Spring主要负责管理对象的生命周期和依赖关系,可以将Struts2和Hibernate的实例化、...

    S2SH在线考试系统

    Struts2.0的优势在于其强大的拦截器机制和灵活的配置,能够处理复杂的HTTP请求,提供丰富的动作和结果类型,简化了前端与后端的交互,使系统的可维护性和扩展性得到保障。 其次,Spring2.5框架则扮演了依赖注入...

    博客系统S2SH

    它的拦截器机制使得在请求处理前后的逻辑可以被灵活定制,如登录验证、日志记录等。此外,Struts2的模板技术和OGNL表达式增强了视图与模型数据的交互。 Hibernate作为对象关系映射(ORM)工具,实现了Java对象与...

    s2sh所需jar包

    Struts2的核心包括Action、Interceptor(拦截器)、Result等概念,通过配置文件来定义请求处理流程。在s2sh项目中,Struts2的jar包将用于处理HTTP请求,实现视图与控制器的分离,以及业务逻辑的调度。 Spring框架则...

    S2SH商城系统

    在S2SH中,Spring主要负责IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)。IoC使得对象的创建和依赖关系的维护变得更加简单,AOP则允许我们在不修改原有代码的情况下,...

    s2sh基础框架

    Struts2的优势在于其强大的拦截器机制,可以自定义拦截器进行权限控制、日志记录等操作。此外,Struts2支持多种结果类型和模板技术,如JSP、FreeMarker、Velocity等,方便灵活地构建视图层。 2. **Spring框架** ...

    s2sh框架整合

    它提供了丰富的拦截器(Interceptor)机制,可以方便地进行AOP(面向切面编程)操作,如日志记录、权限验证等。Struts2的配置文件(struts.xml)用于定义Action和结果,以及Action与视图间的映射。 2. **Spring**:...

    S2SH整合demo

    AOP则用于实现跨切面关注点,如日志、事务管理等。Spring3还包含了Spring MVC,作为另一种MVC框架,可以与Struts2互补或替代,提供更灵活的Web层控制。此外,Spring3还提供了数据访问集成、测试、任务调度等多种功能...

Global site tag (gtag.js) - Google Analytics