Sun HTTPServer - 如何编写后处理过滤器?

问题描述 投票:3回答:2

我在Sun JRE的HTTP服务器上尝试了一些东西。阅读两次文档后,我仍然感到困惑。

com.sun.net.httpserver.Filter javadoc说如下

要求此过滤器预先/后处理给定的交换。过滤器可以:

  • 检查或修改请求标头
  • 通过创建合适的过滤器流并调用HttpExchange.setStreams(InputStream,OutputStream)来过滤请求主体或响应主体
  • set属性交换中的对象,其他过滤器或交换处理程序可以访问。
  • 决定: 通过调用Filter.Chain.doFilter(HttpExchange)来调用链中的下一个过滤器 通过不调用Filter.Chain.doFilter(HttpExchange)来终止调用链 如果选项1是上面的,那么当doFilter()返回链中的所有后续过滤器时,都会被调用,并且可以检查或修改响应头。如果上面的选项2,则此过滤器必须使用HttpExchange发回适当的响应

什么不清楚,什么决定过滤器何时是过程前或过程后过滤器。正如我所假设的,后处理过滤器是在HttpHandler之后运行的,因此它可以与HttpExchange一起使用,由HttpHandler修改。但是,过滤器只调用一次,因此必须有一个“魔术”决定过滤器在处理程序之前或之后运行。

请帮我说清楚。

java com.sun.net.httpserver
2个回答
1
投票

我自己也想知道这个,我不知道setStreams方法如何对此有所帮助。我能做到这一点的唯一方法是包装HttpExchange。

此示例显示如何使用Filter应用gzip压缩:

https://gist.github.com/Crydust/7e4e9228cd95febccdc58f0501c1e327


2
投票

每个过滤器都是前置和后置过滤器。我的意思是请求在它通过堆栈时通过它,然后响应通过它返回到客户端的路上。调用过滤器的顺序取决于您在web.xml文件中安装它的顺序。

如果您将其用作Pre过滤器,则可以修改InputStream,如果您想要它作为Post,则可以修改OutputStream。您甚至可以通过链条传递自己的InputStreamOutputStream

所以,例如,你有一些Filter1Filter2Filter3InputStream将首先通过Filter1,然后是Filter2,最后是Filter3,然后再进行处理。由此产生的OutputStream将通过Filter3,然后Filter2,最后Filter1回到客户端。因此,您可以通过这种方式修改预处理和/或后处理。

© www.soinside.com 2019 - 2024. All rights reserved.