cloub spring 拦截器_SpringCloud拦截器使用(Interceptors拦截器使用)
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拦截器使用)相关推荐
- spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例...
本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...
- spring boot 拦截器获取controller返回的数据_高级码农Spring Boot实战与进阶之过滤器和拦截器的使用及其区别...
众所周知的Spring Boot是很优秀的框架,它的出现简化了新Spring应用的初始搭建以及开发过程,大大减少了代码量,目前已被大多数企业认可和使用.这个专栏将对Spring Boot框架从浅入深, ...
- spring拦截器覆盖_Spring中使用Interceptor拦截器
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
- spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)
上一篇:spring boot 1.5.4 整合webService(十五) 1 Spring Boot整合redis和缓存 Spring Boot中除了对常用的关系型数据库提供了优秀的自动 ...
- Spring自定义数据源配置不当引起的Mybatis拦截器Interceptors 失效/不生效
目录 内容 Interceptor接口与@Intercepts注解 PageHelper实现拦截器 默认数据源与拦截器 自定义数据源与拦截器的问题 自定义数据源注入拦截器 内容 Interceptor ...
- java拦截器_springMVC入门(八)------拦截器
SSM框架是java开发最常用的框架组合,作为视图层的框架SPring MVC框架有着极其广泛的应用,很多的小可爱在Java学习的框架阶段存在着诸多的迷茫,今天小编将手把手的带领大家进行三大框架之一的 ...
- 拦截webapp下jsp_Spring MVC中的拦截器/过滤器HandlerInterceptorAdapter的使用
I分享永久IDEA激活码:ntelliJ IDEA 2020.1.2 激活码,永久有效(点击该链接)! 一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的 而在Spring中,基于Filt ...
- 还不了解后端资源拦截和权限认证?过滤器,拦截器,AOP,SpringSecurity教教你
一.过滤器 过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理 通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理 Filter ...
- 【WebService】CXF拦截器的设置以及自定义CXF拦截器
欢迎关注我新搭建的博客:http://www.itcodai.com/ WebService系列文章: [WebService]带你走进webservice的世界 [WebService]自定义Web ...
最新文章
- 今日课堂学习笔记01
- oracle存储过程 调用java_Oracle存储过程调用Java方法
- ORA-00928: 缺失 SELECT 关键字
- 高级经济师计算机水平考试,【2017上海高级经济师评审职称外语、计算机成绩不再为前置条件】- 环球网校...
- python打包exe 之打包sklearn模型中的各种坑及其解决方法。
- 由object元素引出的事件注册问题和层级显示问题
- (计算机组成原理)第六章总线-第三节:总线操作和定时(同步定时和异步定时)
- C Linux 多线程入门
- [渝粤教育] 西南科技大学 市场经济法律专题 在线考试复习资料
- android按键录制,按键录制(FRep Finger Replayer)
- synctoy 远程同步_使用SyncToy 2.1同步计算机和驱动器之间的文件夹
- 图文结合带你搞懂InnoDB MVCC
- vue2/vue3详细知识点
- 嵌入式Linux:安装Ubuntu系统环境
- 【USB接口程序设计】
- 忙忙碌碌不过这碎银几两
- 计算机网络协议分析全知识点总结兼期末复习重点
- Office2016激活报错:0xC004F017 | 终极解决方案
- 阿里云无影研发负责人任晋奎:无影核心技术能力突破,打造云网端融合的全新体验
- Vitamio直播框架的简单使用
热门文章
- python全栈生鲜电商_Python前后端分离开发Vue+Django REST framework全栈打造生鲜电商项目...
- 计算机的自带拍视频教程,在线网络课程视频如何录制?三种快速录制视频的方法...
- MTK flashtool 在14.04上不能使用问题
- 收获荣誉证书,显摆一下
- Small sample challenge in mechanicall fault diagnosis | 机械故障诊断中的小样本问题 文献追踪
- 修改了xiaoxia的sogou代理脚本使之能在windows下bind 127.0.0.1
- 高效的缺陷报告和测试计划的编写
- 智慧城市物联网解决方案
- 如何建立自己的知识仓库?
- 将目录下所有文件名字列出并导出为txt文件