Servlet过滤器
功能:可以动态地拦截请求和响应,以对请求和相应进行相应的处理
常见的过滤器类型
- 身份验证过滤器
- 数据压缩过滤器
- 加解密过滤器
- 日志记录和审核过滤器
- 字符编码过滤器
配置
过滤器通过Web.xml中的XML标签来声明,然后映射到应用程序中Servlet名称或者URL模式中。当Web容器启动Web应用程序时候,它会为web.xml中声明的每一个过滤器创建一个实例。
<filter>
<filter-name>login</filter-name>
<filter-class>com.zeus.filter.LoginFilter</filter-class>
<init-param>
<param-name>username</param-name>
<param-value>admin</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>login</filter-name>
<url-pattern>/*</url-pattern>
<!--<servlet-name></servlet-name>-->
</filter-mapping>
在Servlet3.0中,可以通过注解的形式声明一个Filter,而且还能开启异步支持,这是Servlet3.0的亮点之一
@WebFilter(
urlPatterns = "/*",
filterName = "login",
initParams ={
@WebInitParam(name="username",value = "admin"),
@WebInitParam(name="password",value = "password")
},
asyncSupported = true
)
public class LoginFilter implements Filter {
private static final String USERMANE = "username";
private static final String PASSWORD = "password";
private Set<String> pairs = new ConcurrentSet<>();
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//get init username
String username = filterConfig.getInitParameter(USERMANE);
//....
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//do...something
chain.doFilter(request, response);
//do..something
}
@Override
public void destroy() {
//...
}
}
执行顺序
Filter的执行顺序与web.xml配置文件中的配置顺序一致,写在前面的Filter会比后面的Filter要早运行,一般把Filter配置在所有的Servlet之前
在servlet3.0中,由于Filter不在web.xml中配置了,因此其==按照Filter文件名的字母序==的方式运行,例如Filter1_login.java会比Filter2_encoding.java先运行
所有的Filter组装成一个链式结构对请求和相应进行过滤。假如我们有三个Filter,连接方式为Filter1->Filter2->Filter3,如果一个reuqest刚好满足这三个Filter的过滤条件,那么request和response通过Filter的顺序为:
常用方法
- doFilter:实际的过滤方法,执行完成后调用FilterChain来访问后续过滤器
- init:Web应用程序启动的时候创建Filter实例,并调用其init方法。开发成员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象
- destory():servlet容器在销毁过滤器实例前调用该方法