Filter过滤器技术详解
2025-04-19 本站作者 【 字体:大 中 小 】
前言
有这样一个常见的开发场景,我们编写一套系统,或者分析一套系统如何实现的过程中,我们肯定会发现这套系统的拦截机制.比如说京东或者淘宝之类的,存在这种拦截机制,这套拦截机制能够过滤掉哪些错误的登录注册请求,或者是一些其他非法请求.这样就在很大的程度上保证了系统的安全性.可以想到,类似的应用场景肯定还有很多,我这里就不一一列举了.
这个场景应用的最基本的技术就是拦截器(Filter)技术,当然我们这里介绍的拦截器只是Servlet技术中的一部分,不涉及到任何框架之类的.要记住,这些最基本的技术是相当重要的,学好基本的东西才能更好的掌握更加高级的东西!
Filter的其他应用
上面我们讲了Filter的基本应用,作为拦截器,拦截哪些错误的或者有攻击性的请求,实际上,过滤器技术还有很多实用性的功能,我们来简单介绍一下:
Filter在Servlet架构中所处的位置
如下图:
可以看到,来自用户的请求是率先发送给过滤器的,经过过滤器判断,才能决定是否将请求放行到Servlet之中.到了这一步还不算完成整个过程,请求到达Servlet中后,经过处理,会将相应返回到Filter之中,最后再到达用户.整个工作过程就是这样的.
好了,说了这么多基本的知识,马上就开始我们的实际开发吧!
从一个简单的例子开始
下面的这个例子来自于我的小型项目中的一部分,我做了一些删减,力求初学者能够看明白,其他的暂时先不用管,你只需要看doFilter方法中的代码即可.
package com.roobtyan.cn.login;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter(filterName = "LoginFilter",urlPatterns = {"/*"})
public class LoginFilter implements Filter {
private FilterConfig config;
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//开始一个过滤器
//取出当前的servlet上下文对象
ServletContext context = this.config.getServletContext();
//开始计时
long startTime = System.currentTimeMillis();
System.out.println("过滤器开始工作....");
//let request cast to HttpServletRequest
HttpServletRequest request = (HttpServletRequest)req;
request.setCharacterEncoding("utf8");
//print message
System.out.println("请求的地址是:" + request.getServletPath());
//System.out.println(request.getRequestURI());
//放行
chain.doFilter(req, resp);
long endTime = System.currentTimeMillis();
//print all time
System.out.println("过滤器工作结束...");
System.out.println("总计工作时常是: " + (endTime-startTime) + "ms");
}
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
}
可以看到,这个例子是很简单的,主要的工作就是记录下客户端请求的URL,拿到后直接放行到相应的Servlet中进行处理.
由于servlet3.0之后可以对Filter,Listener,Servlet使用注解配置,我这里就是用了注解配置,个人比较喜欢用这种方法,当然也可以使用web.xml进行配置,我们下面就来介绍一下这两配置方法,以及相应的作用.(对代码进行从上到下的分析)
配置方法 注解配置
@WebFilter(filterName = "LoginFilter",urlPatterns = {"/*"})
......
这种方法,非常简单,filterName就是自定义的过滤器的名字,而urlPatterns就是你到底想要对哪个请求过滤,这里使用的/*就是对所有的请求过滤.这种方法还是非常简单的,就不过多介绍.
web.xml配置
...
...
...
...
这个Filter的配置和Servlet的配置方法其实是一样的.一个是对Filter类的配置,另外一个就是Filterl类的映射,两个filter-name的值必须是一样的.url-pattern自然也就是拦截的请求地址了.
好了,分析完如何对Filter配置,接下来要做的就是分析一下这几个方法.也就是常用的Filter API.
当然,不论是第一种方法或者第二种方法,都能对指定的URL进行拦截,并且可以是多个.第一种配置方法直接按照这种格式 {“/login”,”/welcome.jsp”};第二种直接在url-pattern下再写上多个url-pattern参数就可以了.
常用的Filter API Filter
这个接口是过滤器的核心接口,必不可少
常用方法如下:
FilterConfig
这个接口用于获取初始化参数信息
- String getInitParameter(java.lang.String name)
- Enumeration getInitParameterNames()
第一个方法是获取特定的初始化参数,第二个是获取全部的初始化参数.
FilterChain
过滤器链参数;一个个过滤器形成一个执行链;
这句话你可能看不太明白,简单的说,这个对象负责调用
用户-过滤器-servlet
这条链中的servlet资源或者是下一个过滤器的.
再简单的说,就是这货能够将过滤操作停止,并将全部的信息向下传送.
仅有的一个方法如下:
public void doFilter(HttpServletRequest request,HttpServletResponse response)
它将控件传递给下一个过滤器或资源。
结语
感谢您的阅读,欢迎指正博客中存在的问题,也可以跟我联系,一起进步,一起交流!

猜你喜欢

大陆集团与成飞集成在华成立合资公司 生产48伏电池系统


新能源汽车专业,就业前景好不好?来看看云南省电子信息高级技工学校(文山校区)怎么样


赛朗SAIRE品牌怎么样


北京十大软件外包公司有哪些


经典常谈丨科学是历史发展的产物


知识产权专家——苏芳


EMBA排名揭晓:凯洛格-香港科大EMBA排名 名列前茅,实至名归


武侠片里,“对掌传功”这个国民套路是怎么来的?


“凝心聚力同奋进 挺膺担当砺青春” 2024年校园 科技文化艺术节暨迎新晚会圆满结束


【 Operation Fab 】上海微技术工研院最新招聘


智能自动化生产线:引领未来制造业的关键技术


来林国荣创意科技大学


空间家联合办公再发力 优惠+免租打造创业季


顺网科技8000万元受让吉胜科技100%股权


总数全国第一!河南成功创建32全国科普示范县


信息技术与课堂教学的深度融合是当代学校教育的一个重要趋势


金陵科技学院是几本 学生评价怎么样好不好(10条)


好YOUNG的!第十三届“深圳十大杰出青年”推选活动正式开启,为龙岗候选人点赞!


梦网云科技集团股份有限公司关于2022年股票期权激励计划第二个行权期采用自主行权模式的提示性公告


他靠养鱼发家,死磕光伏行业后拿下四川首富
