五十、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

相关文章

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置

布隆过滤器的详解与应用

一、什么是Bloom Filter Bloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个Hash函数将这个元素映射成一个位阵列(Bit array)中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检索元素一定不在;如果都是1,则被检索元素很可能在。这就是布隆过滤器的基本思

请解释Java Web应用中的前后端分离是什么?它有哪些好处?什么是Java Web中的Servlet过滤器?它有什么作用?

请解释Java Web应用中的前后端分离是什么?它有哪些好处? Java Web应用中的前后端分离 在Java Web应用中,前后端分离是一种开发模式,它将传统Web开发中紧密耦合的前端(用户界面)和后端(服务器端逻辑)代码进行分离,使得它们能够独立开发、测试、部署和维护。在这种模式下,前端通常通过HTTP请求与后端进行数据交换,后端则负责业务逻辑处理、数据库交互以及向前端提供RESTful

Hbase Filter+Scan 查询效率优化

Hbase Filter+Scan 查询效率问题 众所周知,Hbase利用filter过滤器查询时候会进行全表扫描,查询效率低下,如果没有二级索引,在项目中很多情况需要利用filter,下面针对这种情况尝试了几种优化的方案,仅供参考,欢迎交流。 根据业务要求,作者需要根据时间范围搜索所需要的数据,所以作者设计的rowKey是以时间戳为起始字符串的。 正确尝试: 1.scan 设置 开始行和结

智能工厂程序设计 之1 智能工厂都本俱的方面(Facet,Aspect和Respect)即智能依赖的基底Substrate 之1

Q1、昨天分别给出了三个智能工厂的 “面face”(里面inter-face,外面outer-face和表面surface) 以及每个“面face” 各自使用的“方”(StringProcessor,CaseFilter和ModeAdapter)  。今天我们将继续说说三个智能工厂的“方面” 。在展开之前先看一下三个单词:面向facing,取向oriented,朝向toword。理解这三个词 和

.NET 自定义过滤器 - ActionFilterAttribute

这个代码片段定义了一个自定义的 ASP.NET Core 过滤器(GuardModelStateAttribute),用于在控制器动作执行之前验证模型状态(ModelState)。如果模型状态无效,则构造一个 ProblemDetails 对象来描述错误,并返回一个 BadRequest 响应。 代码片段: /// <summary>/// 验证 ModelState 是否有效/// </

Redis缓存 自定义注解+aspect+反射技术实现

最近再给云随笔后台增加redis模块,突然发现spring-boot-starter-data-redis模块很不人性化,实现不了通用的方式,(当然,你也可以自己写个通用的CacheUtil来实现通用的方式),但由于本人非常的爱装逼,就在这里不讲解那种傻瓜式操作了,这里只讲干货,干到你不可置信的干货). 例如:这里我使用了它其中的RedisTemplate ,发现存到redis中后,数据

Filter基本原理和使用

https://www.cnblogs.com/xdp-gacl/p/3948353.html 一、Filter简介   Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控

【SpringMVC学习09】SpringMVC中的拦截器

Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用方法。 1. springmvc拦截器的定义和配置 1.1 springmvc拦截器的定义 在springmvc中,定义拦截器要实现HandlerInterceptor接口,并实现该接口中提供的

水处理过滤器运行特性及选择原则浅谈

过滤属于流体的净化过程中不可缺的处理环节,主要用于去除流体中的颗粒物或其他悬浮物。水处理过滤器的原理是利用有孔介质,从流体中去除污染物,使流体达到所需的洁净度水平。         水处理过滤器的滤壁是有一定厚度的,也就是说过滤器材具有深度,以“弯曲通 道”的形式对去除污染物起到了辅助作用。过滤器是除去液体中少量固体颗粒的设备,当流体进入置有一定规格滤网的滤筒后,其杂质被阻挡,而