前提条件:

除了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. Eviews 9.0新版本新功能——预测(Auto-ARIMA预测、VAR预测)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 9.预测功能 新增需要方法的预测功能:Auto ...

  2. Css中路径data:image/png;base64的用法详解

    今天查看一些网站的css中发现了 background-image:url(data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAAB ...

  3. PHP XML简介

    php xml文件编程. xml简介 XML作用 1.可以作为程序间通讯的标准(ajax text xml) 2.可以作为配置文件 3.可以作为小型数据库 XML语法 一个xml文件应该包括以下几个内 ...

  4. VxWorks下USB驱动总结2

    3:USBD驱动详解 这一部分将要描述USBD(USB Host Driver)的典型应用.例如初始化,client注册,动态连接注册,设备配置,数据传输,同时还探讨了USBD内部设计的关键特性.这部 ...

  5. Error:dojo.data.ItemFileWriteStore:Invalid item argument

    1.错误描述 dijit.form.ComboBox TypeError:_4e is undefined                                            Sea ...

  6. java.io.FileNotFoundException: /opt/apache-tomcat-7.0.57/conf/server.xml (权限不够)

    1 错误描述 youhaidong@youhaidong:~$ cd /opt/apache-tomcat-7.0.57 youhaidong@youhaidong:/opt/apache-tomca ...

  7. java 后台封装json数据学习总结(一)

    一.数据封装 1. List集合转换成json代码 List list = new ArrayList(); list.add( "first" ); list.add( &quo ...

  8. haproxy反向代理配置示例

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  9. Codeforces Round #446 (Div. 2)

    Codeforces Round #446 (Div. 2) 总体:rating涨了好多,虽然有部分是靠和一些大佬(例如redbag和ShichengXiao)交流的--希望下次能自己做出来2333 ...

  10. angular+ionic+cordova(实战项目开发中,持续更新自己学到的和遇到的)

    最近公司开始准备做app了,大佬选择了angular+ionic+corvoda的开发结构,但是对于刚刚才开始对angular才有一点点感觉的我,就像是被一击闷棍敲了,半天没反应过来,emmm,怎么办 ...