有的时候我们需要批量的修改Servlet中的响应的内容,这时候我们就可以通过HttpServletResponseWrapper这个类,在Filter中先获取响应的内容,接着修改响应的内容,最后再把修改完之后的内容作为响应返回给客户端。代码如下演示:

1.创建一个继承自HttpServletResponseWrapper的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.CharArrayWriter;
import java.io.PrintWriter;

/**
* Created on 2016/3/29 19:54.
*/
public class ResponseWrapper extends HttpServletResponseWrapper {
private PrintWriter cachedWriter;
private CharArrayWriter bufferedWriter;

public ResponseWrapper(HttpServletResponse response) {
super(response);
// 这个是我们保存返回结果的地方
bufferedWriter = new CharArrayWriter();
// 这个是包装PrintWriter的,让所有结果通过这个PrintWriter写入到bufferedWriter中
cachedWriter = new PrintWriter(bufferedWriter);
}

@Override
public PrintWriter getWriter() {
return cachedWriter;
}

/**
* 获取原始的HTML页面内容。
*
* @return
*/
public String getResult() {
return bufferedWriter.toString();
}
}

2.在过滤器中修改响应的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package cn.iduoka.util.format;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
* Created on 2016/3/29 19:55.
*/
@WebFilter(filterName = "FormatFilter", urlPatterns = ("/"))
public class FormatFilter implements Filter {

@Override
public void destroy() {
// TODO Auto-generated method stub

}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 使用我们自定义的响应包装器来包装原始的ServletResponse
ResponseWrapper wrapper = new ResponseWrapper((HttpServletResponse) response);
// 这句话非常重要,注意看到第二个参数是我们的包装器而不是response
chain.doFilter(request, wrapper);
// 获取到我们所截获的值 --> 做处理之前所获取到的值
String result = wrapper.getResult();
// 对返回的结果做处理操作
result = result.replace("</html>", "<div style='display: none;'>hello world</div>\n</html>");
// 重置响应输出的内容长度
response.setContentLength(-1);
// 输出最终的结果 --> 做完处理之后再把这个值返回回去
PrintWriter out = response.getWriter();
out.write(result);
out.flush();
out.close();
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub

}

}

参考资料:servlet中使用HttpServletResponseWrapper截获返回的页面内容