2011-04-12 43 views
0

有没有办法只处理过滤器中的响应。如何编写响应过滤器?

下面写的代码是否正确?

public void doFilter(request , response , chain) { 
     //code to handle request 
      chain.doFilter(request, response); 
     //code to handle response . 
    } 

回答

8

这取决于你想要什么。一般来说,你的样本不正确。在chain.doFilter已经返回之后,对响应做任何事情都为时已晚。此时,整个响应已经发送到客户端,并且您的代码无法访问它。

你需要做的是包装request和/或response到自己的类,这些包装传入doFilter方法,在你的包装处理任何处理。

为了更容易,servlet api中已经有包装:请参阅HttpServletRequestWrapperHttpServletResponseWrapper类。如果您想处理实际发送给客户端的输出,则还需要编写自定义OutputStream或Writer包装器,并从HttpServletResponse包装器中返回这些包装器。是的,大量的包装:)

一些简单的过滤器可以工作,没有包装请求或响应:例如,在致电doFilter之前,您可以访问请求标头,或者您可以发送自定义响应,而无需致电doFilter。但是,如果你想处理请求体,你不能只读它,否则它将不可用于链的其余部分。在这种情况下,您需要再次使用包装技术。

0

你的代码似乎很好。

如果您只想处理响应,您可以将代码放在//Code to handle response .部分,然后执行任何你喜欢的操作。

如果你想对输出做些什么,你将不得不提供一个特殊的响应包装器来处理servlet(和其他过滤器)可能写入的响应中的outputstream。

2

您显示的代码并不完全正确,但是必须简化术语 - 它是。即使在(及之前的响应)之后,您也可以“处理”请求。

什么意味着进程被传递到所需的目标,并且当方法返回时,目标已完成其输出。

所以更确切地说 - 它是'之前'和'之后'的请求已被处理,并产生一个响应。

0

请求和响应是只读的。所以他们没有setter方法来修改它的内容。但是通过使用由java内置的“HttpServletRequestWrapper和HttpServletResponseWrapper”类,我们可以修改它的内容。包装器对象的原始请求和响应对象,通过修改包装器对象,我们可以真正修改原始的请求和响应对象。