以下内容引用自http://wiki.jikexueyuan.com/project/jsp/writing-filters.html

Servlet和JSP过滤器都是Java类,可以在Servlet和JSP编程中用于以下目的:

  • 在请求访问后端资源之前从客户端拦截请求。

  • 在响应发送回客户端之前从服务器操作响应。

有各种符合规格的过滤器:

  • 身份验证过滤器。

  • 数据压缩过滤器

  • 加密过滤器。

  • 触发资源访问事件的过滤器。

  • 图像转换过滤器。

  • 日志记录和审计过滤器。

  • MIME类型链过滤器。

  • Tokenizing过滤器。

  • 转换XML内容的XSL/T过滤器。

过滤器是部署在部署描述符文件Web.xml中的,然后映射到应用程序的部署描述符中的Servlet或JSP名称或URL模式。部署描述符文件Web.xml可以在<Tomcat-installation-directory>\conf目录下找到。

当JSP容器启动Web应用程序时,它会为每个在部署描述符中声明的过滤器创建一个实例。过滤器按照它们在部署描述符中声明的顺序执行。

一、Servlet过滤器方法

一个过滤器是一个简单的Java类,实现了javax.servlet.Filter接口。javax.servlet.Filter接口定义了三个方法:

方法  描述

public void doFilter (ServletRequest, ServletResponse, FilterChain)

由于客户端在链尾请求响应,每次请求/响应对通过链时,容器会调用此方法。

public void init(FilterConfig filterConfig)

由Web容器调用此方法,向过滤器表明它将被放置在服务中。

public void destroy()

由Web容器调用此方法,向过滤器表明它将从服务中被去掉。

二、JSP过滤器示例

下面是JSP过滤器的示例,每次访问任何JSP文件时都会输出客户端IP地址和当前日期时间。这个例子会基本了解JSP过滤器,但是可以使用相同的概念编写更复杂的过滤器应用程序:

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*; // Implements Filter class
public class LogFilter implements Filter {
public void init(FilterConfig config) throws ServletException{
// Get init parameter
String testParam = config.getInitParameter("test-param"); //Print the init parameter
System.out.println("Test Param: " + testParam);
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException { // Get the IP address of client machine.
String ipAddress = request.getRemoteAddr(); // Log the IP address and current timestamp.
System.out.println("IP "+ ipAddress + ", Time " + new Date().toString()); // Pass request back down the filter chain
chain.doFilter(request,response);
}
public void destroy( ){
/* Called before the Filter instance is removed
from service by the web container*/
}
}

以通常的方式编译LogFilter.java,把LogFilter.class类文件放在<Tomcat-installation-directory>/webapps/ROOT/web-inf/classes中(POM和Eclipse可以忽略这步)。

三、在Web.xml中的JSP过滤器映射

首先定义过滤器,然后将过滤器映射到URL或JSP文件的名字中,这几乎与定义Servlet然后映射到Web.Xml文件的URL模式的方式相同。为在部署描述符文件Web.xml的过滤器标签创建以下条目

<filter>
<filter-name>LogFilter</filter-name>
<filter-class>LogFilter</filter-class>
<init-param>
<param-name>test-param</param-name>
<param-value>Initialization Paramter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

上面的过滤器将适用于所有Servlet和JSP,因为在配置中指定了/*。如果想把过滤器应用到部分Servlet或JSP中,可以指定一个特定的Servlet或JSP路径。

现在尝试以常用的方式调用任何Servlet或JSP,会在Web服务器日志中看到生成的登录。可以使用Log4J日志在一个单独的文件中记录上面的登录。

四、使用多个过滤器

Web应用程序可能定义了带有特定目的的不同的过滤器。考虑这个情况,定义两个过滤器AuthenFilter和LogFilter。剩下的过程仍将像前面解释的那样,除了需要创建一个不同的映射,如下所示:

<filter>
<filter-name>LogFilter</filter-name>
<filter-class>LogFilter</filter-class>
<init-param>
<param-name>test-param</param-name>
<param-value>Initialization Paramter</param-value>
</init-param>
</filter>
<filter>
<filter-name>AuthenFilter</filter-name>
<filter-class>AuthenFilter</filter-class>
<init-param>
<param-name>test-param</param-name>
<param-value>Initialization Paramter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>AuthenFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

五、过滤器的应用顺序

在web.xml中的filter-mapping元素的顺序决定了Web容器把过滤器应用到Servlet或JSP的顺序。想要逆转滤波器的顺序,只需要逆转web.xml文件中的filter-mapping元素。

例如,上面的例子将首先应用LogFilter,然后应用AuthenFilter到任意Servlet或JSP中,但是下面的例子将逆转这个顺序:

<filter-mapping>
<filter-name>AuthenFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

JSP的过滤器的更多相关文章

  1. JSP中过滤器的设置

    JSP中过滤器的设置 package com.filter; import java.io.IOException; import java.net.URLDecoder; import java.u ...

  2. JSP使用过滤器防止SQL注入

    什么是SQL注入攻击?引用百度百科的解释: sql注入_百度百科: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具 ...

  3. servlet和jsp页面过滤器Filter的作用及配置

    刚刚有个朋友问我,Servlet的过滤器有什么作用? 现在发个帖子说明一下,            过滤器是一个对象,可以传输请求或修改响应.它可以在请求到达Servlet/JSP之前对其进行预处理, ...

  4. jsp实现过滤器的简单例子

    web.xml配置如下: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns=&quo ...

  5. JSP Filters(过滤器)

    Filter是拦截Request请求的对象:在用户的请求访 问资源前处理ServletRequest以及ServletResponse,它可 用于日志记录.加解密.Session检查.图像文件保护 等 ...

  6. jsp实用过滤器写法

    使用过滤器来给servlet设置编码 public class CharacterEncodingFilter implements Filter{ @Override public void des ...

  7. jsp中添加过滤器,实现校验用户身份

    我现在需要实现一个功能,就是用户登录前不允许访问系统,我使用的是jsp的过滤器来实现的. 先把filter过滤器的代码粘出来: package com.day8.filter; import java ...

  8. springboot jsp,过滤器,拦截器

    springboot使用jsp,过滤器,拦截器(拦截器与过滤器区别重点) jsp使用配置 一 创建springboot项目在maven中暂时只添加两个Dependencies :devtools(热部 ...

  9. Java过滤器应用-对Ajax请求做Session失效判断

    过滤器常用来对Session过期做判断 Layout.js 1.为ajax请求添加标识 2.无论ajax请求成功与否,complete函数终会执行 // 全局Ajax设置, 用于session过期后的 ...

随机推荐

  1. 【C++】异常简述(三):补充之如何看待C++异常

    C++异常的使用,我相信在上文总结的已经比较完整了,本文主要对C++异常这块进行额外的补充. 即使C++将异常纳入标准已经很多年了,但是直到现在都能看到很多坚持不显式使用异常.(包括本人在内,在写的代 ...

  2. Java之抽象和封装

    ① 如何从现实世界中抽象出类?    根据软件开发需求: 发现类-->发现类的属性-->发现类的方法    ②   构造方法的作用和特点是什么?    作用:在创建对象时执行一些初始化操作 ...

  3. AIX上安装oracle10g

    AIX上安装oracle10g: 建议将oracle软件装在本地磁盘,数据文件放在共享存储上 安装数据库需提前规划的工作: DBCA 创建数据库时,如果勾了EM选项,则会检测监听. 首先rootpre ...

  4. Jmeter之WebService接口测试

    一.简介  1.JMeter3.2前的版本,可以使用SOAP/XML-RPC Request插件直接进行webservice接口,而3.2后的版本则已经取消了这个接口,需要另外的方法才能进行测试. 2 ...

  5. css 动态导入css文件 @import 动态js加载 都是静态的

    @import "http://apps.bdimg.com/libs/bootstrap/3.3.4/css/bootstrap.css" /*-防止各大cdn公共库加载地址失效 ...

  6. cocos2dx游戏如何架构

    声明:此篇文章不介绍如何使用cocos2dx制作游戏.站在架构师的角度如果制作游戏. 以我多年的游戏开发经验,和其他技术积累, 市面的所谈的一些软件架构模式都不太适合游戏软件. 我指的架构模式,MVC ...

  7. CAD参数绘制线型标注(com接口)

    主要用到函数说明: _DMxDrawX::DrawDimRotated 绘制一个线型标注.详细说明如下: 参数 说明 DOUBLE dExtLine1PointX 输入第一条界线的起始点X值 DOUB ...

  8. CAD使用GetxDataLong读数据(com接口)

    主要用到函数说明: MxDrawEntity::GetxDataLong2 读取一个Long扩展数据,详细说明如下: 参数 说明 [in] LONG lItem 该值所在位置 [out, retval ...

  9. 编程规范:allocator

    一.作用 标准库allocator类定义在头文件memory中,它帮助我们将内存分配和对象构造分离开来 allocator<T> a //定义一个名为a的allocator对象,它可以为类 ...

  10. 第3节 mapreduce高级:7、自定义outputformat实现输出到不同的文件夹下面

    2.1 需求 现在有一些订单的评论数据,需求,将订单的好评与差评进行区分开来,将最终的数据分开到不同的文件夹下面去,数据内容参见资料文件夹,其中数据第九个字段表示好评,中评,差评.0:好评,1:中评, ...