前提条件:

除了spring相关jar包外,还需要引入aspectj包。

  1. <dependency>
  2. <groupId>org.aspectj</groupId>
  3. <artifactId>aspectjweaver</artifactId>
  4. <version>1.7.2</version>
  5. </dependency>

要实现此功能,必须完成以下几步:

1.在springmvc-servlet.xml中实现对AOP的支持

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:aop="http://www.springframework.org/schema/aop"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xmlns:mvc="http://www.springframework.org/schema/mvc"
  7. xsi:schemaLocation="
  8. http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context-4.0.xsd
  12. http://www.springframework.org/schema/mvc
  13. http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
  14. http://www.springframework.org/schema/aop
  15. http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
  16. <aop:aspectj-autoproxy proxy-target-class="true"/>
  17. <bean class="com.yusj.interceptor.LogAspect" />
  18. .
  19. .
  20. .
  21. .
  22. </beans>

2.注解的方法实现Aspect

  1. package com.yusj.core.interceptor;
  2. import java.text.SimpleDateFormat;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import javax.servlet.http.HttpServletRequest;
  6. import org.aspectj.lang.JoinPoint;
  7. import org.aspectj.lang.ProceedingJoinPoint;
  8. import org.aspectj.lang.annotation.After;
  9. import org.aspectj.lang.annotation.Around;
  10. import org.aspectj.lang.annotation.Aspect;
  11. import org.aspectj.lang.annotation.Before;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.web.context.request.RequestAttributes;
  15. import org.springframework.web.context.request.RequestContextHolder;
  16. import org.springframework.web.context.request.ServletRequestAttributes;
  17. import com.google.gson.Gson;
  18. /**
  19. *
  20. * @ClassName: LogAspect
  21. * @Description: 日志记录AOP实现
  22. * @author shaojian.yu
  23. * @date 2014年11月3日 下午1:51:59
  24. *
  25. */
  26. @Aspect
  27. public class LogAspect {
  28. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  29. private String requestPath = null ; // 请求地址
  30. private String userName = null ; // 用户名
  31. private Map<?,?> inputParamMap = null ; // 传入参数
  32. private Map<String, Object> outputParamMap = null; // 存放输出结果
  33. private long startTimeMillis = 0; // 开始时间
  34. private long endTimeMillis = 0; // 结束时间
  35. /**
  36. *
  37. * @Title:doBeforeInServiceLayer
  38. * @Description: 方法调用前触发
  39. *  记录开始时间
  40. * @author shaojian.yu
  41. * @date 2014年11月2日 下午4:45:53
  42. * @param joinPoint
  43. */
  44. @Before("execution(* com.yusj.controller..*.*(..))")
  45. public void doBeforeInServiceLayer(JoinPoint joinPoint) {
  46. startTimeMillis = System.currentTimeMillis(); // 记录方法开始执行的时间
  47. }
  48. /**
  49. *
  50. * @Title:doAfterInServiceLayer
  51. * @Description: 方法调用后触发
  52. *  记录结束时间
  53. * @author shaojian.yu
  54. * @date 2014年11月2日 下午4:46:21
  55. * @param joinPoint
  56. */
  57. @After("execution(* com.yusj.controller..*.*(..))")
  58. public void doAfterInServiceLayer(JoinPoint joinPoint) {
  59. endTimeMillis = System.currentTimeMillis(); // 记录方法执行完成的时间
  60. this.printOptLog();
  61. }
  62. /**
  63. *
  64. * @Title:doAround
  65. * @Description: 环绕触发
  66. * @author shaojian.yu
  67. * @date 2014年11月3日 下午1:58:45
  68. * @param pjp
  69. * @return
  70. * @throws Throwable
  71. */
  72. @Around("execution(* com.yusj.controller..*.*(..))")
  73. public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
  74. /**
  75. * 1.获取request信息
  76. * 2.根据request获取session
  77. * 3.从session中取出登录用户信息
  78. */
  79. RequestAttributes ra = RequestContextHolder.getRequestAttributes();
  80. ServletRequestAttributes sra = (ServletRequestAttributes)ra;
  81. HttpServletRequest request = sra.getRequest();
  82. // 从session中获取用户信息
  83. String loginInfo = (String) session.getAttribute("username");
  84. if(loginInfo != null && !"".equals(loginInfo)){
  85. userName = operLoginModel.getLogin_Name();
  86. }else{
  87. userName = "用户未登录" ;
  88. }
  89. // 获取输入参数
  90. inputParamMap = request.getParameterMap();
  91. // 获取请求地址
  92. requestPath = request.getRequestURI();
  93. // 执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行
  94. outputParamMap = new HashMap<String, Object>();
  95. Object result = pjp.proceed();// result的值就是被拦截方法的返回值
  96. outputParamMap.put("result", result);
  97. return result;
  98. }
  99. /**
  100. *
  101. * @Title:printOptLog
  102. * @Description: 输出日志
  103. * @author shaojian.yu
  104. * @date 2014年11月2日 下午4:47:09
  105. */
  106. private void printOptLog() {
  107. Gson gson = new Gson(); // 需要用到google的gson解析包
  108. String optTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startTimeMillis);
  109. logger.info("\n user:"+userName
  110. +"  url:"+requestPath+"; op_time:" + optTime + " pro_time:" + (endTimeMillis - startTimeMillis) + "ms ;"
  111. +" param:"+gson.toJson(inputParamMap)+";"+"\n result:"+gson.toJson(outputParamMap));
  112. }
  113. }

利用spring AOP实现每个请求的日志输出的更多相关文章

  1. 利用Spring AOP和自定义注解实现日志功能

    Spring AOP的主要功能相信大家都知道,日志记录.权限校验等等. 用法就是定义一个切入点(Pointcut),定义一个通知(Advice),然后设置通知在该切入点上执行的方式(前置.后置.环绕等 ...

  2. 运用Spring Aop,一个注解实现日志记录

    运用Spring Aop,一个注解实现日志记录 1. 介绍 我们都知道Spring框架的两大特性分别是 IOC (控制反转)和 AOP (面向切面),这个是每一个Spring学习视频里面一开始都会提到 ...

  3. spring AOP自定义注解方式实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  4. 化繁就简,如何利用Spring AOP快速实现系统日志

    1.引言 有关Spring AOP的概念就不细讲了,网上这样的文章一大堆,要讲我也不会比别人讲得更好,所以就不啰嗦了. 为什么要用Spring AOP呢?少写代码.专注自身业务逻辑实现(关注本身的业务 ...

  5. 我使用Spring AOP实现了用户操作日志功能

    我使用Spring AOP实现了用户操作日志功能 今天答辩完了,复盘了一下系统,发现还是有一些东西值得拿出来和大家分享一下. 需求分析 系统需要对用户的操作进行记录,方便未来溯源 首先想到的就是在每个 ...

  6. 利用Spring AOP自定义注解解决日志和签名校验

    转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...

  7. (转)利用Spring AOP自定义注解解决日志和签名校验

    一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...

  8. [编码实践]SpringBoot实战:利用Spring AOP实现操作日志审计管理

    设计原则和思路: 元注解方式结合AOP,灵活记录操作日志 能够记录详细错误日志为运营以及审计提供支持 日志记录尽可能减少性能影响 操作描述参数支持动态获取,其他参数自动记录. 1.定义日志记录元注解, ...

  9. spring:利用Spring AOP 使日志输入与方法分离

    对方法进行日志输出是一种很常见的功能.传统的做法是把输出语句写在方法体的内部,在调用该方法时,用输入语句输出信息来记录方法的执行! 1.先写一个普通类: package com.importnew; ...

随机推荐

  1. JavaScript函数的柯里化(currying)

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/currying.html 什么是js函数的currying /柯里化? 说到js的柯里化,相信很多朋友都会头大.或 ...

  2. 重磅︱文本挖掘深度学习之word2vec的R语言实现

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:2013年末,Google发布的 w ...

  3. 如何编译linux第一个模块 hellomod.ko

    Linux下的驱动程序也没有听上去的那么难实现,我们可以看一下helloworld这个例子就完全可以了解它的编写的方式! 我们还是先看一个这个例子,helloworld 1. [代码]hellowor ...

  4. HighCharts之气泡图报错

    HighCharts之气泡图报错 具体报错如下: uncaught exception: Highcharts error #17: www.highcharts.com/errors/17     ...

  5. ASP.NET Core轻松入门之Configure中IHostingEnvironment和IApplicationLifetime的使用

    在StratUp.cs的Configure方法中,除了 常用的参数除了IApplicationBuilder和在我上一篇文章中提到的Iconfiguration点击打开链接 外  还有 IHostin ...

  6. 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(3)

    第一部分: http://www.cnblogs.com/cgzl/p/8478993.html 第二部分: http://www.cnblogs.com/cgzl/p/8481825.html 由于 ...

  7. 6个重要的.NET概念: - 堆栈,堆,值类型,引用类型,装箱和拆箱(转)

    今天在Code Project上面看到一篇文章<6 important .NET concepts: - Stack, heap, Value types, reference types, b ...

  8. RobotFramework下的http接口自动化post关键字的使用

    在http协议中,除了get请求外,另一个最常用的就是post请求了.和get 请求类似,post请求接收一个参数,[ url ] 示例1:调用博客园(http://www.cnblogs.com/) ...

  9. Luogu4175:[CTSC2008]网络管理Network

    题面 Luogu4175:[CTSC2008]网络管理Network Sol 路径第\(k\)大 无解直接判断就好了 然后整体二分,加上树链剖分+树状数组统计 # include <bits/s ...

  10. python中的小知识点

    这里是一些小知识点的汇集,为的是以后查找的方便. 行与缩进: 物理行:实际看到的代码行数. 逻辑行:在意义上的函数(即解释器执行的行数) 如果一个物理行中包含了多个逻辑行,则每个逻辑行之间需要用分号 ...