过滤器(Filter)和拦截器(Interceptor)区别和联系

过滤器(Filter)和拦截器(Interceptor)的比较

一、过滤器(Filter)

1、简述

过滤器通过实现Filter接口,实现了过滤器的三个方法,分别是’初始化方法’,‘dofilter方法’和’销毁方法’,随着容器的启动和销毁而初始化和销毁,依赖于servlet容器,过滤器拦截的是地址栏请求,过滤器实在进入容器后执行的servlet之前后执行,针对的在处理业务之前的操作。

chain.doFilter(request, response)

这个方法的调用作为分水岭。事实上调用Servlet的doService()方法是在这个方法中进行的

2、代码实现

public class Filter1 implements Filter {
    public void destroy() {
        // TODO Auto-generated method stub
        System.out.println("过滤器1销毁方法");
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        System.out.println("过滤器1,客户端向Servlet发送的请求被我拦截到了,设置请求编码");
        chain.doFilter(request, response);
        System.out.println("过滤器1,Servlet向客户端发送的响应被我拦截到了,设置相应编码");
    }
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub
        System.out.println("过滤器1初始化方法");
    }
}

3、xml配置

<filter>
      <filter-name>filterDemo1</filter-name>
      <filter-class>com.thit.filters.Filter1</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>filterDemo1</filter-name>
      <url-pattern>/*</url-pattern>
      <!-- /*是对所有的文件进行拦截 -->
  </filter-mapping>
 

拦截器

1、简述

是基于Java的jdk动态代实现的,实现HandlerInterceptor接口。不依赖于servlet容器,拦截器针对于contraller方法,并且能获取到所有的类,对类里面所有的方法实现拦截,粒度更小,拦截器中可以注入service,也可以调用业务逻辑

2、代码实现

public class LoginInterceptor implements HandlerInterceptor{
    
    //预处理1.程序先执行preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方法,否则将不再向下执行。
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)    throws Exception {
        System.out.println("1:拦截器1,程序进入preHandle方法");
        User u=(User) request.getSession().getAttribute("user");
        if(u==null) {
            System.out.println("在进入方法之前判断session的用户是否为空!");
            System.out.println("地址:"+request.getContextPath());
            //http://localhost:8080/login
            response.sendRedirect(request.getContextPath()+"/login");
            return false;
        }
        return true;
    }
       2.在业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向客户端返回响应。
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
            System.out.println("2:拦截器1,程序进入postHandle方法");        
    }
  3.在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub
        System.out.println("3:拦截器1,程序进入afterCompletion方法");
        
    }
}
拦

3、xml配置

<mvc:interceptors>
        <!--拦截器1 -->
        <mvc:interceptor>
            <!--拦截不同的controller方法  -->
            <!-- <mvc:mapping path="/users/search"/>
            <mvc:mapping path="/users/updatepwd"/>
            <mvc:mapping path="/users/search"/> -->
            
            
            <!--通配符  拦截子节点和孙节点 -->
            <mvc:mapping path="/users/**"/>
            <!--在使用通配符的过程中 排除指定拦截 -->
            <mvc:exclude-mapping path="/users/search"/>
            <bean class="com.thit.interceptor.LoginInterceptor"></bean>
        </mvc:interceptor>
 </mvc:interceptors>

总结

两者都是AOP编程思想的实现,都能够实现权限控制和日志记录等问题的处理,但是两者粒度不同拦截对象不一样

适用范围不同:Filter是servlet的规范,只能用于web程序,但是拦截器可以用于application等程序。

规范不同:Filter是servlet的规范。但是Interceptor是spring容器支撑,有spring框架支持。

使用资源不一样:spring的拦截器由于依赖spring,也是spring的一个组件,因此能够在拦截器中使用spring的任何资源和对象。例如service对象,数据源,事务管理等,通过ioc注入拦截器即可,而filter不能

粒度不同:Filter只能在servlet的前后起作用,而拦截器能在方法前后异常前后执行,更加灵活,粒度更小,spring框架程序优先使用拦截器。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值