5.过滤器

一、编写过滤的步骤

1、编写一个类,实现javax.servlet.Filter接口,这样的类一般称之为过滤器类

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
        throws IOException, ServletException {
    System.out.println("FilterDemo1拦截了");
    chain.doFilter(request, response);//放行
}

2、在web.xml中进行配置,要拦截哪些资源。

<filter>
    <filter-name>FilterDemo1</filter-name>
    <filter-class>cn.itcast.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
    <filter-name>FilterDemo1</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

二、过滤器的执行过程

多个过滤器的拦截顺序是按照web.xml中filter-mapping元素的出现顺序进行拦截的。 过滤器只会被初始化一次,应用被加载时就完成了初始化。

三、

  1. 全部过滤 /*
  2. 过滤以do结尾 *.do
  3. 过滤资源文件 .css,.js,.html,.jsp等

四、案例

1.设置编码

@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) 
        throws IOException, ServletException {
    
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) resp;
    
    request.setCharacterEncoding(encoding);
    response.setContentType("text/html;charset=UTF-8");
    
    System.out.println("Filter前");
    chain.doFilter(request, response);//放行
    System.out.println("Filter后");
}

2.设置静态资源缓存时间

@WebFilter(filterName="NeedCacheFilter", urlPatterns = {"*.html","*.js","*.css"}, 
    initParams = {
        @WebInitParam(name = "html", value = "1"),// value是缓存的时间
        @WebInitParam(name = "css", value = "1"),
        @WebInitParam(name = "js", value = "1") 
    }
)
public class NeedCacheFilter implements Filter {
    private FilterConfig filterConfig;
    @Override
    public void destroy() {
    }
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        // 获取html、css、js各自的缓存时间,如果没有,给个默认值是1小时
        String value = null;
        String uri = request.getRequestURI();// /day19/index.html
        String extendName = uri.substring(uri.lastIndexOf(".") + 1);

        if ("html".equals(extendName)) {// 访问的html资源
            value = filterConfig.getInitParameter("html");
        } else if ("css".equals(extendName)) {// 访问的css资源
            value = filterConfig.getInitParameter("css");
        } else if ("js".equals(extendName)) {// 访问的js资源
            value = filterConfig.getInitParameter("js");
        }
        if (value != null) {
            int time = Integer.parseInt(value);
            response.setDateHeader("Expires", System.currentTimeMillis() + time * 60 * 60 * 1000);
        }
        System.out.println(111);
        chain.doFilter(request, response);
        System.out.println(222);
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        this.filterConfig = config;
    }
}

3.控制动态资源(Servlet JSP)不要缓存的过滤器

@WebFilter(filterName="NoCacheFilter", urlPatterns = {"/servlet/*","*.jsp"})
public class NoCacheFilter implements Filter {
    public void destroy() {
    }
    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)resp;
        response.setHeader("Expires", "-1");
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");
        chain.doFilter(request, response);
    }
    public void init(FilterConfig filterConfig) throws ServletException {
    }
}

4.(敏感词)脏话过滤器

5.全站默认全部压缩

6.HTML特殊符号过滤器

五、过滤器的高级配置

filter默认只过滤REQUEST(请求)

<filter-mapping>
    <filter-name>FilterDemo3</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher> 默认情况。如果写了另外一种情况,默认的就没有了
    <dispatcher>FORWARD</dispatcher>-->过滤转发
    <dispatcher>INCLUDE</dispatcher>-->过滤动态包含
    <dispatcher>ERROR</dispatcher>-->过滤页面错误
</filter-mapping>

六、多个过滤器的执行顺序

  1. 在xml的配置文件中,有上至下的执行,
  2. 在注解中,按类名称(不是配置filter-那么,是class文件的名称)a-z的顺序。

文章信息

张雪随笔
master
Homepage
Issues
Download

This Software is under the terms of The Unlicense.