zoukankan      html  css  js  c++  java
  • Java 过滤器和拦截器的区别

    昨天晚上做梦,梦见面试官问我过滤器和拦截器的区别。。。

    过滤器和拦截器的区别:
    1、过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。
    请求结束返回也是,是在servlet处理完后,返回给前端之前。
    2、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,
    spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。
    而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。
    3、过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射,代理分静态代理和动态代理,
    动态代理是拦截器的简单实现。

    何时使用拦截器?何时使用过滤器?
    如果是非spring项目,那么拦截器不能用,只能使用过滤器。
    如果是处理controller前后,既可以使用拦截器也可以使用过滤器。
    如果是处理dispaterServlet前后,只能使用过滤器。

    过滤器注解实现:

    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;
    
    /**
     * @author maxixnhai
     * @PackageName www.maxinhai.com.diary.common.filter
     * @ClassName AuthFilter
     * @Description
     * @date 2020/4/5 17:41
     */
    @WebFilter(urlPatterns = "/*", filterName = "authFilter")
    public class AuthFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            long start = System.currentTimeMillis();
            Object name = request.getParameter("name");
            System.out.println("name => " + name);
            for(int i=0; i<10000; i++) {
                //System.out.println("过滤器打印: " + i);
            }
            long end = System.currentTimeMillis();
            System.out.println("authFilter 耗时: " + (end - start));
        }
    
        @Override
        public void destroy() {
    
        }
    
    }

    注解实现需要在启动器(本文为SpringBoot) 添加 @ServletComponentScan("www.maxinhai.com.diary.common") 扫描过滤器。

    非注解实现的话,需要在web.xml添加如下配置:

    <!-- 配置登陆过滤器 -->
        <filter>
            <filter-name>authFilter</filter-name>
            <filter-class>www.maxinhai.com.filter.AuthFilter</filter-class>
            <init-param>
                <param-name>passUrl</param-name>
                <param-value>index;FunctionServlet</param-value>
               </init-param>
        </filter>
        
        <filter-mapping>
            <filter-name>loginFilter</filter-name>
               <url-pattern>/*</url-pattern>
        </filter-mapping>
  • 相关阅读:
    [转]html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法
    [转]html5 Canvas画图教程(5)—canvas里画曲线之arc方法
    [转]html5 Canvas画图4:填充和渐变
    [转]html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
    [转]html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
    【Java进阶】Maven 简介
    【Java入地】Spring 的 作用域 & MVC & SSM
    【Linux】Kali 物理机安装笔记、简单过程及注意事项
    【电脑维修】 显卡错误(错误代码:43)
    【Linux】 编程环境搭建 JDK、Node.js、Npm、Yarn、Redis、Maven的安装与搭建
  • 原文地址:https://www.cnblogs.com/mxh-java/p/12638455.html
Copyright © 2011-2022 走看看