资讯专栏INFORMATION COLUMN

Filter : 过滤请求和响应

张汉庆 / 2516人阅读

摘要:过滤器可以执行的主要任务如下查询请求并采取响应措施组织请求响应对的进一步传递修改请求头和数据。在后一种情况下,过滤器负责填充响应。编写自定义请求和响应代码过滤器有多种方式去修改请求和响应。

filter对象可以改变请求和响应的头信息和内容信息。过滤器和web组件的不同之处在于,过滤器通常不会自行创建响应。作为替代,过滤器提供附加到任意类型的web资源的功能。因此,过滤器不该对要过滤的web资源有任何依赖。这样,它可以由多种web资源组成。
过滤器可以执行的主要任务如下:

查询请求并采取响应措施

组织请求-响应对的进一步传递

修改请求头和数据。你可以通过设置请求的自定义版本来完成此操作。

修改响应头和数据。你可以通过设置响应的自定义版本来完成此操作。

与web资源相互作用

应用程序的过滤器包含认证、日志、图片转换、数据压缩、数据加密、标记流、xml转换等。
你可以给一个web资源配置0-多个过滤器,并且可以自定义过滤器的顺序。过滤器链在包含此组件的web资源部署时指定,并且在web容器加载的时候实例化。

编写filter程序

filtering api定义在javax.servlet包中的Filter, FilterChain, and FilterConfig接口中。你可以通过实现Filter接口定义一个过滤器。
使用@WebFilter注解在web程序中定义过滤器。这个注解作用在类上,并且包含过滤器的元数据。过滤器注解必须定义至少一个url匹配,通过使用z注解的urlPatterns或value属性完成这个操作。所有其他的属性都是可选的,有默认设置。当只有一个url规则时使用value注解;当有多个url规则或需要自定义属性时使用urlPatterns注解。
使用@WebFilter 注解的类必须实现 javax.servlet.Filter 接口。
要将配置数据添加到过滤器中,可以使用@WebFilter注解的initParams属性。initParams属性包含一个 @WebInitParam 注解。下面的代码片段定义了一个过滤器,定义了一个初始化参数:

import javax.servlet.Filter;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;

@WebFilter(filterName = "TimeOfDayFilter",
urlPatterns = {"/*"},
initParams = {
    @WebInitParam(name = "mood", value = "awake")})
public class TimeOfDayFilter implements Filter {
    ...

Filter接口的最重要的方法是doFilter,这个方法可以执行下列操作:

核查请求头

定制请求对象,如果过滤器想要修改请求头或数据

定制响应对象,如果过滤器想要修改响应头或数据

调用过滤器链的下一个实体。如果当前过滤器是过滤器链的最后一个过滤器,并且结束目标是web资源或静态资源,下一个实体是链末端的资源;否则,下一个实体是war定义的过滤器。过滤器通过调用chain对象的doFilter方法调用下一个实体,传入调用它的请求、响应或它创建的包装版本。换种说法是,filter可以通过不调用下一个实体来阻塞请求。在后一种情况下,过滤器负责填充响应。

在调用下一个实体后核查响应头

抛出一个错误指示执行流程中的错误

执行doFilter,你必须实现init和destroy方法。init方法在web容器实例化的时候调用;如果你想给filter传入初始化参数,可以通过传入init方法的FilterConfig参数获取它们。

编写自定义请求和响应代码

过滤器有多种方式去修改请求和响应。例如,一个过滤器可以向请求添加一个参数或者在响应中插入数据。
过滤器修改响应必须在响应返回客户端之前捕获响应。为此, 您将一个替代流传递给生成响应的servlet。备用流阻止servlet在完成时关闭原始响应流,并允许过滤器修改servlet的响应。
要将此替换流传递给servlet,过滤器会创建一个响应包装器,它会覆盖getWriter或getOutputStream方法以返回此替换流。这个包装器通过过滤器链doFilter方法传递。包装器方法默认调用包装的请求或响应对象。
重写请求方法,你包装的请求必须继承ServletRequestWrapper或HttpServletRequestWrapper。重写响应方法,你的响应必须继承ServletResponseWrapper or HttpServletResponseWrapper。

指定过滤器映射

web容器使用请求映射决定给web资源应用具体的过滤器。过滤器映射使用名称映射一个过滤器到web组件或者使用url规则匹配到web资源。过滤器按照war中定义的顺序执行。您可以使用NetBeans IDE或使用XML手动编写列表来为其部署描述符中的WAR指定过滤器映射列表。
如果你想记录每一个到web应用的请求,你可以将过滤器映射到url规则“/”。
可以映射filter到一个或多个web资源,当然你也可以给一个web资源映射多个filter。参见下图,F1映射到S1、S2、S3,F2映射到S2,F3映射到S1、S2.

再次强调,filter chain是传入filter的doFilter方法的一个参数。该链通过过滤器映射间接生成。链中的过滤器顺序与过滤器映射在Web应用程序部署描述符中的显示顺序相同。当一个过滤器映射到S1,web容器调用F1的doFilter方法。S1的过滤器链中每个过滤器的doFilter方法由链中的前一个过滤器通过chain.doFilter方法调用。因为S1的过滤器链包含过滤器F1和F3,所以F1对chain.doFilter的调用会调用过滤器F3的doFilter方法。 当F3的doFilter方法完成时,控制返回F1的doFilter方法。

通过NetBeans IDE定义请求映射

在Project节点展开应用程序

展开Project节点下的Web Pages and WEB-INF节点

双击web.xml

点击编辑窗口最上方的Filters

展开编辑窗口的Servlet Filters节点

点击Add Filter Element 添加filter与web资源的url映射关系

在添加servlet filter接口,填写filtername

点击Browse定位filter适用的servlet

点击ok

要约束过滤器应用于请求的方式,步骤如下:

a. 展开Filter Mappings节点
b. 从filterlist中选择一个filter
c. 点击add
d. 在添加映射弹窗,需要选择一个转发类型:

REQUEST:只映射直接从客户端过来的请求

ASYNC:只映射直接从客户端过来的的异步async请求

FORWARD:只有当请求被转发到组件时

INCLUDE : 仅当请求由已包含的组件处理时

ERROR:仅在使用错误页面机制处理请求时

通过选择多个调度程序类型,可以指示过滤器应用于上述情况的任意组合。 如果未指定类型,则默认选项为REQUEST

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73934.html

相关文章

  • 听说你叫Java(三)–Servlet过滤

    摘要:幸好,给我们提供了过滤器解决这个问题。可以将一个或多个过滤器附加到一个或一组。同样的,过滤器是可用于编程的类,也需要在中声明的。用户访问后续过滤器。过滤器和拦截器是两个完全不同的概念。 听说你改bug很厉害,帮我改一个吧????showImg(https://segmentfault.com/img/bVMsm7?w=402&h=223); 上一章我们讲到了Servlet请求,可以通过...

    techstay 评论0 收藏0
  • 详谈 Filter 过滤

    摘要:元素用于指定过滤器的完整的限定类名。除此之外,过滤器不会被调用。参数用于访问后续过滤器。还可以为指定目标资源为某个,例如当用户访问时,会执行名字为的,这时会执行过滤器。防止中文乱码过滤器项目使用框架时。 文章首发在CSDN博客,转载请务必注明以下所有链接,否则考虑法律追究责任。 CSDN地址:http://blog.csdn.net/tzs_1041218129/article/det...

    wind5o 评论0 收藏0
  • 过滤器监听器面试题都在这里

    摘要:中的异步处理指的是什么中的异步处理指的是什么答在中引入了一项新的技术可以让异步处理请求。开启异步处理代码开启异步支持启动异步处理的上下文在此处添加异步处理的代码如果文章有错的地方欢迎指正,大家互相交流。 以下我是归纳的过滤器监听器知识点图: showImg(https://segmentfault.com/img/remote/1460000013263166?w=3974&h=187...

    crelaber 评论0 收藏0
  • 一文学会 - Fiddler抓包快速实战

    摘要:无论对开发人员或者测试人员来说,都是非常有用的工具。只显示指定的多个显示多个相关的情况下,使用英文分号隔开,见下图。使用浏览器获取图片属性需要注意的是刷新是使用强制刷新,这样会重新请求资源。 ...

    Imfan 评论0 收藏0
  • 过滤器入门看这一篇就够了

    摘要:我们很容易发现,过滤器可以比喻成一张滤网。这究竟是怎么回事啊我们可以这样理解过滤器不单单只有一个,那么我们怎么管理这些过滤器呢在中就使用了链式结构。第一种方式在文件中配置用于注册过滤器用于为过滤器指定一个名字,该元素的内容不能为空。 什么是过滤器 过滤器是Servlet的高级特性之一,也别把它想得那么高深,只不过是实现Filter接口的Java类罢了! 首先,我们来看看过滤器究竟Web...

    yy13818512006 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<