listener跟filter

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xionghuilin123/article/details/51074575

  一直忙着项目功能的开发,对于项目开发中使用中知识点没有系统的学习总结。今日得闲,看博客的时候看到 listener跟filter。想到之前朋友去面试,面试官问过这样一个问题。

知道listener跟filter吗?知道。了解他们的底层实现吗。嗯............。  很多情况下,我们对知识都只是一知半解,知道怎么使用,而不清楚怎么实现的。下面说一说我自己的见解,有什么理解不清楚的地方,还望各位指点跟拍砖!!!!!

  listener跟filter都属于servlet体系,两者用途不同,所以实现方式也不一样。

 listener:监听器。一般在web开发,在web.xml配置我们所需要的listener

<listener><listener-class>xxxxxx</listener-class></listener>  查看源码不难发现所有listener类都间接或直接实现interface EventListener 。EventListener中没有初始方法。

该类的作用只是告诉servlet容器这是一个listener。我们常用的有HttpSessionListener  有两个方法 sessionCreate ,SessionDestory。

filter:过滤器。在web.xml配置我们所需的filter不是 针对对应的url-mapping

<filter>

<filter-name>xxxxx</filter-name>

<filter-class>xxxx</filter-class>

<init-param>
<param-name>xxx</param-name>
<param-value>xxx</param-value>
</init-param>

</filter>

<filter-mapping>

        <filter-name>xxx</filter-name>

<url-pattern>xxx</url-pattern>

</filter-mapping>

<init-param>可以要,可以不要。

所有的filter都实现interface Filter

public interface Filter {

public void init(FilterConfig filterConfig) throws ServletException;


       public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException;


public void destroy();

}

可以看到默认声明三个方法

这个三个方法执行的顺序是 ,当servlet启动的时候会初始化init    filter 客户端有请求的时候我们执行dofilter,  destory()销毁改servlet

filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链).

一个Filter包括:

1)、在servlet被调用之前截获;

2)、在servlet被调用之前检查servlet request;

3)、根据需要修改request头和request数据;

4)、根据需要修改response头和response数据;

5)、在servlet被调用之后截获.

 服务器每次只调用setFilterConfig方法一次准备filter 的处理;调用doFilter方法多次以处理不同的请求.FilterConfig接口有方法可以找到filter名字及初始化参数信息.服务器可以设置 FilterConfig为空来指明filter已经终结。

每一个filter从doFilter()方法中得到当前的request及response.在这个方法里,可以进行任何的针对request及 response的操作.(包括收集数据,包装数据等).filter调用chain.doFilter()方法把控制权交给下一个filter.一个 filter在doFilter()方法中结束.如果一个filter想停止request处理而获得对response的完全的控制,那它可以不调用下 一个filter。

可以通过filter来转换请求的编码


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章