springboot-web进阶(二)——AOP统一处理请求
一、AOP使用示例
AOP的概述在spring篇已经存在,这里不再赘述
1.准备
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.编写Aspect类
这里需要特别注意类上面的两个注解,别忘记@Componet!
package com.example.demo.aspect; import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; /**
* aspect切面类
* 添加@Aspect注解标注为切面类
* 添加@Componet让spring进行实例化
* @author zcc ON 2018/2/9
**/
@Aspect
@Component
public class LogAspect {
private static final Logger log = LoggerFactory.getLogger(LogAspect.class); @Before("execution(public * com.example.demo.controller.GirlController.getList(..))")
public void log() {
log.info("调用了一次getList()!");
}
}
3.验证
发送请求:

查看日志:

并且也容易看出,这是在它之前执行的,也就验证了这是Before注解!
二、AOP表达式与AOP特性介绍
1.语法
execution(方法修饰符(可选) 返回类型 方法名 参数 异常模式(可选))
2.示例
参考:http://blog.csdn.net/qq525099302/article/details/53996344
3.使用PointCut提取公共execution表达式
@Aspect
@Component
public class LogAspect {
private static final Logger log = LoggerFactory.getLogger(LogAspect.class); @Pointcut("execution(public * com.example.demo.controller.GirlController.*(..))")
public void log() { } @Before("log()")
public void logBefore() {
log.info("开始调用前!");
} @After("log()")
public void logAfter() {
log.info("调用完成后!");
}
}
4.使用JoinPoint得到被增强方法的信息
@Before("execution(* com.abc.service.*.many*(..))")
public void permissionCheck(JoinPoint point) {
System.out.println("@Before:模拟权限检查...");
System.out.println("@Before:目标方法为:" +
point.getSignature().getDeclaringTypeName() +
"." + point.getSignature().getName());
System.out.println("@Before:参数为:" + Arrays.toString(point.getArgs()));
System.out.println("@Before:被织入的目标对象为:" + point.getTarget());
}
完整参考:https://my.oschina.net/itblog/blog/211693
三、AOP日志请求统一处理
1.Aspect类
package com.example.demo.aspect; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; /**
* aspect切面类
* 添加@Aspect注解标注为切面类
* 添加@Componet让spring进行实例化
* @author zcc ON 2018/2/9
**/
@Aspect
@Component
public class LogAspect {
private static final Logger log = LoggerFactory.getLogger(LogAspect.class); @Pointcut("execution(public * com.example.demo.controller.GirlController.*(..))")
public void log() { } @Before("log()")
public void logBefore(JoinPoint joinPoint) {
// 得到request对象
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// URL
log.info("url is:{}", request.getRequestURL());
// method
log.info("method is:{}", request.getMethod());
// ip地址
log.info("ip is:{}", request.getRemoteAddr());
// 类方法
log.info("class method is:{}", joinPoint.getSignature().getName());
// 参数
log.info("param is:{}", joinPoint.getArgs());
} @After("log()")
public void logAfter() {
log.info("调用完成后!");
}
}
2.结果

日志:

3.@AfterReturning的用法
@AfterReturning(returning = "obj", pointcut = "log()")
public void afterReturn(Object obj) {
log.info("return obj:{}", obj.toString());
}
// 需要注意它的两个参数,一个是切点,一个是返回的对象
springboot-web进阶(二)——AOP统一处理请求的更多相关文章
- SpringBoot学习笔记(七):SpringBoot使用AOP统一处理请求日志、SpringBoot定时任务@Scheduled、SpringBoot异步调用Async、自定义参数
SpringBoot使用AOP统一处理请求日志 这里就提到了我们Spring当中的AOP,也就是面向切面编程,今天我们使用AOP去对我们的所有请求进行一个统一处理.首先在pom.xml中引入我们需要的 ...
- Spring Boot 表单验证、AOP统一处理请求日志、单元测试
一.使用@Valid表单验证 于实体类中添加@Min等注解 @Entity public class Girl { @Id @GeneratedValue private Integer id; pr ...
- Springboot中AOP统一处理请求日志
完善上面的代码: 现在把输出信息由先前的system.out.println()方式改为由日志输出(日志输出的信息更全面) 现在在日志中输出http请求的内容 在日志中获取方法返回的内容
- Springboot中使用AOP统一处理Web请求日志
title: Springboot中使用AOP统一处理Web请求日志 date: 2017-04-26 16:30:48 tags: ['Spring Boot','AOP'] categories: ...
- 46. Spring Boot中使用AOP统一处理Web请求日志
在之前一系列的文章中都是提供了全部的代码,在之后的文章中就提供核心的代码进行讲解.有什么问题大家可以给我留言或者加我QQ,进行咨询. AOP为Aspect Oriented Programming的缩 ...
- SpringBoot2.0 使用AOP统一处理Web请求日志(完整版)
一,加入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- Spring Boot 2.0 教程 | AOP 切面统一打印请求日志
欢迎关注微信公众号: 小哈学Java 文章首发于个人网站 https://www.exception.site/springboot/spring-boot-aop-web-request 本节中,您 ...
- SpringBoot Web篇(二)
摘要 继上一篇 SpringBoot Web篇(一) 文件上传 当我们服务器需要接收用户上传的文件时,就需要使用MultipartFile作为参数接收文件.如下: @PostMapping(" ...
- SpringBoot系列(十三)统一日志处理,logback+slf4j AOP+自定义注解,走起!
往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)we ...
随机推荐
- Excel连接字符串在.NET中的应用
转:https://www.cnblogs.com/jaxu/archive/2011/07/29/2121022.html 介绍几种在.NET中直接连接Excel作为数据源的几种方法以及连接字符串的 ...
- popup定位引擎popper.js介绍
https://medium.com/@FezVrasta/popper-js-v1-5e8b3acd888c https://survivejs.com/blog/popper-interview/ ...
- windows下查看端口占用以及进程名称
http://www.cnblogs.com/rollenholt/archive/2012/08/17/2644657.html
- apache url rewrite及正则表达式笔记
什么是mod_rewrite? mod_rewrite是apache一个允许服务器端对请求url做修改的模块.入端url将和一系列的rule来比对.这些rule包含一个正则表达式以便检测每个特别的模式 ...
- [域|Domain] The trust relationship between this workstation and the primary domain failed 此工作站和主域间的信任关系失败
PS> $cred = Get-Credential domain.sample.com;Reset-ComputerMachinePassword -Credential $cred -Ser ...
- 如何让触摸事件穿透一个View
如何让触摸事件穿透一个View 偶然间发现,如何屏蔽或者让触摸事件穿透一个view是一个很简单的事情. 现象: 源码: // // ViewController.m // UserInteractio ...
- [C++] 用Xcode来写C++程序[1] 新建C++项目工程
用Xcode来写C++程序[1] 新建C++项目工程 第一节从新建工程并编译C++源码开始 新建工程 源码: // // main.cpp // YeHelloWorld // // Created ...
- 铁乐学python_Day39_多进程和multiprocess模块2
铁乐学python_Day39_多进程和multiprocess模块2 锁 -- multiprocess.Lock (进程同步) 之前我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发 ...
- CMake: Could NOT find PkgConfig
转自http://www.ogre3d.org/forums/viewtopic.php?f=22&t=78490 Looking for OGRE... Could NOT find Pkg ...
- VMWare虚拟机下为Ubuntu 12.04.1配置静态IP(NAT方式)
背景 在虚拟机下运行操作系统,尤其是Linux系统已经是非常常见的做法.有时你想在虚拟机下搭建一个(模拟)服务器来供主机访问,比如搭建一个telnet/ssh.此时你会发现,每次启动虚拟机,VMWar ...