文章目录
总结
第7章 过滤器
1. 过滤器:一个用于拦截数据源和目的地之间消息的对象
2. 特点:线程不安全
3. 定义过滤器:实现过滤器接口(Filter)
4. 生命周期的方法
init(FilterConfig config)
doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain){
……用于拦截请求
chain.doFilter(request, response);//分水岭
……用于拦截响应
}
destroy()
5. 过滤器的功能
拒绝请求:自己产生一个响应,返回给客户端
传递请求:将请求传递给过滤器链中的下一个过滤器,如果该过滤器是过滤器链中的最后一个过滤器,就将请求传递给目标资源。
篡改请求:直接将请求转发给其他资源
6. 过滤器的配置
web.xml: <filter> <filter-mapping>
注解:@webFilter(
filterName
urlPatterns
initParams{ @webInitParam(),…}
)
7. 过滤器的执行顺序
拦截请求的顺序:
web.xml中配置的过滤器的正序,注解配置的过滤器的类名称的自然顺序
拦截响应的顺序:拦截请求的顺序的逆序
8. *过滤器应用场合
门卫、前台、秘书
过滤器简介
过滤器是一个用于拦截在数据源和数据目的地之间消息的一个对象
过滤器功能
分析请求,将请求发送给指定的资源或自己创建一个响应返回
在请求到达服务器端前处理请求,设置请求信息,将请求封装成符合规则的对象
在响应到达客户端前处理响应,将响应封装成符合规则的对象
简述: 创建响应直接返回,包装请求转发,包装响应回复。
过滤器功能
• 身份验证过滤器(Authentication Filters)
• 数据压缩过滤器(Data compression Filters)
• 加密过滤器(Encryption Filters)
• 触发资源访问事件过滤器(Filters that trigger resource access events )
• 图像转换过滤器(Image Conversion Filters)
• 日志记录和审核过滤器(Logging and Auditing Filters)
• MIME-TYPE 链过滤器(MIME-TYPE Chain Filters)
• 标记化过滤器(Tokenizing Filters)
• XSL/T 过滤器(XSL/T Filters),转换 XML 内容。
过滤器的执行
过滤器处理请求采取以下3种行动之一
1. 过滤器自身产生一个响应,返回给客户端
2. 把请求转发给过滤器链中的下一个过滤器,
如果是最后一个过滤器则将请求转发给请求指定资源
3. 把请求转发到另一资源
过滤器示例
• AuthorityFilter
– 编码(实现Filter接口)
– 部署(在web.xml配置)
• 注册过滤器
• 配置虚拟路径
– 运行
过滤器API
Filter接口
• init()方法
Servlet容器最先调用过滤器的init()方法,初始化过滤器,生命周期中只调用一次
• doFilter()方法
Servlet容器调用doFilter()方法处理请求
• destroy()方法
Servlet容器最后调用destroy()方法,释放过滤器所占的资源
过滤器相关接口、类
配置过滤器
配置Filter
举例:
Filter过滤器链
<!-- 配置过滤器别名 -->
<filter>
<filter-name>Filter11</filter-name>
<filter-class>net.lww.filter.Filter11</filter-class>
<!-- 添加过滤器的初始化参数 -->
<init-param>
<param-name>fParam1</param-name>
<param-value>fParam1Value</param-value>
</init-param>
<init-param>
<param-name>fParam2</param-name>
<param-value>fParam2Value</param-value>
</init-param>
</filter>
<!-- 配置过滤器虚拟路径 -->
<filter-mapping>
<filter-name>Filter11</filter-name>
<url-pattern> / * </url-pattern>
</filter-mapping>
<filter>
<filter-name>CharFilter</filter-name>
<filter-class>net.lww.filter.CharFilter</filter-class>
</filter>
<!-- 配置过滤器虚拟路径 -->
<filter-mapping>
<filter-name>CharFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
• 拦截请求的顺序:
先处理xml上的,在处理注解的。
– web.xml文件中配置的Filter的正序, 代码顺序
– 注解配置的Filter的自然顺序, 字典排序
• 拦截响应的顺序:
– 拦截请求的顺序的逆序
• 构造与初始化顺序:xml正序 + 注解倒叙。
xml顺序不一定,来看情况。
• 销毁顺序与构造初始化顺序一致。
Filter注意事项
• Filter配置过滤器链
• Servlet容器可以对同一个过滤器对象运行多个线程来同时处理多个请求
@WebFilter(
filterName = "Filter33",
urlPatterns = "/*",
initParams = {
@WebInitParam(name = "fp1",value="fp1value"),
@WebInitParam(name = "fp2",value="fp2value")
}
)
public class Filter33 implements Filter {
private FilterConfig fConfig
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("Filter3.in");
//获取初始化参数
Enumeration<String> enums=fConfig.getInitParameterNames();
while(enums.hasMoreElements()) {
//得到当前初始化参数的名称与数值
String pNameString=enums.nextElement();
String pValueString=fConfig.getInitParameter(pNameString);
System.out.println(" "+pNameString+"----"+pValueString);
}
chain.doFilter(request, response);
System.out.println("Filter3.out");
}