前提条件:

除了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. JAVA的helloworld

    java环境设置------------- 在环境变量中设置以下三个变量:JAVA_HOME=C:\j2sdk1.4.1 //可以改为相应的目录CLASSPATH=%JAVA_HOME%\lib\to ...

  2. dojo省份地市级联之地市Dao接口类(四)

    dojo省份地市级联之地市Dao接口类 CityDao.java: /** * 地市 */ package com.you.dao; import java.util.List; import com ...

  3. JAVA 单步调试快捷键

    JAVA 单步调试快捷键以debug方式运行java程序后 (F8)直接执行程序.遇到断点时暂停:(F5)单步执行程序,遇到方法时进入:(F6)单步执行程序,遇到方法时跳过:(F7)单步执行程序,从当 ...

  4. AM335x(TQ335x)学习笔记——LCD驱动移植

    TI的LCD控制器驱动是非常完善的,共通的地方已经由驱动封装好了,与按键一样,我们可以通过DTS配置完成LCD的显示.下面,我们来讨论下使用DTS方式配置内核完成LCD驱动的思路. (1)初步分析 由 ...

  5. 学习笔记:webpack深入与实践(一)

    一.webpack基本介绍 webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler). 四个核心概念: 入口(entry):指示 webpack 应该 ...

  6. h264多slice

    1, h264编码以macroblock为最小单位(简称MB),多个连续的MB组成一个slice,每个slice编码输出一个NALU 2, 划分slice的方式可以按照固定个数MB的方式: 也可以以对 ...

  7. 关于json.parse和json.stringify的区别

    json.parse是将字符串解析成json格式 而json.stringify是将json解析成字符串格式

  8. pat1111-1120

    1111 比较麻烦的最短路 #include<cmath> #include<map> #include<iostream> #include<cstring ...

  9. python 实现多层目录文件查找

    本文针对多层目录下文件的查找. 利用 os模块的基本操作,并利用递归的思想实现了目录多层查找. 代码如下: import os #dir_name: 处理文件的起始目录 def count_file( ...

  10. Linux 的特殊变量(2)

    1.echo $?  输出结果为0 表示命令执行成功 场景:判断上一个命令是否成功 扩展 0:成功 2 :权限拒绝 1~125:表示运行失败 126:找到命令,但是无法执行 127:未找到要运行的命令 ...