您的位置:首页 > 其它

过滤器

2016-03-07 09:19 218 查看
JavaWeb三大组件:Servlet、Listener(2个感知监听器不需要配置)、Filter,都需要在web.xml中进行配置

过滤器的作用是拦截请求,它会在一组资源(jsp、servlet、.css、.html等等)的前面执行!

过滤器如何编写

1. 写一个类实现Filter接口

2. 在web.xml中进行配置

package 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;

public class AFilter implements Filter {

@Override
public void destroy() {
// TODO Auto-generated method stub
}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
//chain.doFilter(request, response);  //放行
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}

}
<filter>
<filter-name>Afilter</filter-name>
<filter-class>filter.AFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Afilter</filter-name>
<url-pattern>/AServlet</url-pattern>
</filter-mapping>


Filter接口

void init(FilterConfig)

  * 创建之后,马上执行;Filter会在服务器启动时就创建!

  *FilterConfig有三个方法,作用是获取参数,获取过滤器名,获取appliction

        **getInitParameter()

        ** getFilterName()

       **getServletContext()

void destory()

  * 销毁之前执行!在服务器关闭时销毁

void doFilter(ServletRequest,ServletResponse,FilterChain)

 * 每次过滤时都会执行

*  FilterChain有一个方法,doFilter(ServletRequest, ServletResponse): 放行,就相当于调用了目标Servlet的service()方法!

Filter是单例的!

过滤器的四种拦截方式

  <dispatcher>REQUEST</dispatcher>默认的!

  <dispatcher>FORWARD</dispatcher>

  <dispatcher>INCLUDE</dispatcher>

  <dispatcher>ERROR</dispatcher>

在<filter-mapping>中进行配置!

举个栗子:

 <filter>
<filter-name>Afilter</filter-name>
<filter-class>filter.AFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Afilter</filter-name>
<url-pattern>/AServlet</url-pattern>
</filter-mapping>

<filter>
<filter-name>Bfilter</filter-name>
<filter-class>filter.BFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Bfilter</filter-name>
<url-pattern>/AServlet</url-pattern>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>

public class AServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("AServlet...");
}

}

public class BServlet extends HttpServlet {

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

request.getRequestDispatcher("/AServlet").forward(request, response);
}

}
public class AFilter implements Filter {

@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("过滤器死亡了");
}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("AServlet statrt!");
chain.doFilter(request, response);
System.out.println("AServlet end");
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
System.out.println("过滤器出生了");
}

}

public class BFilter implements Filter {

@Override
public void destroy() {
// TODO Auto-generated method stub

}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("BServlet statrt!");
chain.doFilter(request, response);
System.out.println("BServlet end");
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub

}

}
在地址栏输入http://localhost:8080/项目名/BServlet

运行结果:

BServlet statrt!

AServlet...

BServlet end

程序首先查看web.xml中的配置,AFilter拦截了AServlet,BFilter拦截了AServlet以及转发功能,BFilter拦截BServlet进行转发,然后放行,执行了AServlet

<filter-mapping>的配置顺序决定了过滤器的执行顺序!

过滤器的应用场景:

*执行目标资源之前做预处理工作,例如设置编码,这种试通常都会放行

*通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户IP是否已经被禁用

*在目标资源执行后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: