阅读 107

SpringMVC中的过滤器和拦截器(springmvc拦截器实现)

一、过滤器

过滤器Filter是通过实现java.servlet.filter接口实现过滤器功能,作用是用于对传入的request和响应的response进行一些处理,比如对请求参数进行校验,或者设置、检验头部信息,再或者对一些非法行为进行校验。由实现的接口可知,过滤器是依赖于servlet容器。所以由于过滤器不依赖于spring容器,它也就无法获取到容器中的对象。

创建一个过滤器类继承java.servlet.filter接口,实现filter中的拦截方法,其中还有初始化方法和销毁方法。

package com.example.demo.modules.filter; import javax.servlet.*; import java.io.IOException; /**  * @Description:  * @date :  2020/6/9  */ public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 过滤器的具体执行方法 } @Override public void destroy() { } } 复制代码

  1. 把创建的过滤器类加入过滤器链中,添加一些相关的配合项后注入到Spring容器中。

package com.example.demo.modules.filter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.servlet.Filter; /**  * 创建一个过滤器myFilter,并且添加到FilterRegistrationBean过滤器链中  * @Description:  * @date :  2020/6/9  */ @Configuration public class ConfigBean { @Bean public FilterRegistrationBean filterRegistrationBean(){ FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(myFilter()); filterRegistrationBean.setName("myFilter"); filterRegistrationBean.addUrlPatterns("/*"); filterRegistrationBean.setOrder(1); //filterRegistrationBean.setInitParameters(); return filterRegistrationBean; } @Bean public Filter myFilter(){ return new MyFilter(); } } 复制代码

二、拦截器

拦截器Interceptor是通过实现org.springframework.web.servlet包的HandlerInterceptor接口实现,这个接口是spring容器的接口,所以它是依赖于spring容器的。主要作用是AOP的思想,可以对某一个方法进行横切,做一些业务逻辑。

1.编写自定义拦截器类

/**  * @Description:  * @date :  2020/6/9  */ @Slf4j public class CustomHandlerInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { log.info("请求调用之前"); return false; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { log.info("请求调用之后"); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { log.info("afterCompletion:请求调用完成后回调方法,即在视图渲染完成后回调"); } } 复制代码

2.注册自定义拦截器

/**  * 在spring2.0中WebMvcConfigurerAdapter已经过时,这里只是为了演示效果,  * 有兴趣可以看下spring2.0中的WebMvcConfigurer  * @Description:  * @date :  2020/6/9  */ @Configuration public class WebMvcConfigurer extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { //super.addInterceptors(registry); registry.addInterceptor(getHandlerInterceptor()).addPathPatterns("/*"); } @Bean public static HandlerInterceptor getHandlerInterceptor(){ return new CustomHandlerInterceptor(); } } 复制代码

过滤器和拦截器执行过程图

在请求到达容器前,进入Filter过滤器链,执行完过滤器链上每个Filter#doFilter()方法后,进入Servlet#service()方法,然后由dispatcher分发器将请求方法给对应映射成功的处理器controller,在进入controller具体方法之前,会被先进入Interceptor#preHandler()方法,然后再进入controller的具体返回,执行之后进入Interceptor#postHandler()这里主要是拦截了controller方法执行之后到返回的数据模型到达视图解析器之前,接着进入Interceptor#afterCompletion()方法,主要可以操作返回客户端之前的逻辑,最后返回到过滤链中各个Filter的调用点,可以处理返回到客户端的跳转等逻辑。

三、小结

过滤器是servlet中的接口,主要可以用于在请求进入到servlet之前拦截请求HttpServletRequest并根据需要进行一些检查等逻辑操作,也可以在HttpServletResponse返回到客户端之前进行一些逻辑操作。

拦截器是spring中的接口,所以它可以获取到spring中的一些bean和其他的一些资源,在面向切面编程中应用比较广,拦截其实就是一种AOP策略。


作者:不懂技术的小菜鸟
链接:https://juejin.cn/post/7065111385247580196


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐