过滤器

过滤器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<values.length;i++){
					values[i] = new String(values[i].getBytes("iso-8859-1"),"utf-8");
				}
			}
			return values;
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	
}

然后在web.xml中进行配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>
  
  <!-- 设置了过滤器之后要在web.xml中进行配置,过滤链中过滤的顺序主要看filter-mapping的顺序 -->
  <filter>
 	<filter-name>demo4</filter-name>
 	<filter-class>c_example_filter.demo1</filter-class>
 	<!-- 在过滤器中也可以进行参数的配置 -->
 	<init-param>
 		<param-name>encoding</param-name>
 		<param-value>xxx</param-value>
 	</init-param>
 </filter>
 <filter-mapping>
 	<!--dispatcher的属性,error表示当页面是错误的时候进行过滤
 		forward表示当页面有转发的语句,可以设置对转发的页面进行过滤
 		include表示当页面有包含的语句,要过滤是可以设置对包含的页面进行过滤
 		request表示页面就是普通的页面,既没有转发也没有包含和错误,直接进行过滤,默认为request
 	  -->
 	<filter-name>demo4</filter-name>
 	<url-pattern>/demo1</url-pattern>
 	<dispatcher>ERROR</dispatcher>
 	<dispatcher>FORWARD</dispatcher>
 	<dispatcher>INCLUDE</dispatcher>
 	<dispatcher>REQUEST</dispatcher>
 </filter-mapping>
</web-app>


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


<pre name="code" class="java">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);
	}
 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值