SpringCloud后端要对前端请求进行拦截,也就是日志记录,使用SpringAOP方式即面向切面方式进行拦截。

首先,拦截请求地址(ip),使用HandlerInterceptorAdapter,它拦截的是请求地址,所以针对请求地址做一些验证、预处理操作比较合适,比如下面,我用它来统计请求访问这个地址的响应时间。

RequestLog

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.web.method.HandlerMethod;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.lang.reflect.Method;

import java.time.Instant;

/*

HandlerInterceptoer拦截的是请求地址,所以针对请求地址做一些验证、预处理等操作比较合适,

比如需要统计请求这个地址的响应时间

*/

/* Filter是Servlet规范规定的,不属于spring框架,也是用于请求的拦截。

但是它适合更粗粒度的拦截,在请求前后做一些编解码处理、日志记录等。

*/

public class RequestLog extends HandlerInterceptorAdapter {

private static final Logger LOGGER = LoggerFactory.getLogger(RequestLog.class);

/**

* 前置检查,方法执行前

*/

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

throws Exception {

String ip = request.getRemoteAddr();

Instant startTime = Instant.now();

request.setAttribute("logrequestStartTime", startTime);

HandlerMethod handlerMethod = (HandlerMethod) handler;

// 获取用户token

Method method = handlerMethod.getMethod();

LOGGER.info("用户:"+ip+",访问目标:"+method.getDeclaringClass().getName() + "." + method.getName());

return true;

}

/**

* 方法执行中

* @param request

* @param response

* @param handler

* @param modelAndView

* @throws Exception

*/

// controller处理完成

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception {

HandlerMethod handlerMethod = (HandlerMethod) handler;

Method method = handlerMethod.getMethod();

Instant startTime = (Instant) request.getAttribute("logrequestStartTime");

Instant endTime = Instant.now();

long executeTime = endTime.toEpochMilli()- startTime.toEpochMilli();

// log it

if (executeTime > 1000) {

LOGGER.info("[" + method.getDeclaringClass().getName() + "." + method.getName() + "] 执行耗时 : "

+ executeTime + "ms");

} else {

LOGGER.info("[" + method.getDeclaringClass().getSimpleName() + "." + method.getName() + "] 执行耗时 : "

+ executeTime + "ms");

}

}

}

然后,进行面向切面拦截,将请求日志记录下来

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Pointcut;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.context.request.RequestAttributes;

import org.springframework.web.context.request.RequestContextHolder;

import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**

* Created by pd on 17/12/07.

*/

//描述切面类

@Aspect //@Aspect注解就是告诉spring 这是一个aop类,AOP切面

@Configuration //可理解为用spring的时候xml里面的标签,类中 @Bean可以理解为用Spring的时候xml里面的标签

public class LogRecordAspect {

private static final Logger logger = LoggerFactory.getLogger(LogRecordAspect.class);

// 用@Pointcut来注解一个切入方法

//@Pointcut注解 声明这是一个需要拦截的切面,也就是说,当调用任何一个controller方法的时候,都会激活这个aop

@Pointcut("execution(* com.pengda.controller.*Controller.*(..))") //两个..代表所有子目录,最后括号里的两个..代表所有参数

public void excudeService() {

}

//@Around注解 环绕执行,就是在调用之前和调用之后,都会执行一定的逻辑

@Around("excudeService()")

public Object doAround(ProceedingJoinPoint pjp) throws Throwable {

RequestAttributes ra = RequestContextHolder.getRequestAttributes();

ServletRequestAttributes sra = (ServletRequestAttributes) ra;

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();

String url = request.getRequestURL().toString();

String method = request.getMethod();

String uri = request.getRequestURI();

String queryString = request.getQueryString();

try{

Object[] args =pjp.getArgs();

for(int i=0;i

if(args[i] instanceof RequestInfo>){

RequestInfo> r= (RequestInfo>) args[i];

logger.info("请求开始, 各个参数, url: {}, method: {}, uri: {}, params: {}", url, method, uri, r.toString());

}else{

logger.info("请求开始, 各个参数, url: {}, method: {}, uri: {}, params: {}", url, method, uri,args[i]);

}

}

}catch (Exception e){

logger.info("请求开始, 各个参数, url: {}, method: {}, uri: {}, params: {}", url, method, uri,queryString);

}

// result的值就是被拦截方法的返回值

Object result = pjp.proceed();

//logger.info("请求结束,controller的返回值是 " + result.toString());

//logger.info("请求结束,controller的返回值是 " + result);

return result;

}

}

cloub spring 拦截器_SpringCloud拦截器使用(Interceptors拦截器使用)相关推荐

  1. spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例...

    本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...

  2. spring boot 拦截器获取controller返回的数据_高级码农Spring Boot实战与进阶之过滤器和拦截器的使用及其区别...

    众所周知的Spring Boot是很优秀的框架,它的出现简化了新Spring应用的初始搭建以及开发过程,大大减少了代码量,目前已被大多数企业认可和使用.这个专栏将对Spring Boot框架从浅入深, ...

  3. spring拦截器覆盖_Spring中使用Interceptor拦截器

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  4. spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)

    上一篇:spring boot 1.5.4 整合webService(十五) 1      Spring Boot整合redis和缓存 Spring Boot中除了对常用的关系型数据库提供了优秀的自动 ...

  5. Spring自定义数据源配置不当引起的Mybatis拦截器Interceptors 失效/不生效

    目录 内容 Interceptor接口与@Intercepts注解 PageHelper实现拦截器 默认数据源与拦截器 自定义数据源与拦截器的问题 自定义数据源注入拦截器 内容 Interceptor ...

  6. java拦截器_springMVC入门(八)------拦截器

    SSM框架是java开发最常用的框架组合,作为视图层的框架SPring MVC框架有着极其广泛的应用,很多的小可爱在Java学习的框架阶段存在着诸多的迷茫,今天小编将手把手的带领大家进行三大框架之一的 ...

  7. 拦截webapp下jsp_Spring MVC中的拦截器/过滤器HandlerInterceptorAdapter的使用

    I分享永久IDEA激活码:ntelliJ IDEA 2020.1.2 激活码,永久有效(点击该链接)! 一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的 而在Spring中,基于Filt ...

  8. 还不了解后端资源拦截和权限认证?过滤器,拦截器,AOP,SpringSecurity教教你

    一.过滤器 过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理 通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理 Filter ...

  9. 【WebService】CXF拦截器的设置以及自定义CXF拦截器

    欢迎关注我新搭建的博客:http://www.itcodai.com/ WebService系列文章: [WebService]带你走进webservice的世界 [WebService]自定义Web ...

最新文章

  1. 今日课堂学习笔记01
  2. oracle存储过程 调用java_Oracle存储过程调用Java方法
  3. ORA-00928: 缺失 SELECT 关键字
  4. 高级经济师计算机水平考试,【2017上海高级经济师评审职称外语、计算机成绩不再为前置条件】- 环球网校...
  5. python打包exe 之打包sklearn模型中的各种坑及其解决方法。
  6. 由object元素引出的事件注册问题和层级显示问题
  7. (计算机组成原理)第六章总线-第三节:总线操作和定时(同步定时和异步定时)
  8. C Linux 多线程入门
  9. [渝粤教育] 西南科技大学 市场经济法律专题 在线考试复习资料
  10. android按键录制,按键录制(FRep Finger Replayer)
  11. synctoy 远程同步_使用SyncToy 2.1同步计算机和驱动器之间的文件夹
  12. 图文结合带你搞懂InnoDB MVCC
  13. vue2/vue3详细知识点
  14. 嵌入式Linux:安装Ubuntu系统环境
  15. 【USB接口程序设计】
  16. 忙忙碌碌不过这碎银几两
  17. 计算机网络协议分析全知识点总结兼期末复习重点
  18. Office2016激活报错:0xC004F017 | 终极解决方案
  19. 阿里云无影研发负责人任晋奎:无影核心技术能力突破,打造云网端融合的全新体验
  20. Vitamio直播框架的简单使用

热门文章

  1. python全栈生鲜电商_Python前后端分离开发Vue+Django REST framework全栈打造生鲜电商项目...
  2. 计算机的自带拍视频教程,在线网络课程视频如何录制?三种快速录制视频的方法...
  3. MTK flashtool 在14.04上不能使用问题
  4. 收获荣誉证书,显摆一下
  5. Small sample challenge in mechanicall fault diagnosis | 机械故障诊断中的小样本问题 文献追踪
  6. 修改了xiaoxia的sogou代理脚本使之能在windows下bind 127.0.0.1
  7. 高效的缺陷报告和测试计划的编写
  8. 智慧城市物联网解决方案
  9. 如何建立自己的知识仓库?
  10. 将目录下所有文件名字列出并导出为txt文件