【代码审计】Java Web 过滤器 - filter

0x00 前言

filter 被称为过滤器,是 Servlet 2.3 新增的一个特性,同时也是 Serlvet 技术中最实用的技术。

过滤器实际上就是对 Web 资源进行拦截,做一些处理后再交给下一个过滤器或 Servlet 处理,通常都是用来拦截 request 进行处理的,也可以对返回的 response 进行拦截处理。

开发人员利用 filter 技术,可以实现对所有 Web 资源的管理,例如实现权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

0x01 filter 的配置

filter 的配置类似于 Servlet,由 filter 和 filter-mapping 两组标签组成,和 Servlet 一样,如果版本大于 3.0 也可以使用注解的方式来配置 filter

1、基于 web.xml 的配置

以下是一个基于 web.xml 的配置内容

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
         version="2.5">
  
  <display-name>manage</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
    <description></description>
    <display-name>user</display-name>
    <servlet-name>user</servlet-name>
    <servlet-class>com.sec.servlet.UserServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>user</servlet-name>
    <url-pattern>/user</url-pattern>
  </servlet-mapping>
  
  <filter>
    <display-name>test</display-name>
    <filter-name>test</filter-name>
    <filter-class>com.sec.test.test</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>test</filter-name>
    <url-pattern>/test</url-pattern>
  </filter-mapping>
</web-app>

标签含义如下:

<filter> 指定一个过滤器
<filter-name> 为过滤器指定一个名称,该项不能为空
<filter-class> 用于指定过滤器的完整的限定类名
<init-param> 用于为过滤器指定初始化参数
  <param-name> 为 <init-param> 的子参数,用于指定参数的名称
  <param-value> 为 <init-param> 的子参数,用于指定参数的值
<filter-mapping> 用于设置一个 filter 负责拦截的资源
  <filer-name> 为 <filer-mapping> 的子参数,用于设置 filter 的注册名称,该值必须是在 <filter> 元素中声明过的过滤器的名称
  <url-pattern> 用于设置 filter 所拦截的请求路径
<servlet-name> 用于指定过滤器所拦截的 Servlet 名称

2、基于注解的方法

示例代码如下

import java.io.IOException;

@WebFilter(description="this is filter test",urlPatterns={"/filterTest"})
public class filterTest implements Filter {
    public void destroy() {
        /*销毁时调用*/
    }
    
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        /*过滤方法 主要是对request和response进行一些处理,然后交给下一个过滤器或Servlet处理*/  
        chain.doFilter(req, resp);//交给下一个过滤器或servlet处理
    }
    
    public void init(FilterConfig config) throws ServletException {
        /*初始化方法  接收一个FilterConfig类型的参数 该参数是对Filter的一些配置*/
    }
    
}

与 Servlet 一样,使用 web.xml 可以配置的 filter 属性也都可以使用注解进行配置,但一般不推荐使用注解配置,因为使用 web.xml 可以控制过滤器的执行顺序,而使用注解的方式则不行。

0x02 filter 的流程

filter 的流程很简单,具体如下:

用户向服务器发送请求
|
服务器
|
filter 1
|
......
|
filter n
|
service()方法
|
filter n
|
......
|
filter 1
|
服务器
|
服务器返回结果给用户

首先用户向服务器发起请求,之后请求经过过滤器到达 Servlet 中的 service() 方法,最后再经过过滤器返回给用户。

这里值得注意的是过滤器在接收请求和返回请求的时候顺序是相反的。

0x03 filter 的接口方法

filter 接口方法如下:

1、init() 接口

该接口与 Servlet 里的 init() 方法类似,主要用来初始化过滤器。如果初始化代码中要用到 FilterConfig 对象,那这些初始化代码只能在 filter 的 init() 方法中编写。

init() 方法的定义如下:

public void init(FilterConfig config) throws ServletException {
        /*初始化方法  接收一个FilterConfig类型的参数 该参数是对Filter的一些配置*/
}

2、doFilter() 接口

doFilter 方法类似于 Servlet 接口的 service() 方法,filter 通过该接口实现具体的过滤操作,当客户请求访问与过滤器关联的 URL 的时候,Servlet 过滤器将先执行doFilter 方法,FilterChain 参数用于访问后续过滤器。

doFilter() 方法定义如下:

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        /*过滤方法 主要是对request和response进行一些处理,然后交给下一个过滤器或Servlet处理*/  
        chain.doFilter(req, resp);//交给下一个过滤器或servlet处理
}

3、destroy() 接口

destroy() 接口和 servlet 里的 destroy() 作用类似,用于释放被 filter 打开的资源,如关闭数据库等。

destroy() 方法的定义如下:

public void destroy() {
        /*销毁时调用*/
}

0x04 filter 的生命周期

filter 的生命周期与 servlet 的生命周期比较类似,如下图所示。

image

当 Web 容器启动时,会根据 web.xml 中声明的 filter 顺序依次实例化这些 filter。

这里会根据实际情况的不同,doFilter() 方法可能会被调用多次,最后当程序关闭或者卸载时调用 destroy() 方法。

参考文章:

https://blog.csdn.net/Soinice/article/details/82787964

https://www.cnblogs.com/tanghaorong/p/12811457.html

https://blog.csdn.net/yuzhiqiang_1993/article/details/81288912

原文链接:

https://www.teamssix.com/211116-112510.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容