Filter的理解概述:
- filer是web过滤器,当客户端申请访问服务器资源,或者服务器向客户端响应资源时,filter可以将请求拦截下来完成一些通用的特殊功能比如:登录验证、统一编码处理、敏感字符过滤...
- 单个过滤器执行流: 执行过滤器-->再执行放行后的资源-->最后执行过滤器放行代码下边的代码;多个过滤器执行流:过滤器1-->过滤器2-->资源执行-->过滤器2-->过滤器1。多个过滤器先后顺序:注解配置:按照类名的字符串比较规则比较,值小的先执行 ,如: AFilter 和 BFilter,AFilter就先执行了。或者web.xml配置: <filter-mapping>谁定义在上边,谁先执行
Filter的使用概述:
- filter,servet,listene同为java的三大组件,在使用上filter可类比servlet:通过注解声明访问客户端路径(也可通过配置文件),继承接口,复写方法中都有init,destroy方法,主要编辑方法在fliter中为doFilter()。
filter的测试代码:
<!--web.xml配置filter类-->
<?xml version="1.0" encoding="UTF-8"?>
-<web-app version="3.1" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
<!--将拦截目录和filter类通过<filter-name>标签关联起来-->
<filter>
<filter-name>test1</filter-name>
<filter-class>MyTest.web.filter.FilterTest1</filter-class>
</filter>
<filter-mapping>
<filter-name>test1</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher><!--配置拦截目录的方式-->
</filter-mapping>
</web-app>
package MyTest.web.filter;
import javax.servlet.*;
import java.io.IOException;
/**FilterTest1:过滤器快速入门程序
* 1.
*/
@WebFilter("/*")//访问所有资源之前,都会执行该过滤器
//@WebFilter("/index.jsp") 只有访问具体资源路径index.jsp资源时,过滤器才会被执行
//@WebFilter("/user/*") 访问拦截目录/user下的所有资源时,过滤器都会被执行
//@WebFilter("*.jsp") 访问所有后缀名为jsp资源时,过滤器都会被执行
//@WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.REQUEST) 浏览器直接请求index.jsp资源时,该过滤器会被执行
//@WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.FORWARD) 只有转发访问index.jsp时,该过滤器才会被执行
//@WebFilter(value="/*",dispatcherTypes ={ DispatcherType.FORWARD,DispatcherType.REQUEST}) 浏览器直接请求index.jsp或者转发访问index.jsp。该过滤器才会被执行
public class FilterTest1 implements Filter {
@Override
//每一次请求被拦截资源时,会执行。执行多次
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("放行之前,对request数据作增强");
//
//放行
chain.doFilter(req, resp);
System.out.println("放行之后,对response数据作增强");
}
//服务器开启后,Filter对象创建后执行init方法,只执行一次,用于加载资源
public void init(FilterConfig config) throws ServletException {
System.out.println("init....");
}
//服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
@Override
public void destroy() {
System.out.println("destroy....");
}
}