更新时间:2021-11-15 10:43:43 来源:极悦 浏览695次
Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。
当然,我们使用过滤器也是为了处理访问Servlet的数据。
首先我们来看一下Filter的用法。
1.创建一个类实现Filter接口
2.重写接口中方法 doFilter方法是真正过滤的。
3.在web.xml文件中配置
下面是实现Filter接口的类
public class TestFilter1 implements Filter{
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
//请求过滤
System.out.println("我是filter");
chain.doFilter(request, response);
//响应过滤
System.out.println("响应过滤 ");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
接下来我们需要重写接口中方法。
第三步呢就是我们需要在web.xml中配置过滤器的路径。
<filter>
<filter-name>TestFilter1</filter-name>
<filter-class>com.daliyuan.filter.TestFilter1</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
url-pattern中的内容也就是我们需要写的过滤地址。/*指的是过滤所有页面。
还有就是我们可以写确定的访问地址,比如servlet/Servlet1,这样的话我们指明确的过滤访问Servlet1的数据.
还有就是过滤路径格式是*.name,那么我们就可以过滤所有含有.name结尾的地址了。 格式跟servlet的url地址格式是一样的。
还有一种格式
<servlet-name>Servlet1</servlet-name>
它是对指定的servlet名称的servlet进行拦截的。
对于实现的接口的方法,我们下面再来具体看一下。
首先要注意到的就是doFilter方法中的chain参数。 chain的方法doFilter(request, response),它实现的功能就是继续执行下面的过滤器。
FilterChain 是 servlet 容器为开发人员提供的对象,它提供了对某一资源的已过滤请求调用链的视图。过滤器使用 FilterChain 调用链中的下一个过滤器,如果调用的过滤器是链中的最后一个过滤器,则调用链末尾的资源。
问题:怎样可以形成一个Filter链?
只要多个Filter对同一个资源进行拦截就可以形成Filter链
问题:怎样确定Filter的执行顺序?
由<filter-mapping>来确定,也就是xml配置文件的顺序。
我们来看一下下面的代码。
System.out.println("我是过滤器2.....请求");
chain.doFilter(request, response);//去执行下一个过滤器
System.out.println("我是过滤器2.....响应");
----------------------------------------------------
System.out.println("我是过滤器3。。。。。 请求");
chain.doFilter(request, response);//去执行index.jsp
System.out.println("我是过滤器3。。。。。 响应");
例如,这里的两个过滤器形成了Filter链,那么就先执行过滤器2然后过滤器3的请求代码。
等请求的页面响应时,是先返回到响应3然后到达响应2
还有一点,我们可能注意到了过滤器中的init方法和destroy方法。
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("=========初始化.....");
}
public void destroy() {
System.out.println("=========销毁了.....");
}
过滤器在服务器启动加载的时候就创建了,在服务器关闭的时候销毁。
Servlet生命周期:
实例化 --》 初始化 --》 服务 --》 销毁
当服务器启动,会创建Filter对象,并调用init方法,只调用一次.
当访问资源时,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,这个方法是真正拦截操作的方法.
当服务器关闭时,会调用Filter的destroy方法来进行销毁操作.
我们继续Filter。
下面我们要看的这个是FilterConfig。这个重要性应该一般。
在Filter的init方法上有一个参数,类型就是FilterConfig.
FilterConfig它是Filter的配置对象,它可以完成下列功能
1.获取Filter名称
2.获取Filter初始化参数
3.获取ServletContext对象。
我们获取到的数据是从配置文件获取的
<filter>
<filter-name>TestFilter5</filter-name>
<filter-class>com.qianfeng.filter.TestFilter5</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
然后呢,FilterConfig是这么用的。
private FilterConfig filterConfig;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String encode = filterConfig.getInitParameter("encoding");
//request.setCharacterEncoding(encode);
System.out.println(encode);
chain.doFilter(request, response);
}
GO ON 过滤器。
<dispatcher>
可以取的值有 REQUEST FORWARD ERROR INCLUDE
它的作用是:当以什么方式去访问web资源时,进行拦截操作.
1.REQUEST 当是从浏览器直接访问资源,或是重定向到某个资源时进行拦截方式配置的 它也是默认值
2.FORWARD 它描述的是请求转发的拦截方式配置
3.ERROR 如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
4.INCLUDE 如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用
<filter-mapping>
<filter-name>TestFilter6</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
这个是什么用呢。
之前我们每说过,比如当我们访问一个Servlet1时,Servlet1中有跳转,这时候我们之前的过滤器就不能发挥作用了。
那么就需要修改过滤器的配置了。
这是我们就需要设置dispatcher属性了。
上面也具体说明了,有四种取值。
这是我们再用resquest和response跳转的时候,我们的过滤器就可以拦截了。
Fliter过滤器就说这么多了。
通过上述相信大家对Filter使用方法已经有所了解,大家如果想了解更多相关知识,可以关注一下极悦的Filter教程,里面的内容通俗易懂,由浅到深,适合小白学习,希望对大家能够有所帮助。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习