JAVAWeb开发之Servlet Filter技术
1、Filter 原理
Filter(过滤器)是拦截 Request 请求的对象:在用户的请求访问资源前处理 ServletRequest 以及 ServletRespons。
实际上 Filter 拦截的本质是对 URL访问的拦截。
重要应用:权限控制。
Interface Filter 接口中定义了三个方法:
1. init ( FilterConfig filterConfig )
2. doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
3. destroy()
2、编写第一个Filter
- 创建资源(hello.jsp)
- 创建类(MyFilter),实现Filter接口(实现接口中三个方法)
- 在 web.xml 中注册过滤器,配置被 Filter 拦截的资源的路径:
- 启动服务器,访问hello.jsp资源
<!--注册Filter过滤器,并定义过滤器name -->
<filter>
<filter-name>MyFilter</filter-name>
<!--filter-class 为包路径.类名-->
<filter-class>filter.MyFilter</filter-class>
</filter>
<!--配置目标资源-->
<filter-mapping>
<filter-name>MyFilter</filter-name>
<!--被拦截资源路径-->
<url-pattern>/hello.jsp</url-pattern>
</filter-mapping>
程序执行结果(生命周期):
1、启动服务器时,Filter对象被创建,执行过滤器init 方法(只执行一次) ;
2、访问hello.jsp :过滤器中doFilter方法获得执行(每请求一次,doFilter 方法执行一次),但是页面并未显示资源内容;
*原因:资源被 Filter 对象拦截,目标资源没有被访问。此时Filter对象和资源(hello.jsp)组成了一个请求调用链 FilterChain;如果想要访问目标资源,需要在doFilter方法中调用filterChain.doFilter(servletRequest,servletResponse);
来访问FilterChain链上的下一个资源;
3、关闭服务器,执行 destroy()方法(只执行一次)。
3、filter-mapping的配置注意事项
多个Filter过滤器
web应用中任意一个资源可以实现多个Filter接口,程序根据<filter>、<filter-mapping>
顺序执行filter拦截;
一个过滤器也可以过滤多个web资源在<filter-mapping>中配置多个<url-pattern>即可
;
过滤Servlet
在 filter-mapping 中存在 url 和 name两种配置方式,都可以过滤 Servlet
<url-pattern>/hello</url-pattern>
<servlet-name>HelloServlet</servlet-name>
<dispatcher>
标签及意义
配置在什么情况下、在什么调用方式下拦截目标资源 ?
服务器调用资源四种方式:request(默认),forward、include、error
request — 在请求时过滤
forward — 在转发时过滤
include — 在包含时过滤
error — 在错误页面跳转时过滤