过滤器
## 过滤器 (web三大组件之一)##
# 基础概念;
一个起到过滤的对象,可以在请求和响应的时候进行过滤;
可以对资源进行拦截,用以进行我们需要的操作;
# 应用场景;
>> 权限过滤;
>> 日志文件;
>> 图片转换;
>> 数据压缩;
>> 加密;
>> 相关事项;
|-- 拦截谁是由过滤器的配置决定;
|-- 请求和响应机制;
对于浏览器发出的请求资源,过滤器可以进行拦截使其无法到达服务器;
但对于服务器返回的响应请求,过滤器无法进行截断拦截,响应一定会返回浏览器;
# 使用步骤;
>> 实现Filter接口;
|-- init(FilterConfig)
|-- doFilter(ServletRequest arg0,ServletResponse arg1,FilterChain chain)
chain.doFilter(arg0,arg1);//放行;
/*
注意;该方法不是Filter接口中的doFilter方法,该方法的作用是拦截;
而接口中的doFilter方法的作用是拦截;
*/
|-- destory()
>> 配置xml文件;
|-- 注意;
该配置文件不会自动生成,需要手动配置;
即使目标资源无法访问,只要符合过滤信息依然会启动过滤器;
# 生命周期;
>> 容器启动;
|-- 实例化;
|-- 初始化;
|-- 更改配置文件也会重新实例化;
>> 访问资源;
|-- 执行doFilter;
|-- 每次访问都执行;
>> 容器关闭;
|-- 销毁;
# 多个过滤器的拦截顺序;
|-- 详解;
> 浏览器 ---> 过滤器1 ---> 过滤器2 ---> 服务器
> 服务器 ---> 过滤器2 ---> 过滤器1 ---> 浏览器
|-- 注意事项;
> 过滤器没有优先级的概念,执行顺序按照配置文件
中<filter-mapping>节点配置的顺序来进行执行;
并且,/*和*.jsp没有优先级之分,
只要是配置了的过滤器都会执行;
# 过滤器的配置;
>> 配置方式;
|-- /路径名/×
|-- /×
|-- ×.扩展名
>> 配置个数;
|-- 一个Filter可以配置多个过滤路径;
>> 过滤配置;
<!-- 所有错误都会被过滤 -->
<dispatcher>ERROR</dispatcher>
<!-- 所有转发都会被过滤-->
<dispatcher>FORWARD</dispatcher>
<!-- 所有动态包含都会被过滤 -->
<dispatcher>INCLUDE</dispatcher>
<!-- 所有请求都会被过滤 -->
<dispatcher>REQUEST</dispatcher>
# 获取初始化参数;
>> 通过filterConfig方法;
# 应用案例;
>> 01_simpleExample.project
|-- 通过过滤器完成乱码处理; --- CharacterEncoding.java
|-- 动态资源禁用缓存; --- DynamicSourceNotNeedeCacheFilter.java
|-- 静态资源启用缓存; --- StaticSourceNeededCahceFilter3.Java
# 高级案例 --- 自动登录;
>> 新建web项目;
|-- 建立登录jsp界面;
|-- 建立domain实体类;
|-- 建立Servlet包;
> 建立loginServlet类;
> 通过过滤器解决乱码问题;