一直忙着项目功能的开发,对于项目开发中使用中知识点没有系统的学习总结。今日得闲,看博客的时候看到 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来转换请求的编码