Servlet 过滤器( Filter )
-
原理图:
-
过滤器的使用场景
- 登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换
-
过滤器的优势
- 便于代码重用,不必每个servlet中还要进行相应的操作
-
配置方式
-
web配置方式
-
<!--过滤器的xml配置 --> <filter> <!--名称--> <filter-name>sf</filter-name> <!--过滤器类全称--> <filter-class>com.qf.web.filter.SecondFilter</filter-class> </filter> <!--映射路径配置--> <filter-mapping> <!--名称--> <filter-name>sf</filter-name> <!--过滤的url匹配规则和Servlet的一模一样--> <url-pattern>/*</url-pattern> </filter-mapping>
-
-
注解方式
- 在过滤的类中加上注解 @WebFilter(“/*”)
- 过滤的路径=访问的路径过程中含过滤路径(格式),即执行对应的过滤器类
-
过滤器( Filter )类的运行原理及运行顺序
- Filter代码
- Filter为 接口,写一个类去实现它
@WebFilter("/*")
public class demo implements Filter {
//销毁--执行一次
public void destroy() {
// TODO Auto-generated method stub
}
//进行过滤时执行的方法
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// 过滤前
chain.doFilter(request, response);//过滤条件通过后,进入下一个过滤器(有过滤器)/到达目标请求
//过滤后
}
//初始化--执行一次
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
- 图示
Filter链中–Filter运行顺序
- 在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链
- 执行顺序
Filter仅以web.xml 方式配置 | 按照web.xml中Filter定义的顺序执行 |
---|---|
Filter仅以注解 方式配置 | 按照Filter类文件的类名,按字典序执行 |
Filter以web.xml和注解方式配置 | web.xml中的内容优先执行,其次是注解 (同种配置方式,按上述规则执行) |
Filter 初始化
-
注解方式
- @WebFilter(value="/*",initParams= {@WebInitParam(name=“version”, value=“1.0”)})
-
web.xml方式
<!--过滤器的xml配置 --> <filter> <filter-name>myfilter</filter-name> <filter-class>com.qf.web.filter.SecondFilter</filter-class> <!--过滤器的初始化参数 --> <init-param> <param-name>version</param-name> <param-value>1.0</param-value> </init-param> </filter> <filter-mapping> <filter-name>myfilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
Filter初始化调用
public void init(FilterConfigfConfig) throws ServletException {
// TODO Auto-generated method stub
System.out.println("init......初始化");
System.out.println("初始化参数:版本号:"+fConfig.getInitParameter("version"));
}