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

[u][b]0.为了防止service切面影像hibernate过滤器参数,需声明设定后者初始参数。[/b][/u]

<!-- 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>


[b][u]1.部署切面[/u][/b]
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>


[b][u]2.创建日志拦截器类[/u][/b]

/**
* 拦截操作日志类
* @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;
}



[u][b]3.反射方法智能解析pojo对象(或对象列表)中定义的表名anotation:table_id、主键值(包括联合主键,逗号分隔)[/b][/u]

/**
* 保存操作日志
*
* @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();
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值