web过虑器
周sir |
2016年12月2日 |
Servlet与Jsp |
0 条评论 | 1857
过滤器 (Filter)是服务端实现 javax.servlet.Filter 的 Java 类,用来截取客户端请求和服务器响应。它可以在请求到达后端资源之前拦截,也可以在响应写回客户端之前再处理一遍。
配置写在 web.xml:生命周期是实例化 → init() → 多次 doFilter() → destroy()。多个过滤器会按映射顺序组成过滤链。
和监听器不同,过滤器一定要调用 chain.doFilter() 才能把请求交给下一个环节;不调用就等于截断。
一、过滤器定义
二、工作原理
请求进入容器后,先经过过滤器链,再到达 Servlet / JSP;响应沿原路返回,过滤器可以在返回路径上再次加工。
三、过滤器配置与生命周期
实例化 web.xml 加载时
初始化 init()
过滤 doFilter() // 每个匹配请求都会进
销毁 destroy()
web.xml 各节点含义:
<filter> 指定一个过滤器
<filter-name> 过滤器名字,不能为空
<filter-class> 完整限定类名
<init-param> 初始化参数;子元素 param-name / param-value
代码里用 FilterConfig 读取
<filter-mapping> 该 Filter 拦截哪些资源
<filter-name> 必须对应上面声明过的名字
<url-pattern> 拦截的请求路径
<servlet-name> 或按 Servlet 名称拦截
过滤器类最小骨架:
public class LoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// place your code here
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
对应的 web.xml 配置(两个过滤器都映射 /*):
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.ittx.test.LoginFilter</filter-class>
<init-param>
<param-name>test-param</param-name>
<param-value>Initialization Paramter</param-value>
</init-param>
</filter>
<filter>
<filter-name>AuthenFilter</filter-name>
<filter-class>com.ittx.test.AuthenFilter</filter-class>
<init-param>
<param-name>test-param</param-name>
<param-value>Initialization Paramter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>AuthenFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
四、过滤链
一个 Web 请求可以定义多个过滤器,它们按声明顺序组装成一条过滤链。
五、过滤器分类
用 <dispatcher> 指定资源被容器调用的方式,可以是 REQUEST、INCLUDE、FORWARD、ERROR 之一,默认 REQUEST。也可以写多个子元素,让同一个 Filter 拦截多种调用方式。
dispatcher
何时调用
其他情况
REQUEST
用户直接访问页面
include / forward 过去的请求不会进这个过滤器
INCLUDE
目标由 RequestDispatcher.include() 访问
除此之外不调用
FORWARD
目标由 RequestDispatcher.forward() 访问
除此之外不调用
ERROR
声明式异常处理机制转到该资源
除此之外不调用
Web 监听器参见:如何使用监听器Servlet 。
一句话总结:过滤器卡在请求前后:记得 chain.doFilter(),并用 dispatcher 分清直接访问、转发、包含和错误页。
转载请注明来源:web过虑器
我是周sir,这是我的博客。致力于分享我学会的技术和优秀的文章。微信公众号 “周sir专栏” 欢迎大家关注。