我在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修改。但是,过滤器只调用一次,因此必须有一个“魔术”决定过滤器在处理程序之前或之后运行。
请帮我说清楚。
我自己也想知道这个,我不知道setStreams
方法如何对此有所帮助。我能做到这一点的唯一方法是包装HttpExchange。
此示例显示如何使用Filter应用gzip压缩:
https://gist.github.com/Crydust/7e4e9228cd95febccdc58f0501c1e327
每个过滤器都是前置和后置过滤器。我的意思是请求在它通过堆栈时通过它,然后响应通过它返回到客户端的路上。调用过滤器的顺序取决于您在web.xml
文件中安装它的顺序。
如果您将其用作Pre过滤器,则可以修改InputStream
,如果您想要它作为Post,则可以修改OutputStream
。您甚至可以通过链条传递自己的InputStream
和OutputStream
。
所以,例如,你有一些Filter1
,Filter2
和Filter3
。 InputStream
将首先通过Filter1
,然后是Filter2
,最后是Filter3
,然后再进行处理。由此产生的OutputStream
将通过Filter3
,然后Filter2
,最后Filter1
回到客户端。因此,您可以通过这种方式修改预处理和/或后处理。