spring aop记录用户的操作
1.命名空间
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
2.配置xml
<!-- aop支持 如果记录Controller aop配置必须写到spring mvc的xml中,如果记录service aop 配置要写到 spring主配置文件-->
<aop:aspectj-autoproxy proxy-target-class="true" />
<!-- aop 实现记录日志功能 -->
<bean id="logAspect" class="com.rdkl.qmjs.logs.LogAspect"/>
<context:component-scan base-package="com.rdkl.qmjs.controller" />
3.实体类
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RecordLog {
//描述
public String description() default "";
//模块Id
public String module_id() default "";
//日志等级
public String log_lev() default "1";
//记录字段
public String recordfield() default "";
//字段描述
public String fieldnote() default "";
//操作类型:0-add-高,1-update-高,2-delete-高,3-login-中,4-select-低
public String oper_type() default "";
//系统类型 0:管理平台 1:场馆后台 2:商城后台
public int sys_type() default 0;
}
@Aspect
public class LogAspect { @Autowired
private LogService logService; //方法执行的前后调用
@AfterReturning("execution (* com.rdkl.qmjs.controller..*.*(..))&& @annotation(recordLog)")
public void opLogAfterReturning(JoinPoint joinPoint,RecordLog recordLog) throws Throwable{
Object[] params = joinPoint.getArgs();//获取目标方法体参数
System.out.println("*************write log begin****************");
HttpServletRequest request=null;
String ip="";
if(params!=null&¶ms.length>0){
for(Object obj:params){
if(obj instanceof HttpServletRequest){
request=(HttpServletRequest)obj;
ip=getIpAddr(request);
}
}
}
String desc=recordLog.description();
String field=recordLog.recordfield();
String note=recordLog.fieldnote();
int sys_type = recordLog.sys_type();
if(request!=null&&StringUtils.isNotBlank(field)){
String fieldVal=request.getParameter(field);
if(fieldVal!=null&&!"".equals(fieldVal)){
if(StringUtils.isNotBlank(note)){
desc+="-"+note+":"+fieldVal;
}else{
desc+="-"+field+":"+fieldVal;
}
}
}
User user= SecurityCommonUtils.getCurrentUser();
Log log=new Log();
log.setIp_addr(ip);
if("0".equals(recordLog.oper_type())||"1".equals(recordLog.oper_type())
||"2".equals(recordLog.oper_type())){//增删改数据,等级为高
log.setLog_lev(2);//高级
}else if("3".equals(recordLog.oper_type())){
log.setLog_lev(1);//中级
}else{
log.setLog_lev(0);//普通
}
String module_id=recordLog.module_id();
if(StringUtils.isNotBlank(module_id)){
log.setModule_id(Long.parseLong(module_id));//模块ID
}
log.setOper_date(new Date());
log.setContent(desc);
log.setSys_type(sys_type);
if(sys_type==1){//场馆日志
log.setObject_id(user.getRel_module_id());
}
if(user!=null){
log.setUser_id(user.getUser_id());
log.setOper_user(user.getUser_id());
}
logService.insertLogs(log);
System.out.println("*************write log end****************");
} /**
* 获取请求的IP
* @param request
* @return
*/
private String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
}
在需要记录操作的方法上
@RecordLog(description = "保存增加的信息", module_id = "1114003001", oper_type = "0", sys_type = 1)
spring aop记录用户的操作的更多相关文章
- SpringSecurity权限管理系统实战—八、AOP 记录用户、异常日志
目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...
- TinyFrame尾篇:整合Spring AOP实现用户认证
创建Manager用户验证表 这一篇主要讲解使用AOP对用户操作进行验证,如果通过验证,则继续执行,反之,则不能执行.其思想和上一篇完全一致. 由于需要用到用户认证,所以我们新建一个Manager实体 ...
- 从零开始学 Java - Spring AOP 实现用户权限验证
每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ...
- Spring aop 记录操作日志 Aspect
前几天做系统日志记录的功能,一个操作调一次记录方法,每次还得去收集参数等等,太尼玛烦了.在程序员的世界里,当你的一个功能重复出现多次,就应该想想肯定有更简单的实现方法.于是果断搜索各种资料,终于搞定了 ...
- Spring aop 记录操作日志 Aspect 自定义注解
时间过的真快,转眼就一年了,没想到随手写的笔记会被这么多人浏览,不想误人子弟,于是整理了一个优化版,在这里感谢智斌哥提供的建议和帮助,话不多说,进入正题 所需jar包 :spring4.3相关联以及a ...
- aop 记录用户操作(一)
转载: http://www.cnblogs.com/guokai870510826/p/5981015.html 使用标签来设置需要的记录 实例:@ISystemLog() @Controller ...
- spring aop切面编程实现操作日志步骤
1.在spring-mvc.xml配置文件中打开切面开关: <aop:aspectj-autoproxy proxy-target-class="true"/> 注意: ...
- Spring学习总结(16)——Spring AOP实现执行数据库操作前根据业务来动态切换数据源
深刻讨论为什么要读写分离? 为了服务器承载更多的用户?提升了网站的响应速度?分摊数据库服务器的压力?就是为了双机热备又不想浪费备份服务器?上面这些回答,我认为都不是错误的,但也都不是完全正确的.「读写 ...
- 使用spring aop 记录接口日志
spring配置文件中增加启用aop的配置 <!-- 增加aop 自动代理配置 --> <aop:aspectj-autoproxy /> 切面类配置 package com. ...
随机推荐
- 基于 jmeter 和 shell 的接口性能自动化
jmeter+shell 1. 总体需求 由于性能测试中涉及的查询接口多,版本迭代频繁,版本更新后自动跑一轮查询业务的性能,可以及时发现一些开发修复bug触发的非预期的bug,利用晚上时间快速重测性能 ...
- RK3288 开机动画旋转
CPU:RK3288 系统:Android 5.1 如果开机动画与屏显示方向不一致,有两种方法可以更改开机动画方向. 一.RK3288默认的开机动画是由两张图片组合而成的,可以直接旋转两张图片的方向. ...
- GNU Radio: Overview of the GNU Radio Scheduler
Scetion 1: The Flowgraph The flowgraph moves data from sources into sinks. 一个流图由多个模块组成,其中一般包括信源(Sour ...
- 【详解】Linux的文件描述符fd与文件指针FILE*互相转换
使用系统调用的时候用文件描述符(file descriptor,简称fd)的时候比较多,但是操作比较原始.C库函数在I/O上提供了一些方便的包装(比如格式化I/O.重定向),但是对细节的控制不够. 如 ...
- map、reduce处理数据结构及常见案例
随着三大前端框架和小程序的流行,MVVM大行其道,而其中的核心是 ViewModel 层,它就像是一个中转站(value converter),负责转换 Model 中的数据对象来让数据变得更容易管理 ...
- idea_pyspark 环境配置
本文转载自:https://www.cnblogs.com/LazyJoJo/p/6910504.html 1.配置好Hadoop和spark 2.配置好Pytho3.5 3.安装py4j pip3 ...
- Shell中单引号、双引号、反引号、反斜杠的区别
1. 单引号 ( '' ) # grep Susan phonebook Susan Goldberg -- Susan Topple -- 如果我们想查找的是Susan Goldberg,不能直接使 ...
- Keras 入门
“sample”“batch”“epoch” Sample:样本,比如:一张图像是一个样本,一段音频也是一个样本. Batch:批,含有N个样本的集合.每一个batch的样本都是独立的并行处理.在训练 ...
- Mysql总结(一)
数据库命令:创建create database 数据库名 charset=utf8;删除drop database 数据库名;查看所有数据库:show databases;使用数据库:use 数据库名 ...
- django单表操作,增、删、改、查
一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取出数据. 目的:通过classes(班 ...