欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Servlet之Filter

程序员文章站 2022-06-03 09:14:00
...

Servlet之Filter

1、过滤器的概念

Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。

优点:过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。而在实际使用时,就要特别注意过滤链的执行顺序问题

Servlet之Filter

2、过滤器的作用描述

  • 在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。
  • 根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
  • 在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。
  • 根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。

3、特点

Servlet过滤器是在Java Servlet规范2.3中定义的,它能够对Servlet容器的请求和响应对象进行检查和修改,它在Servlet被调用之前检查Request对象,修改Request Header和Request内容;在Servlet被调用之后检查Response对象,修改Response Header和Response内容。Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或HTML文件,具有以下特点:

  • Servlet过滤器可能检查和修改ServletRequest和ServletResponse对象
  • 可以指定Servlet过滤器和特定的URL关联,只有当客户请求访问此URL时,才会触发该过滤器工作
  • 多个Servlet过滤器可以被串联起来,形成管道效应,协同修改请求和响应对象
  • 所有支持Java Servlet规范2.3的Servlet容器,都支持Servlet过滤器

4、接口

所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。该接口定义了以下3个方法:

  • init(FilterConfig) 这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后就会调用这个方法。在这个方法中可以通过FilterConfig来读取web.xml文件中Servlet过滤器的初始化参数。
  • doFilter(ServletRequest, ServletResponse, FilterChain) 这是完成实际的过滤操作的方法,当客户请求访问与过滤器关联的URL时,Servlet容器先调用该方法。FilterChain参数用来访问后续的过滤器的doFilter()方法。
  • destroy() Servlet容器在销毁过滤器实例前调用该方法,在这个方法中,可以释放过滤器占用的资源。

Servlet之Filter

5、Filter过程

它使用户可以改变一个request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开servlet时处理response.换种说法,filter其实是一个”servletchaining”(servlet 链).一个filter 包括:

  • 在servlet被调用之前截获;

  • 在servlet被调用之前检查servletrequest;

  • 根据需要修改request头和request数据;

  • 根据需要修改response头和response数据;

  • 在servlet被调用之后截获.

你能够配置一个filter 到一个或多个servlet;单个servlet或servlet组能够被多个filter 使用.几个实用的filter 包括:用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLTfilter等.

6、Filter建立步骤

建立一个过滤器涉及下列五个步骤:

  1. 建立一个实现Filter接口的类。这个类需要三个方法,分别是:doFilter、init和destroy。doFilter方法包含主要的过滤代码(见第2步),init方法建立设置操作,而destroy方法进行清楚。
  2. 在doFilter方法中放入过滤行为。doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。最后一个参数为FilterChain,如下一步所述,此参数用来调用servlet或JSP页。
  3. 调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它的一个参数。在调用此对象的doFilter方法时,**下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被**。
  4. 对相应的servlet和JSP页面注册过滤器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。
  5. 禁用**器servlet。防止用户利用缺省servlet URL绕过过滤器设置。

过滤器需要在web.xml文件中进行配置

<!-- 配置Filter -->
    <filter>  
        <filter-name>LogFilter</filter-name>  
        <filter-class>com.mucfc.LogFilter</filter-class>  
    </filter>  
    <filter-mapping>  
        <filter-name>LogFilter</filter-name>  
        <url-pattern>/*</url-pattern><!-- 表示处理根目录下的所有请求 -->
    </filter-mapping>

或者直接用注解:

@WebFilter(filterName="log",urlPatterns={"/*"})
public class LogFilter implements Filter {
.................................
}

7、映射的配置

(1) 映射到一个或多个jsp

<filter-mapping>
<filter-name>FilterName</filter-name>
<url-pattern>/path/FileName.jsp</url-pattern>
</filter-mapping>

(2) 映射到一个或多个servlet

<filter-mapping>
<filter-name>FilterName</filter-name>
<servlet-name>ServletName1</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>FilterName</filter-name>
<servlet-name>ServletName2</servlet-name>
</filter-mapping>

(3) 映射到任意的url

<filter-mapping>
<filter-name>FilterName</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

8.Filter过滤器执行顺序:

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

Filter简单示例

package com.kaikeba.filter;

import com.kaikeba.bean.User;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

//
public class LoginFilter implements Filter {//普通类实现Filter接口
    //过滤器初始化
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}
    //信息过滤的方法
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //方法内的参数转换成需要http请求和响应
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response=(HttpServletResponse)servletResponse;
        //创建session
        HttpSession session=request.getSession();
        //获取登录服务器中设置的session的属性值
        //Object是所有类的总父类
        User tmp= (User) session.getAttribute("userinfo");
        //判断user对象是否为空
        if(tmp==null){
            //跳转到登录页面
            response.sendRedirect("Login.jsp");
        }else{
            //用户存在 放行资源
            filterChain.doFilter(request,response);
        }

    }
    //过滤器结束执行的方法
    @Override
    public void destroy() {}
}

web.xml中配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>com.kaikeba.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <url-pattern>/index.jsp</url-pattern>
    </filter-mapping>
</web-app>

相关标签: 笔记