有没有办法只处理过滤器中的响应。如何编写响应过滤器?
下面写的代码是否正确?
public void doFilter(request , response , chain) {
//code to handle request
chain.doFilter(request, response);
//code to handle response .
}
有没有办法只处理过滤器中的响应。如何编写响应过滤器?
下面写的代码是否正确?
public void doFilter(request , response , chain) {
//code to handle request
chain.doFilter(request, response);
//code to handle response .
}
这取决于你想要什么。一般来说,你的样本不正确。在chain.doFilter
已经返回之后,对响应做任何事情都为时已晚。此时,整个响应已经发送到客户端,并且您的代码无法访问它。
你需要做的是包装request
和/或response
到自己的类,这些包装传入doFilter
方法,在你的包装处理任何处理。
为了更容易,servlet api中已经有包装:请参阅HttpServletRequestWrapper
和HttpServletResponseWrapper
类。如果您想处理实际发送给客户端的输出,则还需要编写自定义OutputStream或Writer包装器,并从HttpServletResponse包装器中返回这些包装器。是的,大量的包装:)
一些简单的过滤器可以工作,没有包装请求或响应:例如,在致电doFilter
之前,您可以访问请求标头,或者您可以发送自定义响应,而无需致电doFilter
。但是,如果你想处理请求体,你不能只读它,否则它将不可用于链的其余部分。在这种情况下,您需要再次使用包装技术。
你的代码似乎很好。
如果您只想处理响应,您可以将代码放在//Code to handle response .
部分,然后执行任何你喜欢的操作。
如果你想对输出做些什么,你将不得不提供一个特殊的响应包装器来处理servlet(和其他过滤器)可能写入的响应中的outputstream。
您显示的代码并不完全正确,但是必须简化术语 - 它是。即使在(及之前的响应)之后,您也可以“处理”请求。
什么意味着进程被传递到所需的目标,并且当方法返回时,目标已完成其输出。
所以更确切地说 - 它是'之前'和'之后'的请求已被处理,并产生一个响应。
请求和响应是只读的。所以他们没有setter方法来修改它的内容。但是通过使用由java内置的“HttpServletRequestWrapper和HttpServletResponseWrapper”类,我们可以修改它的内容。包装器对象的原始请求和响应对象,通过修改包装器对象,我们可以真正修改原始的请求和响应对象。