up:: 常用功能与过滤器内容概述
本篇博客主要介绍过滤器的基本内容,同时编写一个过滤器小例子。
一:过滤器简介
1.什么是过滤器?
空气净化器,净水器,车站安检系统:过滤某些东西;
而且这些过滤流程中往往有好多关,“过滤”好多次;比如飞机安检就有三个“过滤器”,会先检查行李,然后检查随身包裹,然后检查身体,任何一关不通过都无法登机。
如果在JavaWeb中:向一个web应用发去很多请求,有的请求符合要求,有的请求不符合要求,Java提供了过滤器对其进行处理。
比如有的请求不完善,需要过滤器拦截后处理一下再向后传递;;;而有的请求是不能放行的,对于这样的请求就不适用chain.doFilter()以达到中断拦截的作用;
任何一个Servlet都内置了过滤器:可以这样理解,编写好的过滤器可以直接应用到Servlet中,底层已经处理好了。。。。
2.过滤器执行过程:
3.过滤器开发的三要素:
二:过滤器范例
1.创建过滤器
第一步:创建一个web工程,并编写一个类实现Filter接口:即编写过滤器类
MyFirstFilter: 一个类想要成为一个过滤器类,需要实现javafx.servlet.Filter接口 ;实现Filter接口的类必须实现init(),doFilter(),destroy()方法。重点关注doFilter()方法,这个方法需要我们去编写,这儿出于简单演示目的,我们只让doFilter()方法在控制台打印“过滤器已执行”。
package com.imooc.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 MyFristFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
/**
* doFilter方法三个参数:ServletRequest:请求对象;ServletResponse:响应对象;FilterChain:过滤链对象
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("过滤器已执行");
chain.doFilter(request, response); // 将请求与响应对象随着过滤链依次向后传递,如果不写这句话,请求是无法向后被正常地传递的;
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
第二步:过滤器编写好之后,需要在web.xml进行配置:这儿处于简单演示目的,url-pattern设成了/*,即对所有url都进行拦截;
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>first-filter</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- filtler标签用于说明哪个类是过滤器,并在应用启动时自动加载,即自动实例化这个类的对象,并对其进行加载 -->
<filter>
<filter-name>MyFrist</filter-name>
<filter-class>com.imooc.filter.MyFristFilter</filter-class>
</filter>
<!--
filter-mapping标签用于说明过滤器对URL应用的范围:
1.filter-name 过滤器别名,需要与上面<filter>标签中定义的地方保持一致;
2.url-pattern 说明过滤器作用范围,/*代表对所有URL进行过滤;(/*也听常用的)
-->
<filter-mapping>
<filter-name>MyFrist</filter-name>
<url-pattern>/*</url-pattern> <!-- /*代表对所有的url请求都进行拦截 -->
</filter-mapping>
</web-app>
至此,一个过滤器已经编写好了!
2.测试过滤器是否编写成功
为了测试过滤器,添加index.html和HelloServlet两个资源:(自然这访问这两个资源的url也不同,仅仅是为了对应下上面的/*而已)
运行程序:
访问index.html:
发现控制台
访问HelloServlet:
注: (1)可以看到,将过滤器类编写完成并在web.xml中配置后,并没有在Servlet或html中设置过滤器,估计这个工作是Tomcat服务器完成了吧 ……这应该也印证了博客开头说的“任何一个Servlet都内置了过滤器:可以这样理解,编写好的过滤器可以直接应用到Servlet中,底层已经处理好了。。。。”这句话。
(2021-11-18加): J2EE定义了很多java的标准,这些标准包括Servlet,filter等;Tomcat这个第三方厂商容器提供了这些标准的实现;也就是,Tomcat提供了Servlet和filter的实现;所以,当我们基于Tomcat使用Servlet和filter时,直接拿来用就行了;Servlet和filter的整合工作,J2EE标准和Tomcat已经帮我们做好了,作为用户直接拿来用就行了;