Filter过滤器

Fileter过滤器基本使用

一、Filter简介

Filter也称之为过滤器,通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。也开始实现高级功能如:实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等。

二、Filter的原理

y0hcfx.jpg

三、Filter如何实现拦截

自定义一个java类,实现Filter接口,重写Filter中的三个方法init、doFilter、destory。当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法从而实现拦截。

四、Filter开发入门

Filter开发步骤

  1. 实现Filter接口,重写方法。
  2. 配置web.xml或添加@WebFilter。

具体实现如下:

web.xml:

<filter>
    <filter-name>MyServlet</filter-name>
    <filter-class>com.example.Filter.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>MyServlet</filter-name>
    <url-pattern>/Myservlet</url-pattern>
</filter-mapping>

 

@WebFilter(filterName = "MyFilter",urlPatterns = "/MyServlet")

使用范例:

index.jsp

<html>
<head>
    <title>过滤器使用测试</title>
</head>
<body>
<a href="MyServlet">MyServlet</a>
</body>
</html>

@WebServlet(name = "MyServlet", value = "/MyServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("访问服务器...");
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
    }
}

MyServlet.java

@WebServlet(name = "MyServlet", value = "/MyServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("访问服务器...");
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
    }
}

MyFilter.java

@WebFilter(filterName = "MyFilter",urlPatterns = "/MyServlet")
public class MyFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    System.out.println("拦截请求...");
    filterChain.doFilter(servletRequest, servletResponse);
    System.out.println("拦截响应...");
}

@Override
public void destroy() {

    }
}

Filter链

在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。

web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

Filter的部署

Filter的部署分为两个步骤

  1. 注册Filter
  2. 映射Filter

注册Filter

<filter>
      <description>FilterDemo02过滤器</description>
      <filter-name>FilterDemo02</filter-name>
      <filter-class>me.gacl.web.filter.FilterDemo02</filter-class>
      <!--配置FilterDemo02过滤器的初始化参数-->
      <init-param>
          <description>配置FilterDemo02过滤器的初始化参数</description>
          <param-name>name</param-name>
          <param-value>gacl</param-value>
      </init-param>
</filter>

用于添加描述信息,该元素的内容可为空,可以不配置。

<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。

<filter-class>元素用于指定过滤器的完整的限定类名。

<init-param>元素用于为过滤器指定初始化参数,可以不配置。

映射Filter

<!--映射过滤器-->
  <filter-mapping>
      <filter-name>FilterDemo02</filter-name>
      <!--“/*”表示拦截所有的请求 -->
      <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
 </filter-mapping>

子元素可以设置的值及其意义:

REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过

RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。

INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。

ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

posted @ 2021-02-11 00:08  aishimin  阅读(80)  评论(0)    收藏  举报