开发者

解读过滤器(Filter)和拦截器(Interceptor)的使用

目录
  • 1、定义介绍
    • 1.1、过滤器Filter
    • 1.2、拦截器Interceptor
  • 2、实现方式
    • 2.1、过滤器实现方式
    • 2.2、拦截器实现方式
  • 3、两者联系与区别
    • 3.1、联系
    • 3.2、区别
  • 4、总结

    关于SpringMVC的完整执行流程,可如下图所示:

    解读过滤器(Filter)和拦截器(Interceptor)的使用

    整体的流程如下所示:

    Request请求-->filterInit--->dofilter--->dispatcherServlet---->InterceptorPrehandler--->Controller-------InterceptorPosthandler------>dispatcherServlet---InterceptorAftercomption-->filterDestroy

    解读过滤器(Filter)和拦截器(Interceptor)的使用

    关于过滤器和拦截器在web容器里面的先后顺序,可参考如下所示:

    解读过滤器(Filter)和拦截器(Interceptor)的使用

    下面重点介绍下两者的区别和联系。

    1、定义介绍

    1.1、过滤器Filter

    1、定义

    是 Servlet 规范规定的,在 Servlet 前执行的,用于拦截和处理 HTTP 请求和响应。拦截的是request请求,基于回调,拦截的是地址,粒度很大。

    2、方法

    通过实现Filter接口,分别是初始化方法dofilter方法和销毁方法随着容器的启动和销毁而初始化和销毁,依赖于servlet容器。

    过滤器拦截的是地址栏请求,过滤器实在进入容器后执行的servlet之前后执行,针对的在处理业务之前的操作。

    chain.doFilter(request, response);这个方法的调用作为分水岭。事实上调用Servlet的DOService()方法是在这个方法中进行的。

    3、位置

    位于整个请求处理流程的最前端,因此在请求到达 Controller 层前,都会先被过滤器处理。可以拦截多个请求或响应一个请求或响应也可以被多个过滤器拦截

    4、使用场景

    可用于身份认证、授权、日志记录和设置字符集(CharacterEncodingFilter)等场景。

    1.2、拦截器Interceptor

    1、介绍

    基于Java的jdk动态代实现的,实现HandlerInterceptor接口,不依赖于servlet容器。

    拦截器针对于controller方法,并且能获取到所有的类,对类里面所有的方法实现拦截,粒度更小,拦截器中可以注入service,也可以调用业务逻辑

    2、方法

    实现HandlerInterceptor接口。重写preHandle()、postHandle()、afterCompletion();

    3、执行顺序

    解读过滤器(Filter)和拦截器(Interceptor)的使用

    执行结果如下:

    /*

    0:过滤器1的初始化方法

    1:过滤器1,客户端向Servlet发送的请求被我拦截到了

    2:拦截器1的前置方法 preHandle

    3:拦截器2的前置方法 preHandle

    4: controller主方法

    5:拦截器2的后置方法postHandle(在controller主方法执行之后执行)

    6:拦截器1的后置方法postHandle(在controller主方法执行之后执行)

    7:拦截器2的完成后方法afterCompletion(在DispatcherServlet处理完请求后,才会执行)

    8:拦截器1的完成后方法afterCompletion(在DispatcherServlet处理完请求后,才会执行)

    9:过滤器1,Servlet向客户端发送的响应被我拦截到了

    10:过滤器的销毁方法

    */

    2、实现方式

    2.1、过滤器实现方式

    1、通过@WebFilter注解(Servlet 3.0+)

    @WebFilter(urlPatterns = "/*", filterName = "myFilter")
    public class MyFilter implements Filter {
        
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            // 初始化代码
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, 
                             FilterChain chain) throws IOException, ServletException {
            // 前置处理
            System.out.javascriptprintln("Before Filter");
            
            // 执行后续过滤器或Servlet
    android        chain.doFilter(request, response);
            
            // 后置处理
            System.out.println("After Filter");
        }
    
        @Override
        public void destroy() {
            // 销毁代码
        }
    }

    2、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>

    多个Filter的执行顺序:

    • 注解方式:按类名字母顺序执行
    • web.xml方式:<filter-mapping>定义的顺序执行

    2.2、拦截器实现方式

    1:实现WebMvcConfigurer接口(Spring 5+推荐)

    //拦截器1
    public class LoginInterceptor implements HandlerInterceptor{
    	
     
    	//预处理1.程序先执行preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方法,否则将不再向下执行。
    	public boolean preHahttp://www.devze.comndle(HttpServletRequest request, HttpServletResponse response, Object handler)
    			throws Exception {
    		// TODO Auto-generated method stub
    		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://localhowww.devze.comst: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 {
    		// TODO Auto-generated method stub
    		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方法");
    		
    	}
     
    }
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new MyInterceptor())
                    .addPathPatterns("/**")  // 拦截所有路径
                    .excludePathPatterns("/login"); // 排除登录路径
            
            // 可以添加多个拦截器
            registry.addInterceptor(new AnotherInterceptor())
                    .addPathPatterns("/admin/**");
        }
    }

    2:XML配置

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/login"/>
            <bean class="com.example.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

    3、两者联系与区别

    3.1、联系

    解读过滤器(Filter)和拦截器(Interceptor)的使用

    3.2、区别

    解读过滤器(Filter)和拦截器(Interceptor)的使用

    解读过滤器(Filter)和拦截器(Interceptor)的使用

    4、总结

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

    • 1、适用范围不同

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

    • 2、规范不同:

    Filter是servlet的规范。但是Interceptor是Spring容器支撑,有Spring框架支持。

    • 3、使用资源不一样:

    Spring的拦截器由于依赖Spring,也是Spring的一个组件,因此能够在拦截器中使用Spring的任何资源和对象。

    例如Service对象,数据源,事务管理等,通过ioc注入拦截器即可,而filter不能.

    • 4、粒度不同:android

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

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜