java web的过滤器

1.什么是Filter

        Filter称为过滤器,它是Servlet技术中最实用的技术,web开发人员通过Filter技术,对web服务器所管理的资源(JSP,Servlet,静态图片或静态html文件)进行拦截,从而实现一些特殊的功能。Filter就是过滤从客户端向服务器发送的请求。

2.过滤器原理图

         

3.过滤器的例子

  1)过滤器的配置

 <filter>
          <filter-name>FileDemo1</filter-name>
          <filter-class>filter.FilterDemo1</filter-class>
  </filter>
  <filter-mapping>  
            <filter-name>FileDemo1</filter-name>
            <url-pattern>/*</url-pattern>
  </filter-mapping>

2)测试的例子FilterDemo1.java;

package 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 FilterDemo1 implements Filter{

	public void destroy() {
		// TODO Auto-generated method stub	
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		System.out.println("Filterdemo1执行了....");
		// 放行
		chain.doFilter(request, response);
	}

	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}
}

4.关于FilterChain对象

        FilterChain过滤器链:在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称为是一个过滤器链。Web服务器根据Filter在web.xml文件中的注册顺序(mapping的配置顺序)决定先调用那个Filter。依次调用后面的过滤器,如果没有下一个过滤器,调用目标资源。   

5.Filter的生命周期

       Filter的创建和销毁是由web服务器负责。Web应用程序启动的时候,web服务器创建Filter的实例对象。并调用其init方法进行初始化(filter对象只会创建一次,init方法也只会执行一次)。每次filter进行拦截的时候,都会执行doFilter的方法。当服务器关闭的时候,应用从服务器中移除的时候,服务器会销毁Filter对象。

6.FilterConfig对象的获取

  用来获得Filter相关配置的对象;

FilterDemo2.java (获取FilterConfig相关配合的小demo):

package filter;

import java.io.IOException;
import java.util.Enumeration;
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 FilterDemo2 implements Filter{

	public void destroy() {		
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain filterChain) throws IOException, ServletException {
		System.out.println("Filter chain");
		filterChain.doFilter(request, response);
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		// 获得过滤器的名称
		String filterName = filterConfig.getFilterName();
		System.out.println(filterName);
		// 获取初始化参数
		String username=filterConfig.getInitParameter("username");
		String password=filterConfig.getInitParameter("password");
		System.out.println(username);
		System.out.println(password);
		// 获得所有初始化参数的名称
		Enumeration<String> names=filterConfig.getInitParameterNames();
		while (names.hasMoreElements()) {
			String name=names.nextElement();
			String value = names.nextElement();
			System.out.println(name+" "+value);
		}
	}
}

这个获取xml文件中的初始化参数;并将参数打印到后台;

7.过滤器的相关配置

  1. 完全路径匹配           :以/开始   比如/aaa  /aaa/bbb
  2. 目录匹配                    :以/开始 以*结束  比如/*  /aaa/*  /aaa/bbb/*
  3. 扩展名匹配               :不能以/开始 以*开始 比如*.jsp  *.do   *.action

<servlet-name>的配置 专门以Servlet的配置的名称拦截Servlet。

默认的情况下过滤器会拦截请求。如果进行转发(需要拦截这次转发)。

dispatcher的取值

  1. REQUEST :默认值。默认过滤器拦截的就是请求。
  2. FORWARD:转发。
  3. INCLUDE :页面包含的时候进行拦截
  4. ERROR     :页面出现全局错误页面跳转的时候进行拦截

过滤器复习的一个综合案例:

         现在一个网站上需要有登录的功能,在登录成功后,重定向到后台的成功页面(后台的页面有很多)。如果现在没有登录直接在地址栏上输入后台页面地址。编写一个过滤器:可以对没有登录的用户进行拦截。(没有登录,回到登录页面。如果已经登录,放行。)

github代码地址:https://github.com/zhangyu345293721/login_filter

 

猜你喜欢

转载自blog.csdn.net/zy345293721/article/details/85323215