过滤器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);
}
}
今天把一个过滤器学习完了,能够在很多的应用场景中运用的上
过滤器的原理图:
<img src="" alt="" />
<img src="" alt="" />