javaWeb学习总结(10)- Filter(过滤器)学习

时间:2023-03-09 00:27:45
javaWeb学习总结(10)- Filter(过滤器)学习

一、Filter简介

  Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有 web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
  Servlet
API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过
Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:

  javaWeb学习总结(10)- Filter(过滤器)学习

二、Filter是如何实现拦截的?

  Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web
资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

  1. 调用目标资源之前,让一段代码执行。
  2. 是否调用目标资源(即是否让用户访问web资源)。
  3. 调用目标资源之后,让一段代码执行。

  web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重
要的一个对
象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方
法,即web资源就会被访问,否则web资源不会被访问。

三、Filter开发入门

3.1、Filter开发步骤

  Filter开发分为二个步骤:

  1. 编写java类实现Filter接口,并实现其doFilter方法。
  2. 在 web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。

  过滤器范例:

package me.gacl.web.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; /**
* @ClassName: FilterDemo01
* @Description:filter的三种典型应用:
* 1、可以在filter中根据条件决定是否调用chain.doFilter(request, response)方法,
* 即是否让目标资源执行
* 2、在让目标资源执行之前,可以对request\response作预处理,再让目标资源执行
* 3、在目标资源执行之后,可以捕获目标资源的执行结果,从而实现一些特殊的功能
* @author: 孤傲苍狼
* @date: 2014-8-31 下午10:09:24
*/
public class FilterDemo01 implements Filter { @Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("----过滤器初始化----");
} @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException { //对request和response进行一些预处理
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8"); System.out.println("FilterDemo01执行前!!!");
chain.doFilter(request, response); //让目标资源执行,放行
System.out.println("FilterDemo01执行后!!!");
} @Override
public void destroy() {
System.out.println("----过滤器销毁----");
}
}

在web. xml中配置过滤器:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> <!--配置过滤器-->
<filter>
<filter-name>FilterDemo01</filter-name>
<filter-class>me.gacl.web.filter.FilterDemo01</filter-class>
</filter> <!--映射过滤器-->
<filter-mapping>
<filter-name>FilterDemo01</filter-name>
<!--“/*”表示拦截所有的请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping> </web-app>

启动web服务时候调用init方法

aaarticlea/png;base64,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" alt="" />

输入url进行过滤

aaarticlea/png;base64,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" alt="" />

3.2、Filter链

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

四、Filter的生命周期

4.1、Filter的创建

  Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。

4.2、Filter的销毁

  Web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。

4.3、FilterConfig接口

  用户在配置filter时,可以使用<init-param>为filter配置一些初始化参数,当web容器实例化Filter
对象,调用其init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过
filterConfig对象的方法,就可获得:
  String getFilterName():得到filter的名称。
  String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
  Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
  public ServletContext getServletContext():返回Servlet上下文对象的引用。
范例:利用FilterConfig得到filter配置信息

package me.gacl.web.filter;

import java.io.IOException;
import java.util.Enumeration;
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 FilterDemo02 implements Filter { /* 过滤器初始化
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("----过滤器初始化----");
/**
* <filter>
<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>
<init-param>
<description>配置FilterDemo02过滤器的初始化参数</description>
<param-name>like</param-name>
<param-value>java</param-value>
</init-param>
</filter> <filter-mapping>
<filter-name>FilterDemo02</filter-name>
<!--“/*”表示拦截所有的请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
*/
//得到过滤器的名字
String filterName = filterConfig.getFilterName();
//得到在web.xml文件中配置的初始化参数
String initParam1 = filterConfig.getInitParameter("name");
String initParam2 = filterConfig.getInitParameter("like");
//返回过滤器的所有初始化参数的名字的枚举集合。
Enumeration<String> initParameterNames = filterConfig.getInitParameterNames(); System.out.println(filterName);
System.out.println(initParam1);
System.out.println(initParam2);
while (initParameterNames.hasMoreElements()) {
String paramName = (String) initParameterNames.nextElement();
System.out.println(paramName);
}
} @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("FilterDemo02执行前!!!");
chain.doFilter(request, response); //让目标资源执行,放行
System.out.println("FilterDemo02执行后!!!");
} @Override
public void destroy() {
System.out.println("----过滤器销毁----");
}
}

五、Filter的部署

  Filter的部署分为两个步骤:

  1、注册Filter

  2、映射Filter

5.1、注册Filter

  开发好Filter之后,需要在web.xml文件中进行注册,这样才能够被web服务器调用

  在web.xml文件中注册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>
<init-param>
<description>配置FilterDemo02过滤器的初始化参数</description>
<param-name>like</param-name>
<param-value>java</param-value>
</init-param>
</filter>

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

  <filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
  <filter-class>元素用于指定过滤器的完整的限定类名。
 
 <init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名
字,<param-value>指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。如果过滤器不需要指
定初始化参数,那么<init-param>元素可以不配置。

5.2、映射Filter

  在web.xml文件中注册了Filter之后,还要在web.xml文件中映射Filter

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

<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
  <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
  <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
  <servlet-name>指定过滤器所拦截的Servlet名称。
 
 <dispatcher>指定过滤器所拦截的资源被 Servlet
容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多
个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。如下:

<filter-mapping>
<filter-name>testFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>

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

  1. REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
  2. INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
  3. FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
  4. ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。