`
qingwengang
  • 浏览: 29085 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Filter介绍

    博客分类:
  • jsp
阅读更多

    好久没写日志了,先在在温习Struts2,涉及到Filter,顺便在网上找到了一些Filter的简介,就顺便写点心得。

    可以说Filter类似于servlet,但它与servlet又有本质的区别,Filter不能像servlet那样直接对用户生成响应。Filter完整的工作流程:Filter先对用户请求进行预处理,然后交给servlet进行处理并生成用户响应,最后Filter再对服务器响应进行后处理。

    Filter有以下几大好处:

  1. 可以在HttpServletResquest到达servlet之前,拦截客户的HttpServletRequest。
  2. 根据用户需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
  3. 在HttpServletResponse到达客户端之前拦截HttpServletResponse。
  4. 可以根据需要检查HttpServletResponse,并修改HttpServletResponse头和数据。

   Filter种类:

  1. 用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户非法请求。
  2. 日志Filter:详细记录有些用户的特殊请求。
  3. 能改变xml内容的XSLT Filter等。

  Filter可负责拦截一个或多个请求或响应,一个请求或响应也可以同时被多个Filter拦截。

  创建一个Filter有两步:建Filter处理类;web.xml配制。

  创建Filter类:

       创建Filter类必须实现javax.servlet.Filter接口,该接口定义了三个方法:

  1.      void init(FilterConfig config);负责初始化
  2.     void destroy();负责Filter销毁前完成回收资源等操作
  3.    void doFilter(HttpServletRequest request,HttpServletResponse response,FilterChain chain);处理过滤功能。

先介绍一个简单的Filter应用,用于拦截所有用户的请求并将请求记录在日志中。

package com.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class FilterImpl implements Filter {
	private FilterConfig config;
	public void destroy() {
		// 实现销毁方法
		this.config=null;
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// 实现过滤的核心方法
		ServletContext context=this.config.getServletContext();
		long before=System.currentTimeMillis();
		System.out.println("filter start.....");
		HttpServletRequest hrequest=(HttpServletRequest)request;
		context.log("Filter has received the user's url:"+hrequest.getServletPath());
		chain.doFilter(request,response);
		long after=System.currentTimeMillis();
		context.log("filter over...");
		context.log("request被定位到"+hrequest.getRequestURI()+"所花费的时间为:"+(after-before));
	}

	public void init(FilterConfig config) throws ServletException {
		// 实现初始化方法
		this.config=config;

	}

}

 web.xml配制:

	<filter>
		<filter-name>log</filter-name>
		<filter-class>com.filter.FilterImpl</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>log</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

  

最终控制器窗口的实验结果: 

filter start.....
2010-5-3 14:03:26 org.apache.catalina.core.ApplicationContext log
信息: Filter has received the user's url:/index.jsp
2010-5-3 14:03:28 org.apache.catalina.core.ApplicationContext log
信息: filter over...
2010-5-3 14:03:28 org.apache.catalina.core.ApplicationContext log
信息: request被定位到/FilterDemo/index.jsp所花费的时间为:1360

  再来介绍一个功能稍微强大而且使用范围比较广的Filter类。该Filter用于设置request编码的字符集,从而避免每个Servlet都要设置;而且还会验证用户是否已经登录,如果没有登录将直接跳转到登录页面。

  下面是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.HttpSession;

public class AuthorityFilter implements Filter {
	private FilterConfig config;
	public void destroy() {
		this.config=null;
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		String encoding=config.getInitParameter("encoding");
		String loginPage=config.getInitParameter("loginPage");
		String proLogin=config.getInitParameter("proLogin");
		request.setCharacterEncoding(encoding);
		HttpServletRequest requ=(HttpServletRequest)request;
		HttpSession session=requ.getSession(true);
		String requestPath=requ.getServletPath();
		if(session.getAttribute("user")==null
				&&!requestPath.endsWith(loginPage)
				&&!requestPath.endsWith(proLogin)){
			System.out.println("cunge.........");
			request.getRequestDispatcher(loginPage).forward(request, response);
			
		}else{
			chain.doFilter(request, response);
		}
		
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		this.config=filterConfig;
	}

}

   web.xml配制如下:

	<filter>
		<filter-name>authority</filter-name>
		<filter-class>com.filter.AuthorityFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>GBK</param-value>
		</init-param>
		<init-param>
			<param-name>loginPage</param-name>
			<param-value>/login.jsp</param-value>
		</init-param>
		<init-param>
			<param-name>proLogin</param-name>
			<param-value>/proLogin.jsp</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>authority</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

  上面的web.xml为Filter类制定了三个配制参数。

 

分享到:
评论
2 楼 五月天 2010-06-02  
不知道楼主在使用Struts2时使用了filter没有?当把配置filter在web.xml中的配置放在struts2的filter前面时,struts2的一些拦截器失效,如设置编码的拦截器。当把filter的配置放在strut2的后面时,filter里的request对象会失效,怎么办?还望解决!谢谢
1 楼 五月天 2010-06-02  

相关推荐

    Vue filter介绍及详细使用

    Vue filter介绍及其使用 VueJs 提供了强大的过滤器API,能够对数据进行各种过滤处理,返回需要的结果。 Vue.js自带了一些默认过滤器例如: capitalize 首字母大写 uppercase 全部大写 lowercase 全部小写 currency ...

    Vue filter介绍及其使用详解

    本文将深入探讨Vue filter的介绍及其使用方法。 ### Vue Filter的基本概念 Vue过滤器主要用于数据的格式化,它们可以被用在插值表达式(mustache语法)或v-model指令中。Vue提供了几个内置的过滤器,包括`...

    CSS.Hacks.and.Filter

    #### 四、CSS Filter介绍 除了**CSS hacks**之外,还有一种被称为**CSS filter**的技术。虽然两者名称相似,但**CSS filter**实际上是指CSS3中的一组视觉效果属性,如模糊、亮度调整等。这些属性可以应用于HTML元素...

    FilterPro使用指南

    设计者可以通过这些工具快速入门,同时用户指南也会介绍如何更改FilterPro桌面中的组件参数,如何进行电容选择和运算放大器选择等。 指南中的部分内容会详细描述由通用有源滤波器UAF42构成的电路,以及如何使用...

    java中filter的用法(过滤器)

    ### Java中的Filter(过滤器)使用详解 ...以上就是关于Java中Filter(过滤器)的一些基本概念和具体实现方式的详细介绍。通过合理的使用Filter,开发者可以轻松地实现许多强大的功能,提高应用程序的安全性和性能。

    NDIS Filter Drivers编写介绍 4pdf

    在给定的PDF文档《NDIS Filter Drivers编写介绍》中,可能会详细介绍这些概念,并通过实例代码演示如何实际编写和实现一个Filter Driver。从文件名来看,这份文档应该分为四个部分,逐步深入讲解NDIS Filter Drivers...

    java filter打印请求返回参数

    本文将详细介绍如何利用Java Filter来打印请求和响应的数据。 #### 二、技术方案概述 为了实现在过滤器中获取请求体内容以及响应内容的功能,本方案主要采用了以下技术手段: 1. **对`HttpServletRequest`进行...

    FilterPro TI滤波器设计 安装包

    下面将详细介绍FilterPro的使用以及在win10 64位系统中的安装步骤。 **一、FilterPro主要功能** 1. **滤波器类型选择**:FilterPro支持多种滤波器结构,如巴特沃兹(Butterworth)、切比雪夫I型和II型、椭圆、...

    NDIS Filter Drivers指南

    #### 一、介绍NDIS Filter Drivers NDIS (Network Driver Interface Specification) Filter Drivers 是一种特殊的网络驱动程序,它们被设计用于在网络驱动程序栈中执行过滤和其他高级服务。这类驱动程序主要负责...

    FilterPro 安装及基本教程中英文

    这些文档详细介绍了软件的各个功能,包括如何创建新设计、编辑滤波器参数、仿真滤波器响应以及查看和打印设计报告。对于英文不熟练的用户,中文教程提供了同样详尽的指导,确保所有用户都能充分利用FilterPro的强大...

    java 中如何使用filter过滤器

    本文将详细介绍如何在Java中使用Filter过滤器,以及如何配置相关的配置文件,让你一目了然。 ### 1. Filter接口与生命周期 Filter是Servlet API中的一个接口,位于`javax.servlet`包下。它定义了三个关键方法: -...

    Filter在MyEclipse中的创建方法

    本文将详细介绍如何在MyEclipse集成开发环境中创建Filter,并通过实际操作来帮助理解其工作原理。 首先,我们需要了解Filter的基本概念。Filter在Servlet规范中定义,是一个实现了javax.servlet.Filter接口的类。它...

    CSS filter属性详解

    MDN filter介绍 filter CSS属性将模糊或颜色偏移等图形效果应用于元素。滤镜通常用于调整图像,背景和边框的渲染。 CSS标准里包含了一些已实现预定义效果的函数。你也可以参考一个SVG滤镜,通过一个URL链接到SVG滤镜...

    Filter知识点整理文档

    ### 一、Filter接口介绍 Filter接口是Java Servlet API的一部分,位于javax.servlet包下。主要包含以下三个方法: 1. `void init(FilterConfig config)`: 过滤器初始化方法,由容器调用,用于设置过滤器的配置信息...

    webfilter的教程

    `[转载]java web开发中的listener和filter`文件可能会介绍`Listener`,它们是另一种类型的Web组件,监听特定的事件,如会话创建或销毁,然后执行相应的操作。 `javax_servlet_Filter`的使用教程可能深入讨论了`...

    delphi资源-Filter中的模糊过滤

    本文将详细介绍在BDE(Borland Database Engine)和ADO(ActiveX Data Objects)环境下如何实现模糊过滤,并针对两种环境的不同特性进行对比分析。 #### 二、BDE与ADO中的模糊过滤 ##### 2.1 BDE环境下的模糊过滤 ...

    filter solutions

    本文将详细介绍该软件的功能、应用以及其在电子设计中的重要性。 一、滤波器设计的基本概念 滤波器设计是根据特定需求构建能够对信号进行频率选择的电路或算法的过程。常见的滤波器类型包括低通、高通、带通和带阻...

    javaWeb项目 filter练习

    下面将详细介绍这两个方面的内容。 **编码过滤** 在Web应用中,数据从客户端传输到服务器时,可能会遇到编码不一致的问题,导致乱码。编码过滤器的主要任务就是确保请求和响应中的字符集统一,通常会设置为UTF-8。...

    java中的filter

    通过上述介绍,我们可以看出`Filter`在Java Web开发中的重要作用,它为我们提供了灵活的请求处理机制,使得我们能够方便地实现诸如安全控制、性能优化等高级功能。在实际项目中,合理利用`Filter`可以极大地提高应用...

Global site tag (gtag.js) - Google Analytics