`

Servlet过滤器

阅读更多

    上班闲得无聊,写写博客学习一下Servlet过滤器吧!无所事实的日子真是难过。自己找事做吧。。。努力努力!!

 

    Servlet过滤器是在Java Servlet规范2.3中定义的,因此所有实现这一规范的Servlet容器都支持Servlet过滤器。

 

    Servlet能够对Servlet容器的请求和响应对象进行检查和修改。Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用。Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request Header和Request内容。在Servlet被调用之后检查Response对象,修改Response Header和Response内容。Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或HTML文件。

 

    Servlet过滤器具有以下特点:

  • Servlet过滤器可以检查和修改ServletRequest和ServletResponse对象
  • 可以指定Servlet过滤器和特定的URL关联,只有当客户请求访问此URL时,才会触发过滤器工作
  • Servlet过滤器是Java Servlet规范2.3的一部分,因此所有实现Java Servlet规范2.3的Servlet容器都支持Servlet过滤器
  • 贸易独立的Servlet过滤器可以被串联在一起,形成管道效应,协同修改请求和响应对象

1、创建Servlet过滤器

    所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法:

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

    下面是一个过滤器的例子,这个名叫NoteFilter的过滤器可以拒绝列在黑名单上的客户访问留言簿,而且能将服务器响应客户请求所花的时间写入日志。NoteFilter的源代码如下:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class NoteFilter implements Filter{
    private FilterConfig config=null;
    private String blackList=null;

    public void init(FilterConfig config) throws ServletException{
        this.config=config;
        blackList=config.getInitParameter("blacklist");
    }

     public void destroy(){
         config=null;
    }

    public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)throws IOException,ServletException{
        String username=((HttpServletRequest) request).getParameter("username");
         if(username!=null)
             username=new String(username.getBytes("ISO-8859-1"),"GB2312");
         if(username!=null&&username.indexOf(blackList)!=-1){
             response.setContentType("text/html;charset=GB2312");
             PrintWriter out=response.getWriter();
             out.println("<html><head></head><body>");
             out.println("<h1>对不起"+username+",你没有权限留言</h1");
             out.println("</body></html>");
             out.flush();
             return;
         }
         long before=System.currentTimeMillis();
         config.getServletContext().log.(NoteFilter:before call chain.doFilter());
         chain.doFilter(request,response);
         config.getServletContext().log("NoteFilter:after call chain.doFilter()");
         long after=System.currentTimeMillis();
         String name="";
         if(request instanceOf HttpServletRequest){
             name=((HttpServletRequest)request).getRequestURI();
         }
         config.getServletContext().log("NoteFilter:"+name+":"+(after-before)+"ms");
}
}

     当NoteFilter初始化时,它调用config.getInitParameter("blacklist")方法,从Web.xml文件中读取初始化参数blacklist,这个参数表示被禁止访问留言簿的客户黑名单。

     在NoteFilter的doFilter()方法中首先从request对象中读取客户姓名,然后将客户姓名转换为中文字符编码。如果客户姓名中包含黑名单里的字符串,那么将直接向客户端返回一个拒绝网页。由于在这种情况下没有调用chain.doFilter()方法,因此客户请求不会到达所访问的Web组件。

     如果客户名不在黑名单里,NoteFilter的doFilter方法就会调用chain.doFilter()方法,这个方法用于调用过滤器链中后续过滤器的doFilter()方法。假如没有后续过滤器,那么就反客户请求传给相应的Web组件。在本例中,在调用 chain.doFilter()方法前后都生成了一些日志,并且记录了调用chain.doFilter()方法前后的时间,从而计算出Web组件响应客户请求所花的时间。

2、发布Servlet过滤器

    发布Servlet过滤器时,必须在web.xml文件中加入<filter>元素和<filter-mapping>元素。<filter>元素用来定义一个过滤器,如下所示:

    <filter>

        <filter-name>NoteFilter</filter-name>

        <filter-class>NoteFilter</filter-class>

        <init-param>

            <param-name>blacklist</param>

            <param-value>捣蛋鬼</param-value>

        </init-param>

    </filter>

以上代码中,<filter-name>属性指定过滤器的名字,<filter-class>指定过滤器的类名。<init-param>子元素为过滤器实例提供初始化参数,它包含一对参数名和参数值,在<filter>元素中可以包含多具<init-param>子元素。在这里定义一个名为blacklist的参数,在NoteFilter中将读取这个参数,它表示禁止留言的客户黑名单。

    <filter-mapping>元素用于将过滤器和URL关联,如下所示:

        <filter-mapping>

            <filter-name>NoteFilter</Filter-name>

            <url-pattern>/note</url-pattern>

       </filter-mapping>

 

 

分享到:
评论

相关推荐

    Servlet过滤器的简单使用源码+文档

    在标题"Servlet过滤器的简单使用源码+文档"中,我们可以理解为这个压缩包包含了一个关于Servlet过滤器的基础应用示例,以及相关的源代码和文档资料。描述中提到的"实现一个登陆界面",表明了过滤器可能被用作验证...

    servlet 过滤器做的简单登陆demo

    Servlet过滤器是Java Web开发中的一个重要概念,它允许开发者在请求到达目标Servlet之前或之后对请求和响应进行处理。在这个“servlet过滤器做的简单登陆demo”中,我们将探讨如何利用过滤器实现一个基础的登录验证...

    servlet过滤器实例经典过滤器

    Servlet过滤器是Java Web开发中的一个重要组件,它允许开发者在请求到达Servlet之前或者响应离开Servlet之后进行拦截处理。本教程将深入讲解如何配置和使用Servlet过滤器,以及介绍五个经典的过滤器实例。 首先,让...

    servlet过滤器实现(Eclipse工程)

    Servlet过滤器是Java Web开发中的一个重要概念,它允许开发者在请求到达Servlet之前或者响应离开Servlet之后进行拦截处理。本教程将详细介绍如何在Eclipse环境中创建并实现一个Servlet过滤器。 一、Servlet过滤器...

    Servlet过滤器小实例

    ### Servlet过滤器小实例 #### 实例背景与需求分析 在Web开发中,为了保障系统的安全性和稳定性,经常需要对接收到的HTTP请求进行预处理,比如验证用户身份、过滤恶意请求等。通常情况下,这些预处理操作可以在...

    servlet过滤器验证用户登录

    在IT领域,特别是Java Web开发中,Servlet过滤器(Filter)是实现用户权限管理、登录状态验证等关键功能的重要机制之一。本文将深入探讨如何利用Servlet过滤器来验证用户是否已登录,以及如何配置过滤器以针对特定的...

    servlet过滤器解决乱码问题

    ### Servlet过滤器解决乱码问题 在Web应用开发过程中,字符编码问题经常出现,尤其是在处理中文等多字节字符时。如果不正确地设置字符编码,可能会导致页面显示乱码。本文将详细介绍如何通过Servlet过滤器来解决这...

    servlet过滤器详解

    ### Servlet过滤器详解 #### 一、Servlet过滤器的概念与作用 Servlet过滤器,作为Java Servlet规范中的一个重要组成部分,自2.3版本起被引入,主要用于在Servlet容器中对请求和响应进行预处理和后处理。它不直接...

    Servlet过滤器使用

    这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数。 b、doFilter(ServletRequest,ServletResponse,FilterChain)...

    servlet过滤器技术实例,

    Servlet过滤器是Java Web开发中的一个重要概念,它允许开发者在请求到达Servlet之前或者Servlet响应返回客户端之前进行拦截处理。在本实例中,我们将深入探讨Servlet过滤器(Filter)的使用和实现,以及它在实际应用...

    servlet过滤器配置及运行过程.doc

    servlet过滤器配置及运行过程,servlet实例用法。

    Java servlet过滤器配置详解

    Java Servlet过滤器是Java Web应用程序中的重要组件,它在请求被Servlet处理之前和响应返回给客户端之后进行拦截,可以用于实现各种功能,如字符编码转换、URL重写、权限控制等。本篇将深入讲解Java Servlet过滤器的...

    Servlet过滤器机制分析及应用

    ### Servlet过滤器机制分析及应用 #### 一、概述 Servlet过滤器是Java Web应用程序中的一个重要组成部分,它提供了一种灵活的方式来对客户端的请求和服务器的响应进行预处理和后处理。这种机制允许开发者在不改变...

    JAVA WEB中的Servlet过滤器

    在Java Web开发中,Servlet过滤器(Filter)是不可或缺的一部分,它允许开发者在请求到达Servlet之前或响应离开Servlet之后对其进行处理。Servlet过滤器是按照指定的配置顺序进行调用的,能够实现数据的预处理、后...

    servlet 过滤器例子 filter

    Servlet过滤器是Java Web开发中的一个重要概念,它允许开发者在请求到达Servlet之前或者响应返回客户端之前进行拦截处理。本示例“servlet过滤器例子filter”将深入讲解如何使用Servlet过滤器以及其在实际应用中的...

    servlet过滤器

    Servlet过滤器是Java Web开发中的一个重要组件,它在Servlet生命周期中扮演着预处理和后处理的角色。在Tomcat这样的Servlet容器中,过滤器允许开发者在请求到达Servlet之前或Servlet响应发送回客户端之后对请求和...

    javaServlet过滤器

    下面将详细介绍Java Servlet过滤器的工作原理、配置以及常见应用场景。 ### 1. 工作原理 Servlet过滤器通过实现`javax.servlet.Filter`接口来创建。当客户端发起请求时,服务器会根据`web.xml`或Java配置文件中的...

    servlet过滤器Filter入门

    Servlet 过滤器 Filter 入门 Servlet 过滤器 Filter 是 Servlet API 中一个非常重要的功能,它提供了一种标准化的方法来定义过滤器,能够检查进入资源的请求信息,并作出相应的选择。下面是 Servlet 过滤器 Filter ...

    servlet过滤器Api 以及乱码处理.javascript注入问题

    在这个主题中,我们将深入探讨Servlet过滤器的API用法、乱码处理策略以及如何防止JavaScript注入问题。 首先,让我们了解一下Servlet过滤器的基础。在Servlet规范中,`Filter`接口定义了过滤器的核心方法,如`...

Global site tag (gtag.js) - Google Analytics