Filter过滤器

Filter过滤器

1.1什么是Filter?

Filter被称为过滤器,基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应出来前后实现一些特殊功能。这就好比现实中的污水进化设备,可以看作是一个过滤器。

​ Filter接口中的方法

方法声明功能描述
init(FilterConfig filterConfig)用来初始化过滤器,开发人员可以在init()方法中
完成与构造方法类似的初始化功能。
doFilter(ServletRequest request,
ServletResponse response,FilterChain chain)
doFilter()方法中有多个参数,其中request和response为Web服务器或Filter链中的上一个Filter传递过来的请求和响应对象;chain代表当前Filter链的对象,在当前对象中的doFilter()方法的内部需要调用FilterChain对象的doFilter()方法,才能把请求交付给Filter链中的下一个Filter或者目标程序去处理。
destroy()destroy()方法在Web服务器卸载Filter对象之前被调用,该方法用于释放被Filter对象打开的资源,例如关闭数据库和IO流

1.2实现一个Filter中的程序

编写MyServlet.java代码如下:

package itcast.filter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("hello MyServlet!");
    }

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

同时在web.xml中配置Servlet。

再编写MyFilter.java如下:

package itcast.filter;

import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;


public class MyFilter implements Filter {
    public void init(){

    }

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

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        PrintWriter out= servletResponse.getWriter();
        out.write("Hello MyFilter");
    }

    @Override
    public void destroy() {

    }
}

Filter同样需要在web.xml中配置,从而设置它所能拦截的资源,具体代码如下:

    <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>itcast.filter.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <url-pattern>/MyServlet</url-pattern>
    </filter-mapping>

在上述代码中设置了过滤器对/MyServlet进行拦截

1.3Filter映射

1.使用通配符“*”拦截用户的所有请求
    <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>itcast.filter.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
2.拦截不同方式的访问请求

元素中有一个特殊的子元素,该元素用于指定过滤器所拦截的资源被Servlet调用的方式,dispatcher中共有4个值:

  1. REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过Request Dispatcher的include()或者forward()方法访问时,这个过滤器不会被调用。

  2. INCLUDE:如果目标资源是通过Request Dispatcher的include()访问的,那么该过滤器将被调用。

  3. FORWARD:如果目标资源是通过Request Dispatcher的forward()访问的,那么该过滤器将被调用。

  4. ERROR:如果目标资源是通过声明式异常处理机制调用的,那么该过滤器将被调用。

1.4Filter链

如果web程序中可以注册多个Filter程序,每个Filter程序都可以针对某一个URL进行拦截。如果多个Filter程序都对同一个url进行拦截,那么这些FIlter就会组成一个Filter链,也就是过滤器链。

Filter链用那个FilterChain对象来表示,FilterChain对象中有一个doFilter()方法,该方法的作用就是让Filter链上的当前过滤器方向,使请求进入下一个Filter.

1.5FilterConfig接口

为了获取Filter接口在web.xml中的配置信息,Servlet API提供了一个FilterConfig接口,该接口封装了FIlter程序在web.xml中所有的注册信息,并且提供了一系列获取这些配置信息的方法。

方法功能描述
getServletContext返回 FilterConfig 对象中所包装的 ServletContext 对象的引用
getInitParameter用于返回在 web.xml 文件中为 Filter 所设置的某个名称的初始化的参数值
getFilterName返回 元素的设置值
getInitParameterNames返回一个 Enumeration 集合对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值