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