Filter 介绍
Servlet 过滤器是可插入的 Web 组件,它允许我们实现 Web 应用程序中的预处理和后期处理逻辑。过滤器支持 servlet 和 JSP 页面的基本请求处理功能,比如日志记录、性能、安全、会话处理、XSLT 转换,等等。
Filter也叫过滤器,通常配置在MVC、Servlet和JSP请求前面
常用于:
-
后端权限控制
-
统一的Http请求参数过滤
-
统一的XSS、SQL注入、SSRF
-
等等攻击检测的处理
Servlet Filter 的特性:
-
声明式的:过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明。这样允许添加和删除过滤器,而无需改动任何应用程序代码或 JSP 页面。
-
动态的:过滤器在运行时由 Servlet 容器调用来拦截和处理请求和响应。
-
灵活的:过滤器在 Web 处理环境中的应用很广泛,涵盖诸如日志记录和安全等许多最公共的辅助任务。过滤器还是灵活的,因为它们可用于对来自客户机的直接调用执行预处理和后期处 理,以及处理在防火墙之后的 Web 组件之间调度的请求。最后,可以将过滤器链接起来以提供必需的功能。
-
模块化的:通过把应用程序处理逻辑封装到单个类文件中,过滤器从而定义了可容易地从请求/响应链中添加或删除的模块化单元。
-
可移植的:与 Java 平台的其他许多方面一样,Servlet 过滤器是跨平台和跨容器可移植的,从而进一步支持了 Servler 过滤器的模块化和可重用本质。
-
可重用的:归功于过滤器实现类的模块化设计,以及声明式的过滤器配置方式,过滤器可以容易地跨越不同的项目和应用程序使用。
-
透明的:在请求/响应链中包括过滤器,这种设计是为了补充(而不是以任何方式替代)servlet 或 JSP 页面提供的核心处理。因而,过滤器可以根据需要添加或删除,而不会破坏 servlet 或 JSP 页面。
filter 方法
init():这个方法在容器实例化过滤器时被调用,它主要设计用于使过滤器为处理做准备。该方法接受一个 FilterConfig 类型的对象作为输入。
doFilter(): 与 servlet 拥有一个 service() 方法(这个方法又调用 doPost() 或者 doGet())来处理请求一样,过滤器拥有单个用于处理请求和响应的方法——doFilter()。这个方法接受三个输入参数:一个 ServletRequest、response 和一个 FilterChain 对象。
destroy():正如您想像的那样,这个方法执行任何清理操作,这些操作可能需要在自动垃圾收集之前进行。展示了一个非常简单的过滤器,它跟踪满足一个客户机的 Web 请求所花的大致时间。
通过注解配置运行 filter
通过注解@WebFilter
可以直接在过滤器的java源代码文件中完成配置这样就无需在web.xml配置映射了
常用配置项:
参数: urlPatterns
作用: 配置要拦截的资源
以指定资源匹配,例如:"/hello.jsp"
以目录匹配,例如:"/Servlet/*"
以后缀名匹配,例如:"*.jsp"
通配符,拦截所有web资源,例如:"/*"
参数: initParams
作用: 配置初始化参数
参数: dispatcherTypes
作用: 配置拦截的类型,可配置多个
默认为DispatcherType.REQUEST
其中DispatcherType是个枚举类型,有下面几个值
FORWARD //转发的
INCLUDE //包含在页面的
REQUEST //请求的
ASYNC //异步的
ERROR //出错的
过滤器分类:
创建GlobalFilter.java,并实现Filter接口的三个方法
通过 web.xml 配置运行 filter
设置Filter
作用: 定义这个Filter等待其它程序调用
例如:
<filter>
<!-- 类名 -->
<filter-name>HelloFilter</filter-name>
<!-- 所在的包路径 -->
<filter-class>com.Filter.HelloFilter</filter-class>
</filter>
常用配置项
标签: <url-pattern> </url-pattern>
作用: 配置要拦截的资源
以指定资源匹配,例如:"/hello.jsp"
以目录匹配,例如:"/Servlet/*"
以后缀名匹配,例如:"*.jsp"
通配符,拦截所有web资源,例如:"/*"
注意: 设置了这个才会正常运行这个filter
标签: <init-param> </init-param>
作用: 配置初始化参数
标签: <dispatcher> </dispatcher>
作用: 配置拦截的类型,可配置多个
默认为DispatcherType.REQUEST
多个filter的执行
WEB服务程序是可以支持多个过滤器的。
假如一个URL和多个过滤器指定的URL相符时,会生成一个过滤器链。
服务器会按照web.xml中过滤器定义的先后顺序组装成过滤器链。或者根据注解中的字母顺序来执行过滤器。
在web.xml中,filter执行顺序跟
参考资料
https://www.cnblogs.com/yangyxd/p/5624145.html
https://xz.aliyun.com/t/10362
https://www.yuque.com/pmiaowu/gpy1q8/fqegl8#XSjUp
原文始发于微信公众号(红蓝安全):Java Web 基础 JSP Filter
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论