javaee之过滤器

过滤器Filter:
一、生命周期
init():初始化,在创建过滤器对象的时候会被调用。在过滤器在web应用启动时创建,就只创建一次,以后再调用也不会初始化
doFilter():执行过滤的主要方法,用于过滤请求和响应,请求一次就调用一次,可以调用多次
destory():销毁方法,过滤器对象销毁的时候会被调用,也只是调用一次。


二、过滤器的作用:
Filter和Servlet一样都是在服务器中运行的,因此也是需要在web.xml进行配置
过滤器实现了Filter接口,用于在请求资源或者响应资源,或者请求和响应资源的时候,执行过滤任务


首先定义一个过滤器类

package c_example_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.HttpServletRequestWrapper;

/**
 * 过滤器首先要实现javax.servlet的Filter接口,并且实现其中的方法
 * @author Mao
 *
 */
public class demo1 implements Filter{

	//过滤器的销毁方法
	public void destroy() {
		System.out.println("过滤销毁");
	}

	//过滤器的主方法
	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		request.setCharacterEncoding("utf-8");
		
		//过滤的开始拦截
		System.out.println("请求的拦截 ");
		
		//使用装饰者的类进行加强,可以进行方法加强的过滤
		MyServlet myrequest = new MyServlet(request);
		
		//放行,执行过滤完了以后的后面的逻辑,或者是执行过滤链中的其他过滤
		chain.doFilter(myrequest,resp);
		
		//过滤后的执行
		System.out.println("响应的拦截");
		
	}

	//过滤器的初始化
	public void init(FilterConfig config) throws ServletException {
		//通过FilterConfig的对象可以得到在web.xml中对过滤器的配置属性
		String encoding = config.getInitParameter("encoding");
		
		System.out.println(encoding);
		System.out.println("过滤的初始化");
	}

}

/**
* 当要对一个类中的方法进行改造和加强,可以使用装饰者模式
*/

class MyServlet extends HttpServletRequestWrapper{
	//1)要设置一个成员变量用来进行设置
	private HttpServletRequest request;
	
	public MyServlet(HttpServletRequest request) {
		super(request);
		//2)在有参的构造方法中进行对成员变量的设置
		this.request = request;
	}
	
	//3)重写要进行加强的方法
	@Override
	public String getParameter(String name) {
		try {
			//1)得到原来的实际参数内容
			String value = request.getParameter(name);//iso-8859-1
			//2)增强
			if(value!=null && "GET".equals(request.getMethod())){
				value = new String(value.getBytes("iso-8859-1"),"utf-8");
			}
			//3)返回增强后内容
			return value;
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		
	}
	
	@Override
	public String[] getParameterValues(String name) {
		try {
			String[] values = request.getParameterValues(name);
			if(values!=null && "GET".equals(request.getMethod())){
				for(int i=0;i

然后在web.xml中进行配置



  
  
  
  
 	demo4
 	c_example_filter.demo1
 	
 	
 		encoding
 		xxx
 	
 
 
 	
 	demo4
 	/demo1
 	ERROR
 	FORWARD
 	INCLUDE
 	REQUEST
 


然后在servlet的处理前就会先走过滤器了

package c_example_filter;

import java.io.IOException;
import java.util.Arrays;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Cdemo1 extends HttpServlet {

	private static final long serialVersionUID = 1L;

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		//得到的数据可以通过过滤器把代码进行解码
		String name = request.getParameter("name");
		String[] names = request.getParameterValues("name");
		System.out.println(Arrays.asList(names));
		System.out.println(name);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
	}

}


 
  
今天把一个过滤器学习完了,能够在很多的应用场景中运用的上
过滤器的原理图:



你可能感兴趣的:(javaee)