最近一个项目客户要求能够监控用户对系统的详细操作步骤,比如某人在某时间删除了某个模块的某条数据,经过一番斟酌,决定用struts2的拦截器功能实现日志管理系统,因为系统是旧系统(SSH架构)了,用struts2就可以不用修改系统的原有的类或者方法,而且可以精确到用户的具体操作,并且所有的日志管理代码直接写在拦截器里即可。代码如下:
代码只是当时写的一个简单测试例子,可以进行优化,将各个acton及对应的方法及操作等都可以进行配置,如配置到一个xml文件当中,以后系统中新增加了action去修改xml文件就可以了。这样就不用去写大量的if,也不用每次有新增action来改日志管理系统的代码了。
- @SuppressWarnings("serial")
- publicclassLogInterceptorextendsAbstractInterceptor{
- privateStringlogName;
- privateStringlogContent;
- protectedLoggerlog=Logger.getLogger(getClass());
- publicvoidinit(){
- }
- @Override
- publicStringintercept(ActionInvocationai)throwsException{
- Mapsession=ai.getInvocationContext().getSession();
- Objectaction=ai.getAction();
- Stringmethod=ai.getProxy().getMethod();
- try{
- if(StringUtils.isBlank(method))method="method";
- SysUsersysUser=(SysUser)session.get(Constants.SESSION_USER_KEY);
- StringuserName="";
- if(sysUser!=null)userName=sysUser.getUserName();
- StringcurrentTime=TimeHelper.getCurrentTime();
- StringlogContentHead="用户"+userName+currentTime;
- ai.invoke();//执行被拦截action
- if(actioninstanceofSysOrgAction){
- if(method.equals("save")){
- logName="保存部门";
- logContent=logContentHead+"保存部门:"+ai.getStack().findValue("sysOrg.orgName");
- log.info(logContent);
- addSysLog(logName,logContent);
- }
- if(method.equals("delete")){
- logName="删除部门";
- logContent=logContentHead+"删除"+((String[])(ai.getStack().findValue("flag_id"))).length+"条部门信息";
- log.info(logContent);
- addSysLog(logName,logContent);
- }
- }
- if(actioninstanceofSysOrgForAdmAction){
- if(method.equals("save")){
- logName="保存单位";
- logContent=logContentHead+"保存单位:"+ai.getStack().findValue("sysOrg.orgName");
- log.info(logContent);
- addSysLog(logName,logContent);
- }
- if(method.equals("delete")){
- logName="删除单位";
- logContent=logContentHead+"删除1条单位信息";
- log.info(logContent);
- addSysLog(logName,logContent);
- }
- }
- if(actioninstanceofSysUserAction||actioninstanceofSysUserForAdmAction){
- if(method.equals("save")){
- logName="保存用户";
- logContent=logContentHead+"保存用户:"+ai.getStack().findValue("sysUser.userName");
- log.info(logContent);
- addSysLog(logName,logContent);
- }
- if(method.equals("delete")){
- logName="删除用户";
- logContent=logContentHead+"删除"+((String[])(ai.getStack().findValue("flag_id"))).length+"条用户信息";
- log.info(logContent);
- addSysLog(logName,logContent);
- }
- }
- }catch(Exceptione){
- e.printStackTrace();
- }
- returnAction.SUCCESS;
- }
- /**
- *插入系统日志
- *@paramlogName
- *@paramlogContent
- */
- privatevoidaddSysLog(StringlogName,StringlogContent){
- HttpServletRequestrequest=ServletActionContext.getRequest();
- SysLogServicesysLogService=(SysLogService)ApplicationContextFactory.getApplicationContext().getBean("sysLogService");
- SysLogsysLog=newSysLog();
- sysLog.setLogName(logName);
- sysLog.setLogContent(logContent);
- sysLog.setLogType(Constants.LOG_TYPE_SYS);
- sysLog.setLogTime(TimeHelper.getCurrentTime());
- sysLog.setLogIp(request.getRemoteAddr());
- sysLog.setLogKey(logName);
- sysLogService.saveLog(sysLog);
- }
- }