首先,什么是过滤器?
过滤器有什么功能?
过滤器的执行流程:
方法说明:
首先,创建三个过滤器:
第一个:
package com.xust.jia.filter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
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;
/**
*
* @author
public class Filter implements javax.servlet.Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println();
System.out.println();
System.out.println(sdf.format(new Date())+"过滤器0将被销毁");
System.out.println();
System.out.println();
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println();
System.out.println();
System.out.println(sdf.format(new Date())+"filter0访问的地址:"+((HttpServletRequest)request).getServletPath());
System.out.println();
System.out.println();
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println();
System.out.println();
System.out.println(sdf.format(new Date())+"过滤器0将被创建");
System.out.println();
System.out.println();
}
}
第二个:
package com.xust.jia.filter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
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 Filter1 implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println();
System.out.println();
System.out.println(sdf.format(new Date())+"过滤器1将被销毁");
System.out.println();
System.out.println();
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if(request.getParameter("user") != null){
System.out.println();
System.out.println();
System.out.println(sdf.format(new Date())+"filter1参数:"+request.getParameter("user"));
}
if(request.getParameter("user") != null){
System.out.println(sdf.format(new Date())+"filter1参数:"+request.getParameter("password"));
System.out.println();
System.out.println();
}
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println();
System.out.println();
System.out.println(sdf.format(new Date())+"过滤器1将被创建");
System.out.println();
System.out.println();
第三个:
package com.xust.jia.filter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
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 Filter2 implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println();
System.out.println();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "Filter2被销毁");
System.out.println();
System.out.println();
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println();
System.out.println();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "Filter2被使用");
System.out.println();
System.out.println();
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
System.out.println();
System.out.println();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "Filter2被创建");
System.out.println();
System.out.println();
然后在Web.xml中进行配置:
<filter>
<filter-name>filter</filter-name>
<filter-class>com.xust.jia.filter.Filter</filter-class>
</filter>
<filter>
<filter-name>filter1</filter-name>
<filter-class>com.xust.jia.filter.Filter1</filter-class>
</filter>
<filter>
<filter-name>filter2</filter-name>
<filter-class>com.xust.jia.filter.Filter2</filter-class>
</filter>
<filter-mapping>
<filter-name>filter2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>filter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:
mapping的顺序就是过滤器链的顺序:
比如:filter1在mapping的第一个,那么,当过滤器开始工作的时候,最先进入的就是filter1的doFilter函数。所以需要注意。
然后,启动服务器,开始运行项目:
这就是服务器创建过滤器的顺序,这个顺序是不确定的,但是这一次是这个顺序,那么以后只要数量不发生变化,那么顺序就是一样的。
具体原因是因为服务器里的HashMap,但具体在那里,请各位百度。
这里的过滤链的先后顺序就是mapping的顺序了。
所以,总结如下:
过滤器在Web.xml中配置,mapping的顺序就是链的顺序。
如果需要拒绝这个请求,在最里层不加chain.doFilter().
最后一层如果添加了chain.doFilter()函数,那么服务器会在Web.xml中进行搜索,如果是最后一层的过滤器,那么就通过这个请求,否则就拒绝。
通过请求是通过默认调用servlet的doGet方法,将request,respones参数传入来进行实现。