Filter过滤器入门
Posted 好多个码农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Filter过滤器入门相关的知识,希望对你有一定的参考价值。
第一章 过滤器简介
1.1 过滤器是什么
简而言之,是在servlet之前执行,拦截请求,将servlet中一些共同的业务代码抽取出来,这就是过滤器作用。比如:请求乱码处理。
过滤器开发入门
1、过滤器API介绍
Filter是由Tomcat启动时创建,是javax.servlet包下面的一个接口,这个接口中定义了3个方法。
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package javax.servlet;
import java.io.IOException;
public interface Filter {
void init(FilterConfig var1) throws ServletException;
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
void destroy();
}
方法 | 说明 |
---|---|
void init(FilterConfig filterConfig) | 过滤器对象创建的时候调用的方法 |
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) | 执行过滤的方法 |
void destory() | 过滤器销毁的时候调用的方法 |
Filter配置
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
@javax.servlet.annotation.WebFilter("/${Entity_Name}")
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ${Class_Name} implements javax.servlet.Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, java.io.IOException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
//your code....
chain.doFilter(request, response);
}
@Override
public void init(javax.servlet.FilterConfig config) throws javax.servlet.ServletException {
}
}
-
项目中如果需要使用到过滤器,使用Servlet3.0的注解方式进行创建。创建步骤如下:
-
第一步:新建一个普通java类,实现Filter接口;
-
第二步:根据提示重写Filter接口的3个方法;
-
第三步:在这个类上面通过注解的方式配置这个Filter;
-
注解@WebFilter:配置Filter的注解,这个注解有两个参数;
-
filterName:设置过滤器的名称;
-
urlPatterns:配置这个过滤器要拦截的资源的路径;
-
-
-
第四步:在doFilter()方法中,书写过滤的业务逻辑;
-
chain.doFilter()方法放行;
-
总结:
doFilter()方法的作用
当不写doFilter()方法时候,jsp文件访问不到,被拦截;
当有了doFilter()方法时候,jsp文件可以访问,被放行;所以:doFilter()具有放行的作用。
Filter的生命周期
上面,我们分析了Filter的执行流程。我们有没有想过,我们并没有向Filter发送请求,请求是怎么进入到doFilter()中的呢。我们知道,能够调用一个类下面的非静态的成员方法,一定是这个类的对象。Filter类的对象是在什么时候创建的呢?创建之后又是怎么工作的呢?最后是在什么时候销毁的呢?这些问题就是Filter的生命周期问题。我们,可以通过以下代码对Filter的生命周期问题进行验证:
【结论】
-
Filter类的对象是在服务器启动的时候创建的;
-
Filter类对象创建完成后会调用init()方法;
-
每当一个请求的路径是满足过滤器的配置路径,那么就会执行一次过滤器的doFilter方法 (类似于service方法)
-
当服务器停止的时候,销毁过滤器,执行过滤器的destory方法
1、doFilter()方法
doFilter()方法是拦截请求的方法,只要一个请求符合Filter拦截路径,都会被doFilter()方法拦截。doFilter()方法有3个参数,这3个参数的作用分别如下:
参数 | 说明 |
---|---|
ServletRequest req | ServletRequest是HttpServletRequest类的父类,其中包含了被拦截的请求的信息 |
ServletResponse resp | ServletResponse是HttpServletResponse类的父类,其中包含了被拦截的响应的信息 |
FilterChain chain | FilterChain给Filter提供了放行的方法。chain.doFilter(); |
FilterChain 类是一个接口,里面有doFilter(req,resp)方法,作用是将浏览器提交请求对象和响应对象传到过滤连的资源里面去,所以doFilter()方法具有放行的作用。
2、destory()方法
过滤器的销毁方法。服务器停止或者将项目从服务器中移除的时候,销毁过滤器,调用一次destory方法。
【结论】
-
过滤器是在服务器停止或者项目移除时销毁的;
-
过滤器销毁后会调用destory()方法;
【小结】Filter生命周期小结
-
当服务器启动的时候,过滤器就被初始化了,执行过滤器的init方法
-
每当一个请求的路径是满足过滤器的配置路径,那么就会执行一次过滤器的doFilter方法
-
当服务器停止的时候,销毁过滤器,执行过滤器的destory方法
以上是关于Filter过滤器入门的主要内容,如果未能解决你的问题,请参考以下文章