SpringBoot实现过滤器、拦截器与切片
Java技术精选
共 7799字,需浏览 16分钟
· 2021-12-13
过滤器Filter
过滤器概念
过滤器作用
Examples that have been identified for this design are
1) Authentication Filters, 即用户访问权限过滤
2) Logging and Auditing Filters, 日志过滤,可以记录特殊用户的特殊请求的记录等
3) Image conversion Filters
4) Data compression Filters
5) Encryption Filters
6) Tokenizing Filters
7) Filters that trigger resource access events
8) XSL/T filters
9) Mime-type chain Filter
过滤器实现方式
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
// 必须添加注解,springmvc通过web.xml配置
@Component
public class TimeFilter implements Filter {
private static final Logger LOG = LoggerFactory.getLogger(TimeFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
LOG.info("初始化过滤器:{}", filterConfig.getFilterName());
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
LOG.info("start to doFilter");
long startTime = System.currentTimeMillis();
chain.doFilter(request, response);
long endTime = System.currentTimeMillis();
LOG.info("the request of {} consumes {}ms.", getUrlFrom(request), (endTime - startTime));
LOG.info("end to doFilter");
}
@Override
public void destroy() {
LOG.info("销毁过滤器");
}
private String getUrlFrom(ServletRequest servletRequest){
if (servletRequest instanceof HttpServletRequest){
return ((HttpServletRequest) servletRequest).getRequestURL().toString();
}
return "";
}
}
在SpringBoot中注册第三方过滤器
@Configuration
public class WebConfig {
/**
* 注册第三方过滤器
* 功能与spring mvc中通过配置web.xml相同
* @return
*/
@Bean
public FilterRegistrationBean thirdFilter(){
ThirdPartFilter thirdPartFilter = new ThirdPartFilter();
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean() ;
filterRegistrationBean.setFilter(thirdPartFilter);
Listurls = new ArrayList<>();
// 匹配所有请求路径
urls.add("/*");
filterRegistrationBean.setUrlPatterns(urls);
return filterRegistrationBean;
}
}
拦截器Interceptor
拦截器概念
拦截器作用
日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等
权限检查:如登录检测,进入处理器检测检测是否登录
性能监控:通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。(反向代理,如apache也可以自动记录);
通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。
拦截器实现
@Component
public class TimeInterceptor implements HandlerInterceptor {
private static final Logger LOG = LoggerFactory.getLogger(TimeInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
LOG.info("在请求处理之前进行调用(Controller方法调用之前)");
request.setAttribute("startTime", System.currentTimeMillis());
HandlerMethod handlerMethod = (HandlerMethod) handler;
LOG.info("controller object is {}", handlerMethod.getBean().getClass().getName());
LOG.info("controller method is {}", handlerMethod.getMethod());
// 需要返回true,否则请求不会被控制器处理
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
LOG.info("请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后),如果异常发生,则该方法不会被调用");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
LOG.info("在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
long startTime = (long) request.getAttribute("startTime");
LOG.info("time consume is {}", System.currentTimeMillis() - startTime);
}
// java配置类
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private TimeInterceptor timeInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(timeInterceptor);
}
}
节点信息。切片Aspect
切片概述
切片实现
docs.spring.io/spring/docs/5.0.12.RELEASE/spring-framework-reference/core.html#aop
@Aspect
@Component
public class TimeAspect {
private static final Logger LOG = LoggerFactory.getLogger(TimeAspect.class);
@Around("execution(* me.ifight.controller.*.*(..))")
public Object handleControllerMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
LOG.info("切片开始。。。");
long startTime = System.currentTimeMillis();
// 获取请求入参
Object[] args = proceedingJoinPoint.getArgs();
Arrays.stream(args).forEach(arg -> LOG.info("arg is {}", arg));
// 获取相应
Object response = proceedingJoinPoint.proceed();
long endTime = System.currentTimeMillis();
LOG.info("请求:{}, 耗时{}ms", proceedingJoinPoint.getSignature(), (endTime - startTime));
LOG.info("切片结束。。。");
return null;
}
}
过滤器、拦截器以及切片的调用顺序
过滤器和拦截器的区别
参考
评论
用 Shader 实现旗帜飘扬动画效果
我觉得对于刚入门 3D 编程的朋友来说,如果能够完成代码创建模型数据->创建材质->编写Shader动画这一系列,想必会有满满的成就感。今天就用 Cocos Creator 的 utils.MeshUtils.createMesh 接口,带大家感受一下这个流程。这个流程不仅可以用于新手学
COCOS
2
【送书福利】《Java面试八股文:高频面试题与求职攻略一本通》
先来唠唠最近粉丝面试回来跟我聊天,基本上都提到一个点,在面试过程中八股文占比很高(八股文70%、项目20%、10%算法)除了一些搞算法突出的厂除外。其实现在很多厂八股都是逐渐深入的方式来问,所以大家在学习的过程中,针对一些重点的内容,最好深入去学习,不然还是比较难应对这种追问式的问题。最近刚好从一位
Java后端技术
0
屏论丨“重温经典”频道走红背后的危与机
屏论今年2月1日,“重温经典”频道正式开播,作为免费向观众提供应看爱看、脍炙人口的经典内容的公益性频道,“重温经典”频道对于“双治理”背景下正在进行电视公共服务属性与商业属性新一轮沉淀的电视大屏而言,意义重要而特殊。从频道开播以来的实际表现来看,的确亮眼。比如春节期间,“重温经典”频道在21个地区收
流媒体网
0
SpringBoot+Minio实现上传凭证、分片上传、秒传和断点续传
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。Spring Boot整合Minio后,前端的文件上传有两种方式:1、文件上传到后端,由后端保存到Minio这种方式好处是完全由后端集中管理,可以很好的做到、身份验证、
Java架构师社区
0
Java版【数据结构与算法】的天花板,收藏好,慢慢看
Java 版数据结构与算法来了,堪称 java 版数据结构与算法的天花板,需要学数据结构与算法的,刷这套就可以了,目录如下,文末附教程地址。基础数据结构-001-二分查找-算法描述基础数据结构-002-二分查找-算法实现基础数据结构-003-二分查找-问题1-循环条件基础数据结构-004-二分查找-
路人甲Java
0
超越原生,散点图实现华夫饼图
之前我们介绍过了如何使用新卡片图实现华夫饼图。参考:超越原生,PowerBI 华夫饼图实现但是利用卡片图实现的华夫饼图有一些缺点,形状之间的大小跟间距不太好把握,而且有时形状大一点的话显示就会不正常,需要做出二次调整。今天给大家介绍一种原生视觉对象生成华夫饼图的更佳方案,既简单又美观。上图是利用散点
PowerBI战友联盟
2
42岁日本童颜女神二度离婚后,被曝与年下11岁帅哥演员热恋中!
女優の安達祐実の熱愛報道が話題だ。お相手は、俳優の鈴木勝大。09年、『JUNONスーパーボーイコンテスト』準グランプリで芸能界入りした鈴木は、12年にスーパー戦隊シリーズ『特命戦隊ゴーバスターズ』(テレビ朝日系)で主演を務め、その後はドラマや映画などで活躍する若手の人気俳優だ。安達と鈴木は昨年夏の舞
python教程
0
Spring Boot + flowable 快速实现工作流
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。来源:blog.csdn.net/zhan107876/article/details/120815560总览一、flowable-ui部署运行二、绘制流程图绘图细节:
Java架构师社区
0