Servlet Filter

419 阅读3分钟

一.Servlet Filter概述

Servlet Filter,也就是filter过滤器,可以对一些数据过滤和预处理。当我们访问某些网站或页面时,有一些敏感词汇无法被显示,而是被 * 代替,这就是用过滤器对信息进行了处理。而这只是filter的功能之一。

过滤器可以做很多事情,常见的包括:

  1. 过滤脏敏感字符(绿一些敏感的字符串);
  2. 避免中文乱码(统一设置请求和响应的编码);
  3. 权限验证(规定只有带指定Session或Cookie的请求,才能访问资源);
  4. 用于实现自动登录;

二.过滤器如何实现拦截

  1. 当客户端发生请求后,在HttpServletRequest 到达Servlet 之前,过滤器拦截客户的HttpServletRequest 。 
  2. 根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。 
  3. 在过滤器中调用doFilter方法,对请求放行。请求到达Servlet后,对请求进行处理并产生HttpServletResponse发送给客户端。
  4. 在HttpServletResponse 到达客户端之前,过滤器拦截HttpServletResponse 。 
  5. 根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。
  6. 最后,HttpServletResponse到达客户端。

代码示例

//        filter过滤器的使用步骤
        /*
        * 1.编写一个类实现filter窗口
        * 2.实现过滤方法dofilter()
        * 3.到web.xml中去配置filter()的拦截路径 
        * 4.多个filter过滤器执行的特点
        * 5.所有filter和目标资源默认都执行在同一个线程中
        * 6.多个filter共同执行时,使用的是同一个request对象*/

//filter过滤器只关心请求的地址是否存在,不关心请求的资源是否存在
public class adminfilter implements Filter {

    public adminfilter() {
        System.out.println("1.filter构造器方法AdminFilter()");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//        专门用来拦截请求
        HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
        HttpSession session = httpServletRequest.getSession();
        Object  user = session.getAttribute("user");
//    如果等于nul,说明还没有登录
        if (user == null) {
            servletRequest.getRequestDispatcher("/logun.jsp").forward(servletRequest,servletResponse);
             return;
        }else {
//            让程序继续往下访问用户的目标资源
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }

    @Override
//    主要目的:获取初始化参数
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

三.Filter的生命周期**

1.Filter接口中有三个重要的方法。

  • init()方法:初始化参数,在创建Filter时自动调用。当我们需要设置初始化参数的时候,可以写到该方法中。
  • doFilter()方法:拦截到要执行的请求时,doFilter就会执行。这里面写我们对请求和响应的预处理。
  • destroy()方法:在销毁Filter时自动调用
-   public interface Filter {

                  default public void init(FilterConfig filterConfig) throws                                              ServletException {}

                  public void doFilter(ServletRequest request, ServletResponseresponse,
                                            FilterChain chain)
                            throws IOException, ServletException;
                  default public void destroy() {} 
                                 }

2.Filter的生命周期

  • Filter的创建和销毁由web服务器控制。

  • 服务器启动的时候,web服务器创建Filter的实例对象,并调用其init方法,完成对象的初始化功能。filter对象只会创建一次,init方法也只会执行一次。

  • 拦截到请求时,执行doFilter方法。可以执行多次。

  • 服务器关闭时,web服务器销毁Filter的实例对象。

四.注册与映射 Filter

通过 web.xml 配置注册与映射 Filter

1. 通过web.xml配置

在 web.xml 中,通过 及其子元素注册 Filter,代码如下。

<filter>
 <filter-name>myFilter</filter-name>
 <filter-class>net.biancheng.www.MyFilter</filter-class>
 <init-param>
 <param-name>name</param-name>
 <param-value>yy</param-value>
 </init-param>
 <init-param>
 <param-name>URL</param-name>
 <param-value>www.yy.net</param-value>
 </init-param>
 </filter>

在 web.xml 中,通过使用 及其子元素映射 Filter,代码如下。

<filter-name>myFilter</filter-name>
<url-pattern>/login</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>

<filter-mapping>.
  <filter-name>myFilter</filter-name>
<servlet-name>ServletDemo</servlet-name>
</filter-mapping>