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:记录操作日志的更多相关文章

  1. MVC 记录操作日志与过滤特殊字符

    最近进行的MVC系统需要用到记录操作日志和过滤特殊字符的功能,如果每个action中都调用记录日志的方法就太麻烦了,所以根据需要结合mvc的过滤机制 写了个特殊字符验证与记录操作日志的公用类: pub ...

  2. Tomcat会话超时时怎样记录操作日志,满足安全审计要求

    众所周知.在实际的Web应用程序中,会话管理一般都採用Web容器会话管理功能. 使用Tomcat做Webserver也是如此,并且从安全的角度考虑,尽量避免去更改和干预Web容器的会话管理功能. To ...

  3. 使用SpringBoot AOP 记录操作日志、异常日志

    平时我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能:我们在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因我们都要到服务器去查询日志才能找到,而且也不能对发 ...

  4. Spring aop 记录操作日志 Aspect

    前几天做系统日志记录的功能,一个操作调一次记录方法,每次还得去收集参数等等,太尼玛烦了.在程序员的世界里,当你的一个功能重复出现多次,就应该想想肯定有更简单的实现方法.于是果断搜索各种资料,终于搞定了 ...

  5. springboot springmvc拦截器 拦截POST、PUT、DELETE请求参数和响应数据,并记录操作日志

    1.操作日志实体类 @Document(collection = "operation_log") @Getter @Setter @ToString public class O ...

  6. .Net捕获网站异常信息记录操作日志

    第一步:在Global.asax文件下的Application_Error()中写入操作日志 /// <summary> /// 整个网站出现异常信息,都会执行此方法 /// </s ...

  7. 自定义日志注解 + AOP实现记录操作日志

      需求:系统中经常需要记录员工的操作日志和用户的活动日志,简单的做法在每个需要的方法中进行日志保存操作, 但这样对业务代码入侵性太大,下面就结合AOP和自定义日志注解实现更方便的日志记录   首先看 ...

  8. spring-boot-route(十七)使用aop记录操作日志

    在上一章内容中--使用logback管理日志,我们详细讲述了如何将日志生成文件进行存储.但是在实际开发中,使用文件存储日志用来快速查询问题并不是最方便的,一个优秀系统除了日志文件还需要将操作日志进行持 ...

  9. SpringBoot-AOP记录操作日志

    package com.meeno.inner.oa.extend.operaterecord.aop; import com.alibaba.fastjson.JSONArray; import c ...

随机推荐

  1. MVVM大比拼之vue.js源码精析

    VUE 源码分析 简介 Vue 是 MVVM 框架中的新贵,如果我没记错的话作者应该毕业不久,现在在google.vue 如作者自己所说,在api设计上受到了很多来自knockout.angularj ...

  2. 浅析Go语言的Interface机制

    前几日一朋友在学GO,问了我一些interface机制的问题.试着解释发现自己也不是太清楚,所以今天下午特意查了资料和阅读GO的源码(基于go1.4),整理出了此文.如果有错误的地方还望指正. GO语 ...

  3. 实现ABP中Person类的权限功能

    菜单项的显示功能已经完全OK了.那么我们就开始制作视图功能吧. 首先测试接口是否正常 我们通过代码生成器将权限和application中大部分功能已经实现了.那么我们来测试下这些接口ok不. 浏览/a ...

  4. ActiveMQ的集群方案对比及部署

    转载:http://blog.csdn.net/lifetragedy/article/details/51869032 ActiveMQ的集群 内嵌代理所引发的问题: 消息过载 管理混乱 如何解决这 ...

  5. CSS布局之div交叉排布与底部对齐--flex实现

    最近在用wordpress写页面时,设计师给出了一种网页排布图样,之前从未遇到过,其在电脑上(分辨率大于768px)的效果图如下: 而在手机(分辨率小于等于768px)上要求这样排列: 我想到了两种方 ...

  6. 解析大型.NET ERP系统 分布式应用模式设计与实现

    C/S架构的应用程序,将一些复杂的计算逻辑由客户端转移到服务器端可以改善性能,同时也为了其它方面的控制..NET Remoting在局域网内调用的性能相当不错.ERP系统中基于.NET Remotin ...

  7. DDD 领域驱动设计-如何 DDD?

    注:科比今天要退役了,我是 60 亿分之一,满腹怀念-

  8. 前端精选文摘:BFC 神奇背后的原理

    BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用处(如清浮动,防止 margin 重叠等).虽然我知道如何利用 BFC 解决这些问题, ...

  9. 你真的会玩SQL吗?让人晕头转向的三值逻辑

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  10. 3.C#WinForm基础累加器

    功能:实现累加计算. 知识点: bool int.TryParse(string s,out int result)(+1重载) 将数字的字符串形式转换为它的等效的32位有效的有符号整数,一个指示操作 ...