`

利用spring AOP实现每个请求的日志输出

阅读更多

 

前提条件:

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

<dependency>
		<groupId>org.aspectj</groupId>
		<artifactId>aspectjweaver</artifactId>
		<version>1.7.2</version>
	</dependency>

 

 

 

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

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="   
           http://www.springframework.org/schema/beans   
           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd   
           http://www.springframework.org/schema/context   
           http://www.springframework.org/schema/context/spring-context-4.0.xsd  
           http://www.springframework.org/schema/mvc   
           http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
           http://www.springframework.org/schema/aop 
	       http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
	       
	<aop:aspectj-autoproxy proxy-target-class="true"/>
	<bean class="com.yusj.interceptor.LogAspect" />
.
.
.
.
</beans>

 

2.注解的方法实现Aspect

package com.yusj.core.interceptor;

import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.google.gson.Gson;

/**
 * 
* @ClassName: LogAspect 
* @Description: 日志记录AOP实现 
* @author shaojian.yu
* @date 2014年11月3日 下午1:51:59 
*
 */
@Aspect
public class LogAspect {
	private final Logger logger = LoggerFactory.getLogger(this.getClass());

	private String requestPath = null ; // 请求地址
	private String userName = null ; // 用户名
	private Map<?,?> inputParamMap = null ; // 传入参数
	private Map<String, Object> outputParamMap = null; // 存放输出结果
	private long startTimeMillis = 0; // 开始时间
	private long endTimeMillis = 0; // 结束时间

	/**
	 * 
	 * @Title:doBeforeInServiceLayer
	 * @Description: 方法调用前触发 
	 *  记录开始时间 
	 * @author shaojian.yu 
	 * @date 2014年11月2日 下午4:45:53
	 * @param joinPoint
	 */
	@Before("execution(* com.yusj.controller..*.*(..))")
	public void doBeforeInServiceLayer(JoinPoint joinPoint) {
		startTimeMillis = System.currentTimeMillis(); // 记录方法开始执行的时间
	}

	/**
	 * 
	 * @Title:doAfterInServiceLayer
	 * @Description: 方法调用后触发 
	 *  记录结束时间
	 * @author shaojian.yu 
	 * @date 2014年11月2日 下午4:46:21
	 * @param joinPoint
	 */
	@After("execution(* com.yusj.controller..*.*(..))")
	public void doAfterInServiceLayer(JoinPoint joinPoint) {
		endTimeMillis = System.currentTimeMillis(); // 记录方法执行完成的时间
		this.printOptLog();
	}

	/**
	 * 
	 * @Title:doAround
	 * @Description: 环绕触发 
	 * @author shaojian.yu 
	 * @date 2014年11月3日 下午1:58:45
	 * @param pjp
	 * @return
	 * @throws Throwable
	 */
	@Around("execution(* com.yusj.controller..*.*(..))")
	public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
		/**
		 * 1.获取request信息
		 * 2.根据request获取session
		 * 3.从session中取出登录用户信息
		 */
		RequestAttributes ra = RequestContextHolder.getRequestAttributes();
		ServletRequestAttributes sra = (ServletRequestAttributes)ra;
		HttpServletRequest request = sra.getRequest();
		// 从session中获取用户信息
		String loginInfo = (String) session.getAttribute("username");
		if(loginInfo != null && !"".equals(loginInfo)){
			userName = operLoginModel.getLogin_Name();
		}else{
			userName = "用户未登录" ;
		}
		// 获取输入参数
		inputParamMap = request.getParameterMap();
		// 获取请求地址
		requestPath = request.getRequestURI();
		
		// 执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行
		outputParamMap = new HashMap<String, Object>();
		Object result = pjp.proceed();// result的值就是被拦截方法的返回值
		outputParamMap.put("result", result);
		
		return result;
	}

	/**
	 * 
	 * @Title:printOptLog
	 * @Description: 输出日志 
	 * @author shaojian.yu 
	 * @date 2014年11月2日 下午4:47:09
	 */
	private void printOptLog() {
		Gson gson = new Gson(); // 需要用到google的gson解析包
		String optTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startTimeMillis);
		logger.info("\n user:"+userName
				+"  url:"+requestPath+"; op_time:" + optTime + " pro_time:" + (endTimeMillis - startTimeMillis) + "ms ;"
				+" param:"+gson.toJson(inputParamMap)+";"+"\n result:"+gson.toJson(outputParamMap));
	}
}

 

 

 

 

 

1
0
分享到:
评论

相关推荐

    第四章:Spring AOP API 设计模式1

    5. **单例模式(Singleton)**:Spring AOP中的`SingletonTargetSource`保证了每个目标对象只被创建一次,实现了单例模式,确保在整个应用程序中只有一个共享的实例存在,提高了资源利用效率。 6. **适配器模式...

    spring-aop.rar_java aop_spring aop

    【标题】"spring-aop.rar_java aop_spring aop" 涉及的主要知识点是Spring框架中的面向切面编程(AOP)以及Java基础知识。这个压缩包可能包含了一个...同时,提供的测试类可以帮助理解每个组件的工作原理和使用方法。

    详解Spring AOP 拦截器的基本实现

    Spring AOP是Spring框架中处理AOP的一种实现,它允许你通过在Spring的配置文件中使用&lt;aop:config&gt;元素来配置切面、通知以及切点。Spring AOP使用代理模式和动态代理技术来拦截方法调用,根据切点表达式匹配的方法会...

    j2ee的aop方式记录日志

    本教程将详细讲解如何在SSH框架中利用Spring AOP实现日志记录,并结合ThreadLocal存储用户和请求信息。 首先,理解AOP的基本概念。AOP允许我们定义“切面”,这些切面可以包含方法拦截器,这些拦截器在目标方法执行...

    Spring-AOP demo

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、安全性等。本示例"Spring-AOP demo"旨在展示如何在Java四层架构(表示层、...

    微服务请求日志统一处理方案

    为了实现日志的拦截和统一输出,日志组件需要集成到每个微服务中。这通常通过AOP(面向切面编程)来实现,比如使用Spring AOP的切面来拦截方法的调用,然后在进入和离开方法时记录日志。在方法的入口,记录请求参数...

    Spring IOC AOP MVC 简单例子

    - SpringAOP:这个例子将演示如何在Spring中实现AOP。可能包含了一些切面、通知和切入点的定义,以及如何将它们应用到目标对象上。这将帮助你理解AOP的工作原理以及如何在实际项目中使用。 通过这三个例子,你可以...

    SSM整合-用springaop-demo01实现了注解AOP,SSM-MybatisOneForOne-demo01实现了

    - **Mapper接口**:MyBatis允许创建Mapper接口,每个方法对应一个SQL语句,通过Mapper XML文件定义SQL和结果映射。 - **一对一映射**:项目名中的"OneForOne"可能指的是一对一关联映射,MyBatis提供了`...

    草稿:SSM整合-用springaop-demo01实现了注解AOP,SSM-MybatisOneForOne-demo01实现

    我们将详细探讨在"springaop-demo01"中实现的注解AOP以及"SSM-MybatisOneForOne-demo01"中的MyBatis一对一映射。 首先,让我们深入了解一下注解AOP在"springaop-demo01"中的应用。AOP(面向切面编程)是Spring框架...

    Spring+hibernate+junit+aop_ jar包

    在开发过程中,通过编写JUnit测试用例,可以对代码进行自动化测试,确保每个独立的代码单元都能正常工作。这有助于提高代码质量和稳定性。 4. **AOP(面向切面编程)**:Spring 提供了AOP支持,使得开发者可以将...

    Spring+SpringMvc+MybatisPlus+Aop(自定义注解)动态切换数据源

    在这个项目中,我们利用自定义的Aop注解来实现数据源的动态切换。自定义注解可以附加在方法上,当该方法被调用时,AOP会捕获这个调用并执行相应的逻辑,即切换到指定的数据源。 具体实现步骤如下: 1. 定义数据源...

    使用spring aop对web 应用数据进行memcached缓存

    - 缓存雪崩:确保每个缓存都有过期时间,避免大量缓存同时失效导致的数据库压力骤增。 在实际应用中,`student-web`可能是一个包含学生管理功能的Web应用,使用Spring AOP和Memcached可以高效地缓存学生的查询结果...

    Spring IOC、AOP实现代码,可调试查看内部原理,简单易懂

    本资源包含Spring IOC和AOP的实现代码,使得开发者可以深入理解其内部原理,便于调试和学习。 **Spring IOC(Inversion of Control)** IOC,即控制反转,是一种设计模式,它将对象的创建和管理交给专门的容器来...

    ssh-aop笔记

    - **权限校验**:在方法调用前进行权限验证,避免在每个业务方法中重复代码。 **6. Struts与Hibernate的整合** Struts作为MVC框架负责处理用户请求,Hibernate则用于持久化数据。SSH整合中,通常通过Struts的...

    Spring AOP 问题

    3. **作用域问题**:在非单例bean上使用AOP可能导致意外的结果,因为每个请求都会创建一个新的bean实例,从而忽视了AOP代理。 4. **通知顺序**:当有多个通知应用于同一个切点时,它们的执行顺序可能不符合预期。...

    aop示例spring 的aop思想解决项目中多次出现的同一个问题

    以事务管理为例,假设我们在处理多个数据操作的方法中都需要进行事务控制,传统的做法是在每个方法中手动开启和提交事务,但如果使用Spring的AOP,我们只需在服务层接口或实现类的方法上添加`@Transactional`注解,...

    spring aop

    例如,可能会有一个`@Before`通知在每个服务方法执行前记录请求信息,一个`@AfterReturning`通知收集方法执行时间以进行性能分析,以及一个`@Transactional`注解确保所有数据库操作都在一个事务中完成。 通过这样的...

    aop-log:项目正式命名为aop-log,基于Spring AOP,ThreadLocal实现方法埋点,埋点信息记录和自定义收集

    AopLogAopLog是基于SpringAop和ThreadLocal实现的一个对请求方法埋点记录与处理的日志工具包。设计目的和场景:使用Spring Aop拦截程序,基本上都是同一个小异,不想日后每个项目都柏林都写一份这样的Aop拦截处理...

    AOP下的权限控制实现

    在AOP中,权限控制可以通过定义切入点(pointcut)来实现,即在特定方法执行前后插入权限检查的逻辑,而无需在每个涉及权限的方法内部重复编写代码。 在J2EE应用程序开发中,AOP的拦截能力尤为关键。通过拦截器,...

    spring aop 拦截业务方法,实现权限控制示例

    3. 配置`web.xml`:将`GetContextFilter`配置为全局过滤器,使用通配符`*`匹配所有URL,确保每个请求都会经过该过滤器。 ```xml &lt;filter-name&gt;sessionFilter &lt;filter-class&gt;...

Global site tag (gtag.js) - Google Analytics