Servlet过滤器

来源:互联网 发布:网络维护明细 编辑:程序博客网 时间:2024/06/10 18:17

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容器在销毁过滤器实例前调用该方法
1 0
原创粉丝点击