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>
  • 相关阅读:
    解决ListView异步加载数据之后不能点击的问题
    android点击实现图片放大缩小 java技术博客
    关于 数据文件自增长 的一点理解
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Linux 超级用户的权利
    RAC 实例 迁移到 单实例 使用导出导入
    Shell 基本语法
    Linux 开机引导与关机过程
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Oracle RAC + Data Guard 环境搭建
  • 原文地址:https://www.cnblogs.com/mxh-java/p/12638455.html
Copyright © 2011-2022 走看看