五十、Filter过滤器,Interceptor拦截器,ControllerAdvice,Aspect切片

本文主要是介绍五十、Filter过滤器,Interceptor拦截器,ControllerAdvice,Aspect切片,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Filter过滤器,Interceptor拦截器,ControllerAdvice,Aspect切片

上图为在web项目中,在处理request请求时得处理顺序

在项目中我们改怎么使用呢?

 Filter过滤器

/*** Created by GAOMINGQIAN on 2017/12/10.*<pr>*     Filter只能获取到请求的request和response。获取不到其他的信息*     因为Filter属于J2EE的内容,不知道spring*      会拦截所有的请求*</pr>**/
//@Component
public class TimeFilter implements Filter {//初始化的时候调用@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("time filter init");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("time filter start");long start=new Date().getTime();filterChain.doFilter(servletRequest,servletResponse);System.out.println("time filter end:"+(new Date().getTime()-start));System.out.println("time filter finsh");}//销毁时调用@Overridepublic void destroy() {System.out.println("time filter destory");}
}

上述内容中有一个@Component注解,当我们不想使用时或者更细的粒度拦截,需要在config类中进行注册

//配置一个过滤器
@Bean
public FilterRegistrationBean timeFilter() {//filter注册用的beanFilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();TimeFilter timeFilter = new TimeFilter();filterRegistrationBean.setFilter(timeFilter);List<String> urls = new ArrayList<>();urls.add("/*");//设置filter对那些请求有作用,这里设置的是对所有的请求都有作用filterRegistrationBean.setUrlPatterns(urls);return filterRegistrationBean;
}

Interceptor拦截器

/*** Created by GAOMINGQIAN on 2017/12/10.*/
public class TimeInterceptor implements HandlerInterceptor {//该方法的返回值决定后续的方法是否执行(controller中的方法)@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {System.out.println("preHandle");//获取controller类名称System.out.println(((HandlerMethod) o).getBean().getClass().getName());//获取执行method的名字System.out.println(((HandlerMethod)o).getMethod().getName());httpServletRequest.setAttribute("startTime", new Date().getTime());return true;}//当controller抛出异常时,该方法不会被调用@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");long start = (Long) httpServletRequest.getAttribute("startTime");System.out.println("time interceptor耗时" + (new Date().getTime() - start));}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("afterCompletion");long start = (Long) httpServletRequest.getAttribute("startTime");System.out.println("time interceptor耗时" + (new Date().getTime() - start));//当无异常的时候,e的值为null,有自定义异常时,也会为NullSystem.out.println(e);}
}

需要在配置类中声明才能使用,继承WebMvcConfigurerAdapter

//告诉spring这是一个配置类 
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{@Overridepublic void addInterceptors(InterceptorRegistry registry) {//注册当前的拦截器registry.addInterceptor(new TimeInterceptor());}
}

Aspect切片使用

/*** Created by GAOMINGQIAN on 2017/12/10.*/
@Aspect
@Component
public class TimeAspect {//around中的execution中的内容代表对哪些方法进行拦截@Around("execution(* study.security.web.controller.UserController.*(..))")public Object handlerControllerMethod(ProceedingJoinPoint pjp) throws Throwable {System.out.println("time aspect start");//获取执行方法的参数Object[] args = pjp.getArgs();long start = new Date().getTime();//执行拦截的方法  result为拦截方法的返回值Object result = pjp.proceed();System.out.println("time aspect 耗时:" + (new Date().getTime() - start));return result;}
}

ControllerAdvice,主要用于异常处理的控制器

/*** Created by GAOMINGQIAN on 2017/12/10.*/
@ControllerAdvice
public class ControllerHandlerException {@ExceptionHandler(UserNotExistException.class)@ResponseBody@ResponseStatus(HttpStatus.BAD_REQUEST)public Map<String, Object> handleUserNotExistException(UserNotExistException ex) {Map<String, Object> result = new HashedMap();//放置需要响应的内容result.put("message",ex.getMessage());return result;}
}

优缺点介绍:

   Filter过滤器:可以拿到request,response但是拿不到处理方法的信息

   Interceptor拦截器:可以拿到request,response,也可以拿到处理方法的信息,但是拿不到处理方法参数的值

   Aspect切片:可以拿到处理方法的所有信息,但是拿不到request,response

 

这篇关于五十、Filter过滤器,Interceptor拦截器,ControllerAdvice,Aspect切片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/977632

相关文章

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

mybatis用拦截器实现字段加解密全过程

《mybatis用拦截器实现字段加解密全过程》本文通过自定义注解和MyBatis拦截器实现敏感信息加密,处理Parameter和ResultSet,确保数据库存储安全且查询结果解密可用... 目录前言拦截器的使用总结前言根据公司业务需要,灵活对客户敏感信息进行加解密,这里采用myBATis拦截器进行简单实

SpringBoot集成MyBatis实现SQL拦截器的实战指南

《SpringBoot集成MyBatis实现SQL拦截器的实战指南》这篇文章主要为大家详细介绍了SpringBoot集成MyBatis实现SQL拦截器的相关知识,文中的示例代码讲解详细,有需要的小伙伴... 目录一、为什么需要SQL拦截器?二、MyBATis拦截器基础2.1 核心接口:Interceptor

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

SpringBoot项目Web拦截器使用的多种方式

《SpringBoot项目Web拦截器使用的多种方式》在SpringBoot应用中,Web拦截器(Interceptor)是一种用于在请求处理的不同阶段执行自定义逻辑的机制,下面给大家介绍Sprin... 目录一、实现 HandlerInterceptor 接口1、创建HandlerInterceptor实

Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实