南京网站建设外包,互联网保险管理办法2021,wordpress导航代码,做微商必会的软件网站1.Filter概述
Servlet Filter又称Servlet过滤器#xff0c;它是在Servlet2.3规范中定义的#xff0c;能够对Servlet容器传给Web资源的request对象和response对象执行检查和修改。
Filter不是Servlet#xff0c;不能直接访问#xff0c;其本身也不能生成request对象和resp…1.Filter概述
Servlet Filter又称Servlet过滤器它是在Servlet2.3规范中定义的能够对Servlet容器传给Web资源的request对象和response对象执行检查和修改。
Filter不是Servlet不能直接访问其本身也不能生成request对象和response对象只能为web资源提供以下过滤功能
1在web资源被访问前检查request对象修改请求头和请求正文或对请求执行预处理操作。
2将请求传递到下一个过滤器或目标资源。
3在web资源被访问后检查response对象修改响应头和响应正文。 Filter是Servlet规范中最实用的技术通过其可对服务器管理的所有web资源jspservlethtml等拦截从而实现特殊的功能例如用户权限控制、过滤敏感词、设置统一编码格式等。 注意:过滤器并不是必须要将请求传递到下一个过滤器或目标资源可自行对请求处理并发送响应给客户端也可以将请求转发或重定向到其他web资源。 2.Filter接口
与开发Servlet需要实现javax.servlet.Servlet接口类似开发过滤器要实现javax.servlet.Filter接口并提供一个公开的不带参数的构造方法在Filter接口中定义了3个方法如下所示
1init该方法用于初始化过滤器。
2doFilter():该方法完成实际的过滤操作当客户端请求的URL与过滤器映射的URL匹配时容器会先调用该方法对请求进行拦截。
3destroy:该方法在销毁Filter对象之前被调用用于释放被Filter对象占用的资源。 3、Filter的工作流程
1客户端请求访问容器内的web资源。
2Servlet容器接收请求并针对本次请求分别创建一个request对象和response对象。
3请求到达web资源之前先调用Filter的doFilter方法检查request对象修改请求头和请求正文或对请求执行预处理操作。
4在Filter的doFilter()方法内调用FilterChain.doFilter()方法将请求传递给下一个过滤器或目标资源。
5目标资源生成响应信息返回客户端之前处理控制权会再次回到Filter的foFilte方法执行FilterChain.doFilter()后的语句检查response对象修改响应头和响应正文。
6响应信息返回客户端。 4、Filter生命周期分为3个阶段
1初始化阶段
Servlet容器负责加载和实例化Filter。容器启动时读取web.xml或WebFilter的配置信息加载和实例化所有过滤器。
加载和实例化完成后Servlet容器调用init方法初始化Filter实例。在Filter生命周期内init方法只执行一次。
2拦截和过滤阶段
这个阶段是Filter生命周期中最重要的阶段。当客户端请求访问web资源时Servlet容器会根据web.xml或WebFilter的过滤规则执行检查。当客户端请求的URL与过滤器映射匹配时容器将该请求的request对象以及FilterChain对象以参数的形式传递给Filter的doFilter方法并调用该方法请求/响应拦截和过滤。
3销毁阶段
Filter对象创建后会驻留在内存中直到容器关闭或应用被移除时销毁销毁Filter对象之前容器会先调用destory方法释放过滤器占用的资源。在Filter生命周期内destory只执行一次。 5.注册和映射Filter
1通过web.xml配置
元素说明
filter用于注册过滤器
filter-name是filter元素的子元素用于指定过滤器的注册名该元素的内容不能为空。
filter-class是filter元素的子元素用于指定过滤器的完整限定名包名类名
init-param是filter元素中的子元素用于为过滤器指定初始化参数它的子元素param-name指定参数的名称param-value指定参数的值 filter-mapping元素用于设置Filter负责拦截的资源。
filter-name是filter-mapping元素的子元素用于设置Filter的注册名该值必须在filter元素的子元素filter-name中声明过。
url-pattern是filter-mapping元素的子元素用于设置Filter拦截的请求路径。
servlet-name是filter-mapping元素的子元素用于指定Filter拦截的资源被Servlet容器调用的方式可以是REQUEST,INCLUDE,FORWAED和ERROR之一。默认情况是REQUEST。用户可以设置多个dispatcher子元素指定Filter对资源的多种调用方式进行拦截。
dispather元素的取值及意义
REQUEST:当用户直接访问页面时容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include或forward()方法访问则该过滤器就不会被调用。
INCLUDE:如果目标资源通过RequestDispatcher的include()方法访问则该过滤器将被调用除此之外该过滤器不会被调用。
ERROR:如果目标资源通过声明式异常处理机制访问则该过滤器将被调用除此之外过滤器不会被调用。
2通过WebFilter注解配置
WebFilter注解也可配置过滤器容器在部署应用时会根据具体属性配置将相应类部署为过滤器。
WebFilter注解具有下标给出的一些常用属性但是value,urlPatterns,servletNames三者必须至少包含一个且value和urlPatterns不能共存如果同时指定通常忽略value的取值。 6、过滤器链
在web应用中可部署多个Filter若这些Filter都拦截同一目标资源就组成了一个Filter链过滤器链中的每个过滤器负责特定操作和任务客户端请求在各个过滤器减传递直至传递给目标资源。
FilterChain接口javax.servlet包中提供了一个FilterChain接口该接口由容器实现。容器将其实例对象作为参数传入Filter对象的doFilter()方法中。Filter对象可以使用FilterChain对象调用链中下一个Filter的doFilter方法若该Filter是链中最后一个过滤器则调用目标资源的service方法。FilterChain接口中只有一个方法——doFilter详细信息如下 7.Filter链的拦截过程
请求资源时过滤器链中的过滤器一次对请求处理并将请求传递给下一个过滤器直到最后将请求传递给目标资源发送响应信息时。则按照相反的顺序对相应处理直到将响应返回给客户端。 注意过滤器链中的任何一个Filter没有调用FilterChain.doFilter()方法请求都不会达到目标资源。
8、总结Filter代码编写流程
1定义类实现Filter接口并重写其所有方法
2配置Fiter拦截资源的路径在类上定义WebFilter注解或者web.xml文件配置。
3在doFilter方法中设置处理的方法。 具体的代码案例
span stylebackground-color:#f8f8f8span stylecolor:#333333package Filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
WebFilter(/*) //表示拦截所有资源
public class UserSessionFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}
Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println(过滤器成功执行);//放行filterChain.doFilter(servletRequest,servletResponse);
}
Overridepublic void destroy() {Filter.super.destroy();}
}/span/span 运行截图