过滤器

Servlet分3中:

  • 简单Servlet
  • 过滤器Servlet
  • 监听器Servlet

过滤器的基本概念

Filter是在Servlet2.3之后增加的新功能,当需要限制用户访问某些资源或者在处理请求时提前处理某些资源时,即可使用过滤器完成。

过滤器是以一种组件的形式绑定到Web应用程序当中的,与其他的Web应用程序组件不同的是,过滤器是采用“链”的方式进行处理的,如图所示:


过滤器.png

实现过滤器
在Servlet中,如果要定义一个过滤器,则直接让一个类实现javax.servlet.Filter接口即可,此接口定义了3个操作方法,如表所示:

方法 描述
public void init(FilterConfig fConfig) throws ServletException 过滤器初始化(容器启动时初始化)时调用,可以通过FilterConfig取得配置的初始化参数
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 完成具体的过滤操作,然后通过FilterChain让请求继续向下传递
public void destroy() 过滤器销毁时调用

从上面的表中可以发现,最重要的方法是doFilter方法,在此方法中定义了ServletRequest、ServletResponse、FilterChain三个参数,前两个参数可以完成对任意协议的过滤操作。FilterChain接口的主要作用是将用户的请求向下传递给其他的过滤器或者Servlet。

【SimpleFilter.java】定义一个简单的过滤器

package im.weitang.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SimpleFilter implements Filter {

    public void destroy() {
        System.out.println("过滤器销毁");
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("执行doFilter方法之前");
        chain.doFilter(request, response);
        System.out.println("执行doFilter方法之后");
    }

    public void init(FilterConfig fConfig) throws ServletException {
        String initParam = fConfig.getInitParameter("ref");
        System.out.println("过滤器初始化,初始化参数ref = " + initParam);
    }
}

示例1:编码过滤
【EncodingFilter.java】

package im.weitang.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class EncodingFilter implements Filter {
    private String charSet;

    public void destroy() {

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding(this.charSet);
    }

    public void init(FilterConfig fConfig) throws ServletException {
        this.charSet = fConfig.getInitParameter("charset");
    }
}

修改web.xml,添加如下代码:

<filter>
    <display-name>EncodingFilter</display-name>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>im.weitang.filter.EncodingFilter</filter-class>
    <init-param>
        <param-name>charset</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/EncodingFilter</url-pattern>
</filter-mapping>

示例2:登录验证

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Servlet过滤器是 Servlet 程序的一种特殊用法,主要用来完成一些通用的操作,如编码的过滤、判断用户的登...
    重山杨阅读 1,290评论 0 12
  • 仅作为自己学习记录使用,文章来自: 1、http://blog.csdn.net/csh624366188/art...
    BakerZhang阅读 1,067评论 1 5
  • 监听器(listener) 监听器简介 :监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个...
    奋斗的老王阅读 2,571评论 0 53
  • 1.过滤器简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filte...
    胖先森阅读 1,155评论 0 16
  • 作为一个学生的我,我也有喜欢的异性,我想大概17岁这个年纪也不会在对男女之事浑浑噩噩了。而现在这篇文章像是在告诫...
    逃小兵阅读 326评论 0 2