mysql事件侦听器_SSH基于Hibernate eventListener 事件侦听器的操作日志自动保存到数据库...

packagecom.cqta.dev.web.util;importjava.io.IOException;importjava.lang.reflect.Method;importjava.util.Date;importjava.util.HashMap;importjava.util.Map;importjavax.xml.parsers.DocumentBuilder;importjavax.xml.parsers.DocumentBuilderFactory;importjavax.xml.parsers.ParserConfigurationException;importorg.hibernate.event.PostDeleteEvent;importorg.hibernate.event.PostDeleteEventListener;importorg.hibernate.event.PostInsertEvent;importorg.hibernate.event.PostInsertEventListener;importorg.hibernate.event.PostUpdateEvent;importorg.hibernate.event.PostUpdateEventListener;importorg.springframework.security.core.userdetails.User;importorg.w3c.dom.Document;importorg.w3c.dom.Element;importorg.w3c.dom.NodeList;importorg.xml.sax.SAXException;importcom.cqta.dev.model.log.Log;importcom.cqta.dev.model.log.LogAudit;importcom.cqta.dev.service.online.TxtContentService;importcom.cqta.dev.web.util.AppContextUtils;public class LogAuditListener implementsPostInsertEventListener,PostUpdateEventListener, PostDeleteEventListener {/****/

private static final long serialVersionUID = 1L;private static String INSERT="添加";private static String UPDATE="修改";private static String DELETE="删除";private static Map logAuditMap=new HashMap();/*** 添加操作 日志*/

public voidonPostInsert(PostInsertEvent event) {

Class> clazz =event.getEntity().getClass();try{

Log log=null;if (logAuditMap.size() > 0) {

LogAudit logAudit=logAuditMap.get(clazz.getSimpleName());if (logAudit != null) {

log=newLog(logAudit,INSERT);

StringBuilder content= new StringBuilder(INSERT + logAudit.getDescription());//操作说明

User user = null; //操作人

user =SecurityUserHolder.getCurrentUser();

Object[] newState=event.getState();

String[] fields=event.getPersister().getPropertyNames();if (newState != null && fields != null && newState.length ==fields.length ) {for (int i = 0; i < fields.length; i++) {if(logAudit.getProperty().containsKey(fields[i])){

content.append("\""+logAudit.getProperty().get(fields[i])+ "\" "+newState[i]);

}

}

}

log.setDescription(content.toString());

log.setActionUserName(user!=null?user.getUsername():null);

saveOperate(log);

}

}

}catch(Exception e) {

e.printStackTrace();

}

}/*** 修改操作 日志*/

public voidonPostUpdate(PostUpdateEvent event) {

Class> clazz =event.getEntity().getClass();try{

Log log=null;if (logAuditMap.size() > 0) {

LogAudit logAudit=logAuditMap.get(clazz.getSimpleName());if (logAudit != null) {

log=newLog(logAudit,UPDATE);

String content= UPDATE + logAudit.getDescription(); //操作说明

User user = null; //操作人

user =SecurityUserHolder.getCurrentUser();

log.setActionUserName(user!=null?user.getUsername():null);

Object[] oldState= event.getOldState(); //获取旧值

Object[] newState = event.getState(); //获取更改后的值

String[] fields = event.getPersister().getPropertyNames(); //获取对象属性

if("User".equals(clazz.getSimpleName())){ //当对象是用用户时 将用户 单独拿出来 判断用户登录和修改密码

if(oldState != null && newState != null && fields != null && oldState.length == newState.length && oldState.length ==fields.length){boolean ref=false; //是否为登录操作

for (int i = 0; i < fields.length; i++) {if(fields[i]=="lastlogintime" && oldState[i]!=newState[i]){ //登录操作 最后一次登录时间被修改

ref=false;break;

}else if(fields[i]=="password" && oldState[i]!=newState[i]){ //登录操作 最后一次登录时间被修改

content = "修改密码";

ref=true;

}if(logAudit.getProperty().containsKey(fields[i])&&!oldState[i].equals(newState[i])){

content+= "{将 \"" + logAudit.getProperty().get(fields[i]) + "\" : \""+oldState[i]+ "\" 改为 \"" + String.valueOf(newState[i]) + "\"}";

ref=true;

}

}if(ref){

log.setDescription(content);

saveOperate(log);

}

}//如果修改的model不是USER

}else if (oldState != null && newState != null && fields != null && oldState.length == newState.length && oldState.length ==fields.length ) {for (int i = 0; i < fields.length; i++) {if(logAudit.getProperty().containsKey(fields[i])&&!oldState[i].equals(newState[i])){

content+= "{将 \"" + logAudit.getProperty().get(fields[i]) + "\" : \""+oldState[i]+ "\" 改为 \"" + String.valueOf(newState[i]) + "\"}";

}

}

log.setDescription(content);

saveOperate(log);

}

}

}

}catch(Exception e) {

e.printStackTrace();

}

}/*** 删除操作 日志*/

public voidonPostDelete(PostDeleteEvent event) {

Class> clazz =event.getEntity().getClass();try{

Log log=null;if (logAuditMap.size() > 0) {

LogAudit logAudit=logAuditMap.get(clazz.getSimpleName());if (logAudit != null) {

log=newLog(logAudit,DELETE);

log.setDescription(DELETE+logAudit.getDescription());

User user= null; //操作人

user =SecurityUserHolder.getCurrentUser();

log.setActionUserName(user!=null?user.getUsername():null);

saveOperate(log);

}

}

}catch(Exception e) {

e.printStackTrace();

}

}publicLog newLog(LogAudit audit,String operation){

Log log=newLog();

log.setAction(operation);

log.setCommand(audit.getOperate());

log.setActiontime(newDate());returnlog;

}/*** 生成日志

*@paramsession

*@paramentry*/

private void saveOperate(finalLog entry) {//在新的线程中打开hibernate session,解决页面数据不同不问题.

new Thread(newRunnable() {public voidrun() {

TxtContentService txtContentService= (TxtContentService) AppContextUtils.getBean("txtContentService");

txtContentService.saveObject(entry);

}

}).start();

}/*** 读取需做日志记录的XML配置文件

*@return

*/

static{try{

DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();

DocumentBuilder builder=dbf.newDocumentBuilder();

Document doc= builder.parse(LogAudit.class.getClassLoader().getResourceAsStream("auditLog.xml")); //获取到xml文件

Element root = doc.getDocumentElement(); //获取根元素

NodeList logAudits = root.getElementsByTagName("entity");

LogAudit log=null;for (int i = 0; i < logAudits.getLength(); i++) {

Element ss=(Element) logAudits.item(i);

log= newLogAudit();

log.setClazz(ss.getAttribute("clazz")); //实体类

log.setDescription(ss.getAttribute("description")); //操作说明

log.setOperate(ss.getAttribute("operate")); //操作项

NodeList propertys = ss.getElementsByTagName("property");//属性

Map proMap=new HashMap();for(int j = 0; j < propertys.getLength(); j++){

Element e=(Element) propertys.item(j);

proMap.put(e.getAttribute("name"), e.getTextContent());

}

log.setProperty(proMap);

logAuditMap.put(ss.getAttribute("clazz"), log);

}

}catch(ParserConfigurationException e) {

e.printStackTrace();

}catch(SAXException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值