聊聊面试中的过滤器与拦截器

简介: 聊聊面试中的过滤器与拦截器

背景



做过 JavaWeb 开发的对过滤器和拦截器肯定不会陌生,而且也会熟练的使用,但是关于过滤器和拦截器具体的区别和差异可能不是特别的了解,这篇文章就跟大家介绍下过滤器和拦截器的区别。


过滤器 Filter



首先介绍下什么是过滤器,过滤器英文叫 Filter,是 JavaEE 的标准,依赖于 Servlet 容器,使用的时候是配置在 web.xml 文件中的,可以配置多个,执行的顺序是根据配置顺序从上到下。常用来配置请求编码以及过滤一些非法参数,垃圾信息或者是网站登录验证码。


    <!-- filter -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- filter end -->


参考实现


public class CaptchaFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {
    }
    public void destroy() {
    }
    public void doFilter(ServletRequest servletRequest,
            ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String servletPath = request.getServletPath();
        //获取验证码
        if(servletPath.matches("/captcha.jpg")) {
            response.setContentType("image/jpeg");
            //禁止图像缓存。
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
            //参数:宽、高、字符数、干扰量
            CaptchaProductor vCode = new CaptchaProductor(70,30,4,75);
            //根据token保存验证码内容
            CaptchaBean bean = new CaptchaBean();
            bean.setCaptcha(vCode.getCode());
            bean.setCreateTime(new Date());
            HttpSessionUtils.setSessionValue(request, "sessionCaptcha", bean);
            vCode.write(response.getOutputStream());
            return;
        }
    }
}


过滤器的实现可以通过实现 Filter 接口或者继承 Spring 的org.springframework.web.filter.OncePerRequestFilter 来实现。


拦截器 Interceptor



拦截器 Interceptor 不依赖 Servlet 容器,依赖 Spring 等 Web 框架,在 SpringMVC 框架中是配置在SpringMVC 的配置文件中,在 SpringBoot 项目中也可以采用注解的形式实现。拦截器是 AOP 的一种应用,底层采用 Java 的反射机制来实现的。与过滤器一个很大的区别是在拦截器中可以注入 Spring 的 Bean,能够获取到各种需要的 Service 来处理业务逻辑,而过滤器则不行。


    <!-- 拦截器 -->
    <mvc:interceptors>
        <!-- 多个拦截器,顺序执行 -->
        <bean class="com.test.admin.interceptor.AuthInterceptor"/>
    </mvc:interceptors>


参考实现


public class AuthInterceptor extends HandlerInterceptorAdapter {
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //todo
        super.postHandle(request, response, handler, modelAndView);
    }
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //todo 
        return super.preHandle(request, response, handler);
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}


拦截器的实现可以通过继承org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 来实现。


执行顺序



因为我们的过滤器和拦截器都可以配置多个,那么关于各自的执行顺序是什么样子的呢?


过滤器的执行顺序首先跟在 web.xml 中配置的顺序有关,先配置的先执行,但是并不是说是等上一个过滤器执行结束了再执行下一个,它们之间是通过链来执行的,具体的过滤器和拦截器的执行过程我画了个图,可以看下。


image.png


小结


今天简单的给大家介绍了过滤器和拦截器的区别和使用,希望对大家有帮忙。平时的工作中可能这些东西都是组长或者架构师搭建好的,自己只关注业务逻辑,但是很多时候我们还是要知其然知其所以然,多了解一些对自己是很有帮助的。


598)]


小结


今天简单的给大家介绍了过滤器和拦截器的区别和使用,希望对大家有帮忙。平时的工作中可能这些东西都是组长或者架构师搭建好的,自己只关注业务逻辑,但是很多时候我们还是要知其然知其所以然,多了解一些对自己是很有帮助的。


关于过滤器与拦截器,你学废了么?

目录
相关文章
|
4月前
|
Java 应用服务中间件 数据安全/隐私保护
面试官:过滤器Filter和拦截器Interceptors有什么区别?
面试官:过滤器Filter和拦截器Interceptors有什么区别?
32 0
|
2月前
|
消息中间件 前端开发 Java
面试官:SpringCloudGateway过滤器类型有哪些?
面试官:SpringCloudGateway过滤器类型有哪些?
49 1
|
9月前
|
安全 Java 应用服务中间件
一脸懵逼,面试官:过滤器和拦截器有啥区别?
这个是不久前在面试的时候遇到的一个问题,当时直接懵了,两个单拎出来,虽然不太完全,但都大概知道可以对请求进行拦截,放在一起比较,可真是头疼。 其实之前面试完就去学习了一波,只不过那个时候没及时总结,现在总结一下,以免日后遇到这类问题又给忘咯。
|
10月前
|
前端开发 Java Spring
|
Java C++ Spring
面试突击90:过滤器和拦截器有什么区别?
面试突击90:过滤器和拦截器有什么区别?
145 0
|
26天前
|
Java 程序员
java线程池讲解面试
java线程池讲解面试
49 1
|
2月前
|
存储 关系型数据库 MySQL
2024年Java秋招面试必看的 | MySQL调优面试题
随着系统用户量的不断增加,MySQL 索引的重要性不言而喻,对于后端工程师,只有在了解索引及其优化的规则,并应用于实际工作中后,才能不断的提升系统性能,开发出高性能、高并发和高可用的系统。 今天小编首先会跟大家分享一下MySQL 索引中的各种概念,然后介绍优化索引的若干条规则,最后利用这些规则,针对面试中常考的知识点,做详细的实例分析。
246 0
2024年Java秋招面试必看的 | MySQL调优面试题
|
2月前
|
存储 算法 Java
铁子,你还记得这些吗----Java基础【拓展面试常问题型】
铁子,你还记得这些吗----Java基础【拓展面试常问题型】
46 1
|
2月前
|
NoSQL Java 关系型数据库
凭借Java开发进阶面试秘籍(核心版)逆流而上
最近参加了面试或者身边有朋友在面试的兄弟有没有发现,现在的面试不仅会问八股文,还会考察框架、项目实战、算法数据结构等等,需要准备的越来越多。 其实面试的时候,并不是要求你所有的知识点都会,而是关键的问题答到点子上!这份《Java 开发进阶面试秘籍(核心版)》由 P8 面试官整体把控,目前已经更新了 30 万字! 资料中涵盖了一线大厂、中小厂面试真题,毕竟真题都是技术领域最经典的基础知识和经验沉淀的汇总,非常有必要学习掌握!双重 buff 叠加,offer 接到手软~ 点击此处取,这可能是你到目前为止领取的最具含金量的一份资料! 整套资料涵盖:Spring、Spring
|
2月前
|
存储 缓存 Java
面试官:什么是Java内存模型?
面试官:什么是Java内存模型?
111 0
面试官:什么是Java内存模型?