Filter是什么意思(本文带你超详细的了解滤波器的原理和应用)。
什么是过滤器
1)过滤器的基本功能是拦截Servlet容器调用Servlet (JSP)的过程,从而实现Servlet处理请求之前和Servlet响应请求之后的一些特殊功能。
2)在Servlet API中定义了三个接口类,供开发人员编写filter程序:Filter、filterchain、filterconfig
3) Filter程序是实现Filter接口的Java类,类似于Servlet程序,由Servlet容器调用执行
4)Filter程序需要在web.xml文件中注册,并设置可以拦截的资源:Filter程序可以拦截Jsp、Servlet、静态图片文件、静态html文件
过滤器的工作原理是什么
这个Servlet过滤器是我们的过滤器
1)当在web.xml中注册了一个Filter来拦截一个Servlet程序时,Filter就成了Tomcat和Servlet程序之间通信线路上的一道屏障。过滤器可以拦截Servlet容器向Servlet程序发送的请求和Servlet程序向Servlet容器发回的响应,并决定是否将请求传递给Servlet程序以及是否修改请求和相应的信息。
2)一个web应用可以注册多个Filter程序,每个Filter程序可以截取一个或一组Servlet程序。
3)如果多个Filter程序拦截了一个Servlet程序的访问过程,当对该Servlet的访问请求到达时,web容器会将这些多个Filter程序组合成一个Filter链。过滤器链中每个过滤器的拦截顺序与它们在应用程序的web.xml中的映射顺序一致
过滤器-helloword
你好-世界
编写过滤器有三个步骤:
1.创建一个过滤器实现类来实现过滤器接口
2.编写一个web.xml配置文件来配置过滤器的信息
3.运行项目,您可以看到过滤器工作正常
代码:
//1。过滤器实现类
公共类MyFirstFilter实现筛选器{
@覆盖
public void init(filter config filter config)引发ServletException {
System.out.println('初始化方法');
{}
@覆盖
public void doFilter(servlet request请求、ServletResponse响应、FilterChain链)引发
IOException,ServletException {
System.out.println('dofilter方法');
{}
@覆盖
public void destroy() {
System.out.println('销毁方法.');
{}
{}
//2。web.xml配置
我的过滤器
com . at guigu . filter . MyFirstFilter
我的过滤器
/index.jsp
//3。运行程序后发现没有显示index.jsp页面,后台输出“dofilter Method”,表示我们写的过滤器已经执行。
过滤器的生命周期
1)当服务器启动时,创建并初始化过滤器,并执行init()方法。
2)当请求通过过滤器时,执行doFilter方法。
3)当服务器停止时,调用销毁方法。
过滤释放请求
我们发现刚才配置了过滤器后,index.jsp页面无法访问,访问该页面时调用了过滤器的dofilter方法。说明dofilter方法截获了我们的请求。
我们如何显示页面?也就是如何释放请求。我们观察到在这个方法中引入了一个过滤链。filterChain中有一个doFilter()方法。发布请求只需要调用filterChain的dofilter方法。
public void doFilter(servlet request请求,ServletResponse响应,FilterChain)引发IOException,ServletException {
System.out.println('dofilter方法');
chain.doFilter(请求,响应);//发布请求
{}
过滤器拦截原理
我们被锁住了。dofilter(请求、响应);在方法后面写一个字,System.out.println
(“执行doFilter方法后……”),在index.jsp页面上写一个jsp脚本片段,输出我是一个jsp页面。运行程序发现,控制台输出以下文字:
Dofilter方法…我是jsp页面
在dofilter方法之后…
不难发现过滤器的运行过程
FilterChain
doFilter(ServletRequest请求、ServletResponse响应、FilterChain链)
在执行doFilter之前,筛选器链对象由容器传递到方法中。可以通过调用。这个对象的doFilter()方法,它实际上执行过滤器链中的下一个doFilter方法,但是如果只有一个过滤器,它就会被释放。
FilterConfig
FilterConfig类似于ServletConfig,是Filter的配置信息对象。FilterConfig对象有以下方法。
GetFilterName():获取当前筛选器的名称。获取在web.xml中配置的筛选器名称的值
Getinitparameter(字符串名称):获取过滤器的初始化参数。在web.xml中配置
GetIntParameterNames():获取筛选器初始化参数名称的集合。
GetServletContext():获取当前web项目的ServletContext对象。
过滤器的网址模式
url模式配置哪些请求需要筛选器。主要有以下配置:
在web.xml中配置的/都以当前项目路径为根路径
1)精确匹配:
当请求/index.jsp和/user/login时,/index.jsp/user/login将执行过滤方法。
2)路径匹配:
/user/* /*路径/user/下的所有请求都将被拦截。/*表示拦截系统的所有请求,包括静态资源文件。
3)扩展匹配:
*。jsp *。任何后缀为. jsp.action的请求都会被拦截。
注意:/login/*。jsp是错误的,只能是上述三种形式中的任何一种。您不能组合新表单。
*jsp也不对,扩展名匹配必须是后缀。
4)多网址模式配置
以上三种形式都有局限性,但是可以配置多个url-pattern,这样这三种组合基本上就可以解决所有问题
多重过滤器的执行顺序
如果多个过滤器拦截相同的资源,拦截的顺序与web.xml中配置的顺序一致
执行流程图如下
请求总是在处理后返回,以在doFilter后执行方法。
HttpServletWrapper和HttpServletResponseWrapper
定义
Servlet API提供了一个HttpServletRequestWrapper类来包装原始请求对象。HttpServletRequestWrapper类实现了HttpServletRequest接口中的所有方法,这些方法的内部实现只调用一次被包装的请求对象的对应方法。
//包装器类实现ServletRequest接口。
公共类ServletRequestWrapper实现ServletRequest {
//包装的ServletRequest对象
私有ServletRequest请求;
//构造函数传入ServletRequest实现类对象
公共SERVLETrequestwrapper(SERVLETrequest请求){
if (request==null) {
引发新的IllegalArgumentException(“请求不能为空”);
{}
this.request=request
{}
//实现ServletRequest的方法:调用包装成员变量的方法实现。
公共对象getAttribute(字符串名称){
返回this . request . GetAttribute(name);
{}
公共枚举getAttributeNames() {
return this . request . getattributenames();
{}
//.
{}
类似的Servlet API还提供了一个HttpServletResponseWrapper类来包装原始响应对象
影响
用于修改或增强HttpServletRequest或HttpServletResponse的方法。
公共类MyHttpServletRequest扩展了HttpServletRequestWrapper{
公共my HttpServletrequest(HttpServletrequest请求){
super(请求);
{}
@覆盖
公共字符串getParameter(字符串名称){
string val=super . GetParameter(name);
if(val!=null val.contains('他妈的'){
val=val.replace('他妈的',' * * * ');
{}
返回val
{}
{}
程序员除了写代码,还能怎么挣别的工资?
使用
在筛选器中,用我的HttpServletRequest替换传入的HttpServletRequest
httpersvletrequest=new Myhttpersvletrequest(请求);
filterChain.doFilter(req,response);
此时,到达目标servlet或JSP的servlet请求实际上是我的servlet请求
来源:莫然,欢迎分享这篇文章!
莫然