欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

javaEE Filter, 过滤器

程序员文章站 2022-06-23 18:36:07
...

编写步骤:
1)编写一个过滤器的类实现Filter接口
2)实现接口中尚未实现的方法 (着重实现doFilter方法)
3)在web.xml中进行配置 (主要是配置要对哪些资源进行过滤)

Filter的主要作用:
1)公共代码的提取
2)可以对request和response中的方法进行增强(装饰者模式/动态代理)
3)进行权限控制


MyFilter(过滤器,实现Filter接口):

package com.xxx.web.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 MyFilter implements Filter{
	
	@Override
	//Filter创建的时候执行init方法  (Tomcat服务器启动时,创建filter)
	public void init(FilterConfig filterConfig) throws ServletException {
		//1、获得web.xml中filter 的名称<filter-name>QuickFilter1</filter-name>
		System.out.println(filterConfig.getFilterName());
		//2、获得当前filter的初始化参数
		System.out.println(filterConfig.getInitParameter("aaa"));
		//3、获得servletContext
		filterConfig.getServletContext();
		
		System.out.println("init ....");
	}

	@Override
	//doFilter是Filter的核心过滤的方法
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request; // 如果要使用HttpServletRequest的私有方法,必须进行类型强转。
		HttpSession session = req.getSession();  // 强转成HttpServletRequest类型,才能获取session对象。
		
		//放行请求
		chain.doFilter(request, response);  // chain过滤器链对象。 (多个过滤器,形成过滤器链)
	}

	@Override
	//Filter对象销毁的时候执行destory方法。 (Tomcat服务器正常关闭时,filter销毁)
	public void destroy() {
		System.out.println("destroy...");
	}

}
web.xml(配置文件,配置过滤器):
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>MyWeb11</display-name>
  
  <filter>   <!-- 过滤器配置 -->
  	<filter-name>MyFilter</filter-name>
  	<filter-class>com.xxx.web.filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>   <!-- 多个过滤器的过滤顺序由filter-mapping的配置顺序来决定 -->
  	<filter-name>MyFilter</filter-name>
  	<url-pattern>/*</url-pattern>  <!-- 也可以通过<servlet-name>xxx</servlet-name>替代url-pattern,来指定要过滤的资源 -->
  	<!-- <dispatcher>REQUEST</dispatcher> -->   <!-- 配置访问方式。REQUEST(默认),FORWARD,INCLUDE,ERROR -->
  </filter-mapping>
  
</web-app>