写了很久的 Java web 程序,却一直对 Filter 不熟悉,实在是惭愧惭愧,之前通过代码中硬编码的方式,虽然可以实现同样的功能,但是代码的可维护性非常差,趁着项目需要重构的过程中,把它学会。
Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
上面的描述已经很清晰的描绘了 Filter 的作用,下面就来看看怎么用吧。PS:为什么我不直接把原文搬下来呢?因为很多别人的东西终究是别人的,加上自己的理解,做个记录,加深一下印象。
一、配置 web.xml 文件
在 web.xml 中添加如下内容:
注释 1
注释 2
注释 3
注释 4
注释 1:这里是拦截器的名字,你给取的
注释 2:这里是拦截器对应的类,该类需要实现 javax.servlet.Filter 接口
注释 3:这里对应注释 1 的名字
注释 4:这里是拦截的 url,这一行可以重复出现,或者使用 , 进行分隔
二、编写拦截器对应的类(注释 2 对应的类)
public classUrlFilterimplementsFilter {
@Override
public voidinit(FilterConfig filterConfig)
throwsServletException { }
@Override
public voiddoFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain)
throwsIOException, ServletException { }
@Override
public voiddestroy() { }
}
以上就是一个拦截器类的基本结构,你需要重写一下 init、doFilter 和 destroy 方法,它们是一个 Filter 的生命周期。
和我们编写的Servlet程序一样,Filter 的创建和销毁由 WEB 服务器负责。 web 应用程序启动时,web 服务器将创建 Filter 的实例对象,并调用其 init 方法,读取 web.xml 配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter 对象只会创建一次,init 方法也只会执行一次)。开发人员通过 init 方法的参数,可获得代表当前 filter 配置信息的 FilterConfig 对象。
当客户请求访问与过滤器关联的 URL 的时候,Servlet 过滤器将先执行 doFilter 方法。FilterChain 参数用于访问后续过滤器。
Filter 对象创建后会驻留在内存,当 web 应用移除或服务器停止时才销毁。在 Web 容器卸载 Filter 对象之前被调用。destory 方法在 Filter 的生命周期中仅执行一次。
一般在使用的过程中,我们使用最多的还是 doFilter 方法,我们可以把拦截的逻辑写在里面,完成对业务的过滤功能,ServletRequest 和 ServletResponse 可以强制转换成 HttpServletRequest 和 HttpServletResponse,接下来就是你发挥的时候了。当然,在写完后别忘记使用 FilterChain 将请求传递下去,让其他过滤器继续工作哦。
以上,简单的过滤器就写完了,是不是还是很简单呢?
高级知识可以参考 博客园用户 coderland 的文章《Java中的Filter过滤器》链接:https://www.cnblogs.com/coderland/p/5902878.html
领取专属 10元无门槛券
私享最新 技术干货