6.过滤器

本章目标:

  1. 过滤器简介
  2. 示例

本章内容:

一、过滤器简介

1、什么是Filter过滤器

过滤器是向Web应用程序的请求和响应处理添加功能的Web服务组件

Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器

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

2、过滤器的作用

  • 检查请求并执行相应的行动,并阻塞请求或响应,使其不能进一步传递。
  • 修改请求和响应的头部和数据,用户可以提供自定义的请求或可以通过提供定制的响应版本来实现。
  • 可被添加到Web应用程序中或者从Web应用程序中删除而不需重写基层应用程序代码,并能向过去的代码中添加新功能。
  • 在实际开发中,譬如我们可以对客户提交的数据进行重新编码,可以从系统获得配置信息,可以过滤客户提交的某些不合法的词汇,可以验证客户是否已经登录,可以验证客户端浏览器是否支持当前的应用,还可以记录系统的日志文件等等。

3、Filter拦截原理

Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法。

web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法。调用filterChian对象的doFilter方法,web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。相反,如果不调用该方法,web资源不会被访问。

4、Filter接口常用方法:

  • 初始化:init(FilterConfig filterConfig)
  • 过滤doFilter(ServletRequest req, ServletResponse resp, FilterChainfilterChain):Filter中的doFilter()方法主要写实现过滤器功能的代码,doFillter方法中可以一句需求决定是否调用filterChain的doFilter方法放行
  • 注销过滤器:destroy()

5、Filter的生命周期

Filter的创建和销毁由WEB服务器负责。

  • web应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。
  • 所有的请求都会经过过滤器,并多少调用doFilter()方法
  • 过滤器的注销会随着服务器的关闭而关闭。除此之外,Web容器还可以通过调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。

6、过滤器链

  • FilterChain 接口用于调用过滤器链中的一系列过滤器,由Web容器根据Filter映射自动产生FilterChain对象
  • FilterChain.doFilter(ServletRequest, ServletResponse)方法用于调用过滤器链中的下一个过滤器
  • 在过滤器链中的最后一个过滤器中调用doFilter方法将请求发送的指定的Web资源

二、示例

1、基础示例

package com.woniuxy.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 FirstFilter implements Filter {

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

    }

    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("*******过滤器doFilter之前*******");
        chain.doFilter(arg0, arg1);
        System.out.println("*******过滤器doFilter之后*******");

    }

    public void init(FilterConfig arg0) throws ServletException {
        System.out.println("*******过滤器开始*******");

    }

}

2、设置编码

package com.woniuxy.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 {

    public void destroy() {
        // TODO Auto-generated method stub

    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        try {
            request.setCharacterEncoding("utf-8");
        } catch (Exception e) {

        }
        chain.doFilter(request, response);

    }

    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}

3、验证登录

package com.woniuxy.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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class FilterDemo implements Filter {

    public void destroy() {
        // TODO Auto-generated method stub

    }

    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        // place your code here
        HttpServletRequest request = (HttpServletRequest) arg0;
        HttpServletResponse response = (HttpServletResponse) arg1;
        request.setCharacterEncoding("utf-8");
        HttpSession session = request.getSession();
        Object obj = session.getAttribute("user");
        String uri = request.getRequestURI();
        if (uri.endsWith("login.jsp") || (uri.endsWith("user") && "login".endsWith(request.getParameter("status")))) {
            chain.doFilter(request, response);
        } else if (obj != null) {
            chain.doFilter(request, response);
        } else {
            response.sendRedirect("/shop/manage/login.jsp");
            //response.sendRedirect("http://"+request.getHeader("Host")+"/manage/login.jsp");
        }
    }

    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}

4、web.xml中配置

<filter>
        <filter-name>session</filter-name>
        <filter-class>com.woniuxy.filter.FilterDemo</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>session</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
posted @ 2025-04-23 17:36  icui4cu  阅读(12)  评论(0)    收藏  举报