javaFilter - juedaiyuer/researchNote GitHub Wiki

#过滤器#

过滤器

可以实现一些特殊的功能,实现URL级别的权限访问控制,过滤敏感词汇,压缩响应信息...
访问的请求和响应进行拦截

过滤器的生命周期

  1. 实例化 Web.xml
  2. 初始化 init()
  3. 过滤 doFilter()
  4. 销毁 destroy()

开发步骤

  1. 编写java类实现Filter接口,并实现其doFilter方法
  2. 在web.xml文件中使用和元素对编写的filter类进行注册,并设置它所能拦截的资源

##demo##

使用JavaEE 5.0

myEclipse创建过滤器类

选项中实现了过滤器接口.

init() 过滤器的初始化方法,Web容器创建过滤器实例后将调用这个方法.这个方法可以读取web.xml文件中过滤器的参数

doFilter() 当用户请求访问与过滤器相关联的URL时,Web容器将先调用该方法.FilterChain参数可以调用chain.doFilter方法,将请求传递给下一个过滤器(或者目标资源),或利用转发,重定向将请求转发到其它资源

destroy() ...大多数情况用不到

web.xml的配置

Design模块可以进行图形化操作

myEclips过滤器图形化配置

myEclipse过滤器映射图形化配置

进行完配置之后,可以进行下面的程序测试

过滤器启动顺序测试程序

package com.juedaiyuer.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;

public class myFilter implements Filter {

	public void destroy() {
		// 刷一下存在感
		System.out.println("destroy");
	}

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		
		System.out.println("start---doFilter");
		arg2.doFilter(arg0, arg1);  //让目标资源执行,放行
		System.out.println("end---doFilter");

	}

	public void init(FilterConfig arg0) throws ServletException {
		
		System.out.println("init");

	}

}

FilterConfig对象

方法:

getFilterName() 
getInitParameter() 
getInitParameterNames()

注册Filter

  用于为过滤器指定一个名字,该元素的内容不能为空。   元素用于指定过滤器的完整的限定类名。   元素用于为过滤器指定初始化参数,它的子元素指定参数的名字,指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。如果过滤器不需要指定初始化参数,那么元素可以不配置。

映射Filter

 元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径   子元素用于设置filter的注册名称。该值必须是在元素中声明过的过滤器的名字   设置 filter 所拦截的请求路径(过滤器关联的URL样式)   指定过滤器所拦截的Servlet名称。   指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个 子元素用来指定 Filter 对资源的多种调用方式进行拦截。

多个过滤器

服务器会按照web.xml中过滤器定义的先后顺序组装成一条链

##分类##

servlet2.5

myEclipse过滤器映射图形化配置

request过滤

用户直接访问页面时,web容器将会调用过滤器
如果目标资源是通过RequestDispatcher的include()或者forward()方法访问时,那么该过滤器就不会被调用

forward

如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。

include

如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

error

如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

⚠️ **GitHub.com Fallback** ⚠️