一尘不染

寻找一个使用servlet过滤器将内容插入响应中的示例

java

我一直在搜索网络和stackoverflow,以获取有人使用servlet过滤器将内容插入响应中的示例,但只能找到人们捕获/压缩输出和/或更改标题的示例。我的目标是在所有HTML响应的结束之前添加一块HTML。

我正在研究一种扩展HttpServletResponseWrapper以使用我自己的PrintWriter,然后覆盖其上的write方法的解决方案。在write方法内部,我存储了最后7个字符,以查看它是否等于结束body标签,然后在继续其余文档的正常写入操作之前,先编写HTML块加上close body标签。

我觉得有人一定已经解决了这个问题,而且可能比我更优雅。我将感谢有关如何使用servlet过滤器将内容插入响应的任何示例。

更新

响应评论,我还尝试从http://www.oracle.com/technetwork/java/filters-137243.html实现CharResponseWrapper 。这是我的代码:

PrintWriter out = response.getWriter();
CharResponseWrapper wrappedResponse = new CharResponseWrapper(
        (HttpServletResponse)response);

chain.doFilter(wrappedRequest, wrappedResponse);
String s = wrappedResponse.toString();

if (wrappedResponse.getContentType().equals("text/html") &&
        StringUtils.isNotBlank(s)) {
    CharArrayWriter caw = new CharArrayWriter();
    caw.write(s.substring(0, s.indexOf("</body>") - 1));
    caw.write("WTF</body></html>");
    response.setContentLength(caw.toString().length());
    out.write(caw.toString());
}
else {
    out.write(wrappedResponse.toString());
}

out.close();

我也在包装请求,但是该代码有效并且不应影响响应。


阅读 258

收藏
2020-03-22

共1个答案

一尘不染

我正在使用的代码库在处理响应时调用getOutputStream方法,而不是getWriter,因此其他答案中包含的示例无济于事。如果对写入器进行了两次访问,这是一个更完整的答案,可以同时用于OutputStream和PrintWriter,甚至可以正确地进行错误处理。这是从一个很好的示例中得出的,即使用JAVAX.SERVLET.FILTER进行DUMP请求和响应。

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class MyFilter implements Filter
{
    private FilterConfig filterConfig = null;

    private static class ByteArrayServletStream extends ServletOutputStream
    {
        ByteArrayOutputStream baos;

        ByteArrayServletStream(ByteArrayOutputStream baos)
        {
            this.baos = baos;
        }

        public void write(int param) throws IOException
        {
            baos.write(param);
        }
    }

    private static class ByteArrayPrintWriter
    {

        private ByteArrayOutputStream baos = new ByteArrayOutputStream();

        private PrintWriter pw = new PrintWriter(baos);

        private ServletOutputStream sos = new ByteArrayServletStream(baos);

        public PrintWriter getWriter()
        {
            return pw;
        }
2020-03-22