appfuse的数据维护操作都发生在***form页面,与之对应的是***FormController,在Controller中处理数据的操作是onSubmit方法,既然所有的操作都通过onSubmit,那么只需要拦截onSubmit并记录对应的参数即可作为操作日志。
首先要拦截Controller层的方法就需要在dispatcher-servlet.xml中配置拦截器,如下:
<aop:config>
<aop:advisor id="submitTx" advice-ref="txSubmitAdvice"
pointcut="execution(* *..controller.*Controller.onSubmit(..))" order="0" />
</aop:config>
<bean id="txSubmitAdvice" class="com.zcmp.xunji.service.SubmitAdvice"/>
dispatcher-servlet.xml
接下来在Service中定义自己的AOP拦截器
package com.disappearwind.service; import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails; import com.disappearwind.model.BaseObject;
import com.disappearwind.model.Role;
import com.disappearwind.model.Syslog;
import com.disappearwind.model.User; import java.lang.reflect.Method;
import java.util.Date;
import java.util.Set; import javax.servlet.http.HttpServletRequest; /**
* 对Controller中的onSubmit方法监听,记录用户的操作日志
*
* @author mraible
*/
public class SubmitAdvice implements AfterReturningAdvice, MethodInterceptor { private final Log log = LogFactory.getLog(SubmitAdvice.class);
private UserManager userManager = null;
private GenericManager<Syslog, Long> syslogManager; @Autowired
public void setSyslogManager(
@Qualifier("syslogManager") GenericManager<Syslog, Long> syslogManager) {
this.syslogManager = syslogManager;
} @Autowired
public void setUserManager(UserManager userManager) {
this.userManager = userManager;
} /**
* 在用户的业务操作执行完之后记录操作日志
*
* @param returnValue
* the user object
* @param method
* the name of the method executed
* @param args
* the arguments to the method
* @param target
* the target class
* @throws Throwable
* thrown when args[0] is null or not a Base object
*/
public void afterReturning(Object returnValue, Method method,
Object[] args, Object target) throws Throwable {
// 方法签名:String onSubmit(AppToken appToken, BindingResult errors,
// HttpServletRequest request,HttpServletResponse response)
try {
if (args[0] instanceof BaseObject) {
BaseObject obj = (BaseObject) args[0];
HttpServletRequest request = (HttpServletRequest) args[2];
// 发生在哪个Model
String modelName = obj.getClass().getSimpleName();
// Model中的数据
String modelData = obj.toString();
// 操作类型,request参数中sava就是Save,request参数中有delete则是Delete
String action = "Save";
if (null != request.getParameter("delete")) {
action = "Delete";
} // 记录操作日志到数据库
Syslog syslog = new Syslog();
syslog.setModule(modelName + "." + action);
syslog.setContent(modelData);
syslog.setCreateDate(new Date());
syslog.setCreator(getCurrentUserID()); syslogManager.save(syslog);
}
} catch (Exception ex) {
log.error(ex);
}
} /**
* 获取当前操作的用户
*
* @return 用户ID
*/
private Long getCurrentUserID() {
Long userID = 0l;
SecurityContext ctx = SecurityContextHolder.getContext();
if (ctx.getAuthentication() != null) {
Authentication auth = ctx.getAuthentication();
UserDetails user = (UserDetails) auth.getPrincipal();
userID = this.userManager.getUserByUsername(user.getUsername())
.getId();
}
return userID;
}
}
SubmitAdvice
注意,其中有一段是获取当前登录用户的ID的getCurrentUserID。
Syslog是自己定义的存储日志的数据结构。
Appfuse:记录操作日志的更多相关文章
-
MVC 记录操作日志与过滤特殊字符
最近进行的MVC系统需要用到记录操作日志和过滤特殊字符的功能,如果每个action中都调用记录日志的方法就太麻烦了,所以根据需要结合mvc的过滤机制 写了个特殊字符验证与记录操作日志的公用类: pub ...
-
Tomcat会话超时时怎样记录操作日志,满足安全审计要求
众所周知.在实际的Web应用程序中,会话管理一般都採用Web容器会话管理功能. 使用Tomcat做Webserver也是如此,并且从安全的角度考虑,尽量避免去更改和干预Web容器的会话管理功能. To ...
-
使用SpringBoot AOP 记录操作日志、异常日志
平时我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能:我们在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因我们都要到服务器去查询日志才能找到,而且也不能对发 ...
-
Spring aop 记录操作日志 Aspect
前几天做系统日志记录的功能,一个操作调一次记录方法,每次还得去收集参数等等,太尼玛烦了.在程序员的世界里,当你的一个功能重复出现多次,就应该想想肯定有更简单的实现方法.于是果断搜索各种资料,终于搞定了 ...
-
springboot springmvc拦截器 拦截POST、PUT、DELETE请求参数和响应数据,并记录操作日志
1.操作日志实体类 @Document(collection = "operation_log") @Getter @Setter @ToString public class O ...
-
.Net捕获网站异常信息记录操作日志
第一步:在Global.asax文件下的Application_Error()中写入操作日志 /// <summary> /// 整个网站出现异常信息,都会执行此方法 /// </s ...
-
自定义日志注解 + AOP实现记录操作日志
需求:系统中经常需要记录员工的操作日志和用户的活动日志,简单的做法在每个需要的方法中进行日志保存操作, 但这样对业务代码入侵性太大,下面就结合AOP和自定义日志注解实现更方便的日志记录 首先看 ...
-
spring-boot-route(十七)使用aop记录操作日志
在上一章内容中--使用logback管理日志,我们详细讲述了如何将日志生成文件进行存储.但是在实际开发中,使用文件存储日志用来快速查询问题并不是最方便的,一个优秀系统除了日志文件还需要将操作日志进行持 ...
-
SpringBoot-AOP记录操作日志
package com.meeno.inner.oa.extend.operaterecord.aop; import com.alibaba.fastjson.JSONArray; import c ...
随机推荐
-
Express 教程 01 - 入门教程之经典的Hello World
目录: 前言 一.Express?纳尼?! 二.开始前的准备工作 三.测试安装之经典的Hello World 四.使用express(1)来生成一个应用程序 五.说明 前言: 本篇文章是建立在Node ...
-
第 1 章 jQuery EasyUI 入门
学习要点: 1.什么是 jQuery EasyUI 2.学习 jQuery EasyUI 的条件 3.jQuery EasyUI 的功能和优势 4.其他的 UI 插件 5.是否兼容低版本 IE 6.下 ...
- mysql基础安全
-
paip.gui控件tabs控件加载内容的原理以及easyui最佳实现
paip.gui控件tabs控件加载内容的原理以及easyui最佳实现 //////////////tabs控件的加载 同form窗体一样,俩个方式 两个方式:一个是url,简单的文本可以使用这个,不 ...
-
windows server 2012将计算机、回收站、文档等图标添加到桌面
rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0
-
poj1665
#include <stdio.h> #include <stdlib.h> #define pi 3.1415926 int main() { float dia,tim; ...
-
ZeroMQ注意事项
Request-Reply状态 供client它必须是严肃的格在根据第一呼叫zmq_send() 函数,然后调用zmq_recv()函数的顺序来运行 对于server来说,运行时序相反 假设不依照这个 ...
-
Extjs6(四)——侧边栏导航根据路由跳转页面
本文基于ext-6.0.0 之前做的时候这个侧边栏导航是通过tab切换来切换页面的,但是总感觉不太对劲,现在终于发现怎么通过路由跳转了,分享给大家,可能有些不完善的地方,望大家读后可以给些指点.欢迎留 ...
-
Windows 10新功能
Windows 10 中面向开发人员的新增功能 Windows 10 及新增的开发人员工具将提供新通用 Windows 平台支持的工具.功能和体验.在 Windows 10 上安装完工具和 SDK后, ...
-
I春秋——Misc(贝斯家族)
不好意思呀!最近一直忙着学习python,竟然忘记更新I春秋里面的题目了(QAQ),我以后会时时刻刻提醒自己要更新 永远爱你们的! ----新宝宝 1:贝斯家族: 解题思路:我相信看见这一题都能够想到 ...