J2EE基础知识-filter与servlet

参考文章:servlet 和 filter执行顺序

 

Filter

Servlet

接口

实现Filter接口

实现Servlet接口

使用步骤

1、创建类,继承接口

2、实现方法

init()、doFilter()、destroy()

3、配置WEB-INF/web.xml

1、创建类,继承接口

2、实现方法

init()、ervice()、destroy()、getServletConfig()、getServletInfo()

3、配置WEB-INF/web.xml

初始化时间

Servlet容器启动之后即初始化

Servlet类被调用之后初始化、先于Filter调用。

初始化可以在容器启动后被调用但需要配置。

调用顺序

1. 按照web.xml中的映射配置顺序按照配置条件从后向前调用

2. 通过调用doFilter()中的doFilterInternal()依次调用其它filterdoFilter()方法,直至调用到 FilterChain.doFilter()
(依次调用的方式,相当于递归调用)

3. 进入FilterChain.doFilter(),就是调用Servlet中的 service()

4. service() 执行完毕后,层次调用doFilter()FilterChain.doFilter()之后的方法,顺序与之前的相反

  1.按照web.xml中的映射配置顺序按照配置条件从后向前调用第一个满足条件的Servlet

2.调用之前事先执行满足条件的Filter,不存在层次调用Servlet问题

销毁

服务器停止后销毁,晚于Servlet销毁之后

服务器停止后销毁

作用

1. 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest

2. 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。

3. 在HttpServletResponse到达客户端之前,拦截HttpServletResponse

4. 根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

主要是处理客户端的请求并将其结果发送到客户端。

注:

  1.  Servlet是先于Filter创建,先于Filter销毁,但晚于 Filter 调用。
  2. OncePerRequestFilter记住这个类,此类是许多功能Filter的父类,其 doFilter() 值得打断点,看内容。(spring、shiro 都有相同名称的类,而且功能相近)
  3. 注意OncePerRequestFilter 方法的功能,以下是简化代码后的 doFilter()方法
    查看代码
    
    public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
    			throws ServletException, IOException {
        
    		if (skipDispatch(**) || shouldNotFilter(**)) {
    			// 此方法是进入Servlet方法(也就是具体的业务)
    			filterChain.doFilter(request, response);
    		}else if (hasAlreadyFilteredAttribute) {
    			// 此方法是进入Servlet方法(也就是具体的业务)
    			filterChain.doFilter(request, response);
    		}
    		else {
    			// 此方法是调用其它 filter 的 doFilter() 方法
    			doFilterInternal(httpRequest, httpResponse, filterChain);
    		}
    	}

     

posted @ 2022-06-25 22:48  之士咖啡  阅读(52)  评论(0编辑  收藏  举报