springAOP注解方式实现日志操作
通过自定义注解调用方法执行日志存储:
- package com.zktx.platform.log2;
- import java.lang.reflect.Method;
- import java.util.Date;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import org.aspectj.lang.JoinPoint;
- import org.aspectj.lang.annotation.After;
- import org.aspectj.lang.annotation.AfterReturning;
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Pointcut;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Component;
- import org.springframework.web.context.request.RequestContextHolder;
- import org.springframework.web.context.request.ServletRequestAttributes;
- import com.zktx.platform.entity.tb.logInfo;
- import com.zktx.platform.entity.tb.user.ShiroUser;
- import com.zktx.platform.service.log.LogService;
- import com.zktx.platform.shiro.SecurityUtils;
- /**
- * * 首先我们为什么需要做日志管理,在现实的上线中我们经常会遇到系统出现异常或者问题。 这个时候就马上打开CRT或者SSH连上服务器拿日子来分析。
- * 受网络的各种限制。于是我们就想为什么不能直接在管理后台查看报错的信息呢。于是日志管理就出现了。
- * 其次个人觉得做日志管理最好的是Aop,有的人也喜欢用拦截器。都可以,在此我重点介绍我的实现方式。 Aop有的人说拦截不到Controller。
- * 有的人说想拦AnnotationMethodHandlerAdapter截到Controller必须得拦截org
- * .springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter。
- * 首先Aop可以拦截到Controller的
- * ,这个是毋容置疑的其次须拦截AnnotationMethodHandlerAdapter也不是必须的。最起码我没有验证成功过这个
- * 。我的Spring版本是4.0.3。
- * Aop之所以有的人说拦截不到Controller是因为Controller被jdk代理了。我们只要把它交给cglib代理就可以了
- *
- * <!-- 启动对@AspectJ注解的支持 --> <aop:aspectj-autoproxy />
- * <!--通知spring使用cglib而不是jdk的来生成代理方法 AOP可以拦截到Controller-->
- * <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
- * <!-- 节点中proxy-target-class="true"不为true时。 *
- * 当登录的时候会报这个异常java.lang.NoSuchMethodException: $Proxy54.login(), -->
- * <aop:config proxy-target-class="true"></aop:config>
- *
- * 创建一个切点类
- *
- * @author Administrator
- *
- */
- @Aspect
- @Component
- public class SystemLogAspect {
- // 本地异常日志记录对象
- private static final Logger log = LoggerFactory.getLogger(SystemLogAspect.class);
- @Autowired
- LogService logService;
- @Autowired
- private HttpServletRequest request;
- // Controller层切点
- @Pointcut("@annotation(com.zktx.platform.log2.SystemControllerLog)")
- public void controllerAspect() {
- }
- @After(value = "controllerAspect()")
- public void doAfter(JoinPoint joinPoint) {
- // 这里获取request;千万不要写在下边的线程里,因为得不到
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
- System.out.println(request.getAttribute("message") + "=======");
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- // log.info("进入日志系统————————————" + request.getLocalAddr());
- logInfo info = new logInfo();
- String description = getControllerMethodDescription(joinPoint);
- ShiroUser user = SecurityUtils.getShiroUser();
- info.setUser_name(user.getName());
- info.setMessage(description);
- info.setIp_address(user.getIpAddress());
- info.setCreate_time(new Date());
- logService.insertLogInfo(info);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }).start();
- }
- // 可以得到方法return的值
- @AfterReturning(returning = "ret", pointcut = "controllerAspect()")
- public void doAfterReturning(Object ret) throws Throwable {
- // 处理完请求,返回内容
- System.out.println(ret);
- Map<String, Object> map = (Map<String, Object>) ret;
- System.out.println(map.get("total"));
- }
- // 通过反射获取参入的参数
- public static String getControllerMethodDescription(JoinPoint joinPoint) throws Exception {
- String targetName = joinPoint.getTarget().getClass().getName();
- String methodName = joinPoint.getSignature().getName();
- Object[] arguments = joinPoint.getArgs();
- Class targetClass = Class.forName(targetName);
- String description = "";
- Method[] methods = targetClass.getMethods();
- for (Method method : methods) {
- if (method.getName().equals(methodName)) {
- Class[] clazzs = method.getParameterTypes();
- if (clazzs.length == arguments.length) {
- description = method.getAnnotation(SystemControllerLog.class).description();
- break;
- }
- }
- }
- return description;
- }
- }
定义注解:
- package com.zktx.platform.log2;
- /**
- * 自定义注解,拦截Controller
- */
- import java.lang.annotation.Documented;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Retention(RetentionPolicy.RUNTIME)
- @Target({ ElementType.METHOD, ElementType.PARAMETER })
- @Documented
- public @interface SystemControllerLog {
- String description() default "";
- }
使用方式:
- // 条件查询
- @SystemControllerLog(description = "查询导入表")
- @RequestMapping("/query")
- public @ResponseBody Map<String, Object> findByPagination(ImportTablesPo tablesPo) {
- log.info("导入表查询————————");
- try {
- int count = tableService.findCountByParms(tablesPo);
- List<ImportTablesWithBLOBs> list = tableService.findByPagination(tablesPo);
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("total", count);
- map.put("rows", list);
- return map;
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
springAOP注解方式实现日志操作的更多相关文章
- 来一手 AOP 注解方式进行日志记录
系统日志对于定位/排查问题的重要性不言而喻,相信许多开发和运维都深有体会. 通过日志追踪代码运行状况,模拟系统执行情况,并迅速定位代码/部署环境问题. 系统日志同样也是数据统计/建模的重要依据,通过分 ...
- Jeecg中通过Spring_AOP+注解方式实现日志的管理
转载;https://blog.csdn.net/ma451152002/article/details/77234236 Jeecg中通过Spring_AOP+注解方式实现日志的管理 一.设计思路 ...
- springboot搭建环境之使用@Slf4j注解方式,进行日志管理
如果不想每次都写private final Logger logger = LoggerFactory.getLogger(XXX.class); 可以用注解@Slf4j 需要引入依赖为: < ...
- spring AOP自定义注解方式实现日志管理
今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...
- MyBatis使用注解方式实现CRUD操作
一.使用注解后就不需要写SysGroupDaoMapper.xml 只需要在Dao的抽象方法前加上相应的注解就可以. package cn.mg39.ssm01.dao; import java.ut ...
- SpringAOP(注解方式实现面向切面编程)之常用Before、After、Around
一.首先在Springmvc.xml文件中引入如下内容(本示例是在ssm框架基础上实现的) 1.引入命名空间 xmlns:aop="http://www.springframework.or ...
- springAOP注解方式定义切入点报错error at ::0 can't find referenced pointcut
[说明] 1.使用spring版本:4.0.4 2.springAOP相关依赖包: 1)aopalliance-1.0.jar 2)aspectjweaver-1.8.9.jar 3)aspectjr ...
- MyBatis注解方式批量插入操作
@Insert({ "<script>", "insert into table_name(column1, column2, column3) values ...
- SpringAOP 注解方式
Spring-service-mvc.xml <context:component-scan base-package="com.restful.controller,com.rest ...
随机推荐
- 1.java安全框架SHIRO
1. shiro介绍 Apache Shiro是一个强大且易用的java安全框架,执行身份验证.授权.密码和会话管理. 使用Shiro的易于理解的API,您可以快速.轻松地获得任何应用程序,从最小的移 ...
- CruiseControl.NET 的安装与配置
CC.NET 是 CruiseControl.NET 的简称,官方网站在这里. 官方的定义是自动连续集成服务, 使用Microsoft .NET Framework实现. 另外它还有Java的版本叫做 ...
- Css小动画
html页面: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF ...
- SQL Server实现用户注册
用SQL Server注册用户,通过页面输入注册信息,存储到数据库. <form action="zhuChe.jsp" method="post" on ...
- dubbo之隐式参数
隐式参数 可以通过 RpcContext 上的 setAttachment 和 getAttachment 在服务消费方和提供方之间进行参数的隐式传递. 在服务消费方端设置隐式参数 setAttach ...
- SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis.
SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis. 特性 替代 Redis 数据库, Redis 的 100 倍容量 LevelDB 网络支持, 使用 C/C++ ...
- vue实现单页应用demo
vue + webpack +ES6/7 + axiso + vuex + vue-router构建项目前端,node + express + mongodb 开发后台 项目demo地址 https: ...
- 【剑指Offer】45、扑克牌顺子
题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到 ...
- 【剑指Offer】43、左旋转字符串
题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S ...
- MAC下redis的安装和配置
1.下载 打开官网:https://redis.io/ 选择下载你要的版本压缩包 2.安装 打开终端,cd - 将下载的压缩包拷贝到local目录下:sudo cp Downloads/redis-4 ...