`
qingwengang
  • 浏览: 27485 次
  • 性别: 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介绍及其使用详解,VueJs 提供了强大的过滤器API,能够对数据进行各种过滤处理。一起跟随小编过来看看吧

    NDIS Filter Drivers编写介绍 4pdf

    NDIS Filter Drivers编写介绍 总共4个pdf,介绍了NDIS6下Filter Driver的用法。是NDIS5下PassThru的替代

    CSS filter属性详解

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

    卡尔曼滤波(Kalman Filter)原理介绍

    该资源是卡尔曼滤波(Kalman Filter)原理,内含实例代码,看了众多文章后,自己的理解。实例一个鼠标跟踪程序。

    java中filter的用法(过滤器)

    java中filter的用法(过滤器),介绍各种过滤方法

    Electronic Filter Design Handbook

    《电子滤波器设计》作为一本全面介绍电子滤波器设计的经典书籍,内容包括如何选择滤波器的响应曲线,低通、高通、带通及带阻滤波器的设计,LC滤波器的设计,数字滤波器设计,有限冲激响应滤波器设计,无限冲激响应...

    介绍Bloom Filter(布隆过滤器)原理、实现及具体应用

    介绍Bloom Filter(布隆过滤器)原理、实现及具体应用,包含9个不同PPT及PDF文档资料,对Bloom Filter感兴趣、想学习的同学可以下载查看下

    matlab中filter conv impz用法

    叙述了MATLAB中几种相关函数的用法,对filter conv 和impz函数进行了介绍

    UIpath数据筛选Filter Data Table的介绍和使用

    筛选器Filter场景案例

    j2ee Filter使用原理

    j2ee Filter使用原理本代码里面首先是介绍了Filter实现的原理,然后模拟的了j2ee项目中Filter的使用原理,然后由此又延伸了Struts2的Interceptor实现原理,并且给予了详细的注释。

    matlab中filter 设计

    主要介绍matlab 中filter的设计及对信号滤波前后的对比过程。

    Spring Boot使用Servlet及Filter过程详解

    主要介绍了Spring Boot使用Servlet及Filter过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    J2EE之filter的应用

    介绍如何在j2ee下的web应用,合理使用filter技术

    webfilter的教程

    本篇文章是介绍javax.servlet包中Filter的几个功能,一是字符编码过滤,二是拦截指文件夹中的文件,实现登录验证

    RFID数据流近似去重

    3.初期(基本bloom filter介绍): 为了表达S={x1, x2,…,xn}这样一个n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每个元素映射到{1,…,m}的范围中。对任意一个元素...

    JSP中Filter的使用方法

    详尽地介绍了JSP中Filter的使用方法,欢迎下载本资源,谢谢

    SpringBoot拦截器Filter的使用方法详解

    主要介绍了SpringBoot拦截器Filter的使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    FilterPro使用指南

    详细地介绍如何使用TI公司的FilterPro。希望对你有所帮助!

Global site tag (gtag.js) - Google Analytics