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. 【初码干货】在Window Server 2016中使用Web Deploy方式发布.NET Web应用的重新梳理

    在学习和工作的过程中,发现很多同事.朋友,在做.NET Web应用发布的时候,依然在走 生成-复制到服务器 这样的方式,稍微高级一点的,就是先发布到本地,再上传到服务器 这种方式不仅效率低下,而且不易 ...

  2. 初探领域驱动设计(2)Repository在DDD中的应用

    概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...

  3. 布里斯班Twilight Bay Run半程马拉松

    自从8月3日跑了半马以后,又一鼓作气报了11月份的西昌马拉松.与第一次马拉松的只求完赛目标不同,第二次当然想取得一个更好的成绩.所以8月份练的比较猛,基本上是练2.3天休息一天,周么还要拉个长于21公 ...

  4. 一文搞懂HMM(隐马尔可夫模型)

    什么是熵(Entropy) 简单来说,熵是表示物质系统状态的一种度量,用它老表征系统的无序程度.熵越大,系统越无序,意味着系统结构和运动的不确定和无规则:反之,,熵越小,系统越有序,意味着具有确定和有 ...

  5. VS2013默认打开HTML文件没有设计视图的解决办法

    VS菜单->工具->选项->文本编辑器->文件扩展名,右侧输入html,再下拉列表选HTML(Web窗体)编辑器,点添加,确定. 重新打开html文件,就出现“设计”视图了

  6. Atitit rss没落以及替代品在线阅读器

    Atitit rss没落以及替代品在线阅读器 1.1. 对RSS的疯狂追逐,在2005年达到了一个高峰.1 1.2. Rss的问题,支持支rss,不支持url1 1.3. ,博客受到社交网络的冲击.s ...

  7. SQL Server 系列文章快速导航(SWF版)

    一.前言 在博客园写博客不自不觉已经有5个年头了,一开始只是为了记录工作中遇到的问题和解决办法,后来写的文章不自不觉的侧重在SQL Server方面的技术文章,在2014年1月终于鼓起勇气申请了微软S ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(51)-系统升级

    系统很久没有更新内容了,期待已久的更新在今天发布了,最近花了2个月的时间每天一点点,从原有系统 MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+E ...

  9. Java设计模式之代理模式(Proxy)

    前言: 最近在研究Retrofit开源框架的时候,其主要核心代码是通过注解标示参数,动态代理模式实现具体接口,反射机制进行参数解析,最终实现发送请求.其实之前在学习Xutils源码的时候,Xutils ...

  10. 计算机程序的思维逻辑 (49) - 剖析LinkedHashMap

    之前我们介绍了Map接口的两个实现类HashMap和TreeMap,本节来介绍另一个实现类LinkedHashMap.它是HashMap的子类,但可以保持元素按插入或访问有序,这与TreeMap按键排 ...