编写 Servlet 2.3 Filter

Servlets Filter 是Servlet 2.3 规范中新增加的,它是截取用户从客户端提交的请求,在还没有到达需要访问的资源时运行的一个类。它操纵来自客户端的请求,在资源还没有初发送到客户端前截取响应,并处理这些还没有发送到客户端的响应。

Filters 有许多的应用场合。Servlet 2.3 规范建议如下的地方可以应用Filter:

authentication filters
logging and auditing filters
image conversion filters
data compression filters
encryption filters
tokenizing filters
filters that trigger resource access events
XSL/T filters that transform XML content
MIME-type chain filters


编写一个简单的 Filter

学习怎么样写Filter的第一步,是看一个非常简单的实例。Filter 是一个实现了 javax.servlet.Filter 接口的类。javax.servlet.Filter 接口定义了三个方法:

public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) 
public FilterConfig getFilterConfig()
public void setFilterConfig (FilterConfig filterConfig)


创建 javax.servlet.FilterConfig 对象,并完成初始化后传递给 Filter ,是容器的职责。javax.servlet.FilterConfig 可以被用来:

提取 Filter name(在配置描述符中定义的)
提取初始化变量(在配置描述符中定义的)
得到 ServletContext 对象的引用

setFilterConfig() 方法可以被用来设置一个对象为某个 Filter 的属性。doFilter() 方法实际上真正要进行 filter 动作的地方。在这里,你可以解析用户的请求,记录统计到文件,处理返回客户端的响应,等等。列表1是一人非常简单的例子,当它 filter 客户端请求时,打印一个消息到控制台;然后当它 filter 一个返回客户端的响应时再打印一个消息到控制台。图1是一个示例这个简单的 Filter 怎样处理请求-响应模型的图表。
image

列表1: 一个非常简单的 Filter (SimpleFilter.java)

package com.filters;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import java.io.IOException;
import javax.servlet.ServletException;

public class SimpleFilter implements Filter
{
  private FilterConfig filterConfig;

  public void doFilter (ServletRequest request,
             ServletResponse response,
             FilterChain chain)
  {

    try
    {
      System.out.print ("Within Simple Filter ... ");
      System.out.println ("Filtering the Request ...");

      chain.doFilter (request, response);

      System.out.print ("Within Simple Filter ... ");
      System.out.println ("Filtering the Response ...");

    } catch (IOException io) {
      System.out.println ("IOException raised in SimpleFilter");
    } catch (ServletException se) {
      System.out.println ("ServletException raised in SimpleFilter");
    }
  }

  public FilterConfig getFilterConfig()
  {
    return this.filterConfig;
  }

  public void setFilterConfig (FilterConfig filterConfig)
  {
    this.filterConfig = filterConfig;
  }
}


以上的代码中可以看出,这个 Filter 是一个名为 SimpleFilter.java 类,它实现了 javax.servlet.Filter 接口,并提供了这个接口中三个方法的实现。

注 意,doFilter 可以分为二个部分:filter request 与 filter response 。这二部分由 javax.servlet.FilterChain 对象调用 chain 中的下一个对象来隔开,这下一个对象可能是一个 Servlet 或者另外的一个 Filter 。

现在,我们写好了这样的一个简单的 Filter ,需要把它配置到一个容器中,看看运行结果。

Apache Jatarka Tomcat,4.0 以上版本都支持 Servlet 2.3 规范。本文所有的实例都在此环境下测试通过。

Filters 定义在web应用描述符中,即 web.xml 文件。Filters 先被定义,然后映射(map)到 Servlet 或者 URL ,这与 Servlet 的定义与映射是完全一样的。列表2是 web.xml 文件中,配置 SimpleFilter.java ,并映射(map)到一个 Servlet 。

Listing 2: web.xml

<?xml version = "1.0" encoding = "ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">

<web-app>
  <!-- Define the filters within the Web Application -->
  <filter>
    <filter-name>
      Simple Filter Example
    </filter-name>
    <filter-class>
      com.filters.SimpleFilter
    </filter-class>
  </filter>
  <!-- Map the filter to a Servlet or URL -->
  <filter-mapping>
    <filter-name>
      Simple Filter Example
    </filter-name>
    <url-pattern>
      /simple
    </url-pattern>
  </filter-mapping>
  <!-- Define the Servlets within the Web Application -->
  <servlet>
    <servlet-name>
      Simple Servlet
    </servlet-name>
    <servlet-class>
      com.servlets.SimpleServlet
    </servlet-class>
  </servlet>
  <!-- Define Servlet mappings to urls -->
  <servlet-mapping>
    <servlet-name>
      Simple Servlet
    </servlet-name>
    <url-pattern>
      /simple
    </url-pattern>
  </servlet-mapping>
</web-app>


很可惜后面的东东网上都没有了,现在这些网站对自己的内容都太不负责任了!不过索性大概开发流程是说出来了,具体工作原理就找找别的资料吧

转载于:https://www.cnblogs.com/menghe/articles/188432.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我记录网站综合系统 -- 技术原理解析[0:简介(代序) 1.7Beta源代码下载开始]...

看到了路过秋天的博客系统受到了大家的好评&#xff0c;我也来介绍一个好的开源的CMS系统。我记录网站综合系统 是 掷鸡蛋者 的作品&#xff0c;这个家伙将大量的时间和精力放在这个项目上了&#xff0c;可以算一个创业项目。对于这样的同志&#xff0c;我只有敬佩他和全力支持…

PowerShell在Exchange2010下快速创建动态通讯组

Exchange中遇到一个小需求&#xff0c;有很多部门要申请动态通信组&#xff0c;问题是二级部门三级部门四级部门非常非常多。……Get-ADObject -LDAPFilter "(&(&(ou>"")))" -SearchBase OUxx,OUxxx,DCxxx,DCxxx,DCcom -Properties CanonicalNa…

LeetCode—262. 行程和用户(困难)

262. 行程和用户(困难) 题目描述&#xff1a; 取消率 的计算方式如下&#xff1a;(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)。 写一段 SQL 语句查出 “2013-10-01” 至 “2013-10-03” 期间非禁止用户&#xff08;乘客和司机都必须未被禁止…

第5章 JVM调优

2019独角兽企业重金招聘Python工程师标准>>> ##5.1 Java虚拟机内存模型## Java虚拟机内存模型是Java程序运行的基础。JVM将其内存数据分为程序计数器&#xff0c;虚拟机栈&#xff0c;本地方法栈&#xff0c;Java堆和方法区等部分。 程序计数器&#xff1a;用于存放…

C语言讲义——字符串

字符数组 C语言字符串就是字符数组。 单写字符&#xff0c;用单引号。如&#xff1a;’A’。字符串用双引号。如&#xff1a;”A”、”ABC”。#include <stdio.h> main() {char c1 a;printf("%c\n", c1-1);printf("%c\n", c1);printf("%c\n&qu…

c基础--II

c基础&#xff0d;&#xff0d;II 数据输出putchar()函数#include "stdio.h"main(){ char a,b,c; aa; bb; cc; //putchar()函数 putchar(a); putchar(b); putchar(c);}printf()函数printf(格式控制&#xff0c;输出列表)%d 输出 十进制整数%o 输出 八进…

Chuck Cobb谈敏捷组织中PMO的角色

对于设立了PMO&#xff08;项目管理办公室&#xff09;的企业&#xff0c;实施整个企业向敏捷风格的转换可能需要多个部门同步改变工作方式。在敏捷的团队中&#xff0c;PMO的传统角色需要做出改变。Charles G. “Chuck” Cobb,专家级敏捷项目经理、顾问、图书作者,最近分享了对…

极客

2019独角兽企业重金招聘Python工程师标准>>> 极客是美国俚语“geek”的音译。随着互联网文化的兴起&#xff0c;这个词含有智力超群和努力的语意&#xff0c;又被用于形容对计算机和网络技术有狂热兴趣并投入大量时间钻研的人。现代的Geek含义虽然与过去有所不同&am…

大数据——SparkStreaming学习笔记

Spark 一、SparkStreaming ​ Spark Streaming 用于流式数据的处理&#xff08;准实时&#xff0c;微序列&#xff09;。Spark Streaming 支持的数据输入源很多&#xff0c;例如&#xff1a;Kafka、 Flume、Twitter、ZeroMQ 和简单的 TCP 套接字等等。数据输入后可以用 Spark…

[推荐]ORACLE SQL:经典查询练手第三篇(不懂装懂,永世饭桶!)

[推荐]ORACLE SQL&#xff1a;经典查询练手第三篇(不懂装懂&#xff0c;永世饭桶&#xff01;) [推荐]ORACLE SQL&#xff1a; 经典查询练手第三篇(不懂装懂&#xff0c;永世饭桶&#xff01;) ——通过知识共享树立个人品牌。 本文与大家共同讨论与分享ORACLE SQL的一些常用经…

DotNET多线程使用初探

最近几周一直在做DotNET WinForm开发&#xff0c;陆陆续续有些收获&#xff0c;希望能够有空好好整理整理。记下来以免以后又忘了。:-) 一、最简单的线程使用方法 新建一个C# Windows应用程序项目&#xff0c;在最前面的引用代码那增加一行using System.Threading;在界面上扔个…

大数据——Spark学习笔记(配置)

Spark运行环境 spark ui web http://hadoop102:8080 历史服务器 http://hadoop102:18080 一. 本地模式(Local)——单机运行 本地模式&#xff1a;运行 bin/spark-shell提交应用&#xff1a;运行 bin/spark-submit --class org.apache.spark.examples.SparkPi …

大数据——Hive学习笔记

具体代码可以参考&#xff1a; https://github.com/Ostrich5yw/java4BigData

UML各种图

转载自&#xff1a; https://www.cnblogs.com/jiangds/p/6596595.html UML&#xff08;Unified Modeling Language&#xff09;是一种统一建模语言&#xff0c;为面向对象开发系统的产品进行说明、可视化、和编制文档的一种标准语言。下面将对UML的九种图包图的基本概念进行介绍…

大数据——Hive学习笔记(配置)

具体代码可以参考&#xff1a; https://github.com/Ostrich5yw/java4BigData

HashMap(摘)

1.HashMap简介 HashMap基于哈希表的Map接口实现&#xff0c;是以key-value存储形式存在。&#xff08;除了不同步和允许使用 null 之外&#xff0c;HashMap 类与 Hashtable 大致相同。)HashMap 的实现不是同步的&#xff0c;这意味着它不是线程安全的。它的key、value都可以为n…

JavaScript复制数组

转载于:https://blog.51cto.com/5880861/1651346

面向对象基础(一)

我想在这个园子里面的新人&#xff0c;还是"掌门人"&#xff0c;都对"面向对象"这几字非常的耳熟了或者有一定的了解。 但当一个初学都在学习面向对象的时候&#xff0c;会遇到一些瓶颈和麻烦&#xff0c;认为面向对象非常的难以理解。 那么本章节主要是让…

有哪些简单粗暴的logo设计方法?

Logo设计在设计的过程中要考虑很多问题&#xff0c;但是如果时间周期比较短&#xff0c;又要求快速出方案的时候&#xff0c;可以走一些捷径。 在设计logo之前要去了解公司的主营业务、公司规模、公司的名字、公司的主要产品针对的用户群体、甲方的个人偏好、公司原有VIS...这些…