我在net和stackoverflow中搜索了一个使用servlet过滤器将内容插入响应的示例,但只能找到捕获/压缩输出和/或更改头部的示例。我的目标是在所有HTML响应的结束之前追加一个HTML块。
我正在研究一个解决方案,它扩展HttpServletResponseWrapper以使用我自己的PrintWriter,然后重写它上的write方法。在write方法中,我存储了最后7个字符,以查看它是否等于结束体标记,然后在继续对文档其余部分进行正常的写操作之前,写入HTML块和结束体标记。
作为对评论的回应,我还试图从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();
我也在包装请求,但代码可以工作,不应该影响响应。
我使用的代码库在处理响应时调用getOutputStream方法,而不是getWriter,因此其他答案中包含的示例没有帮助。下面是一个更完整的答案,它同时适用于OutputStream和PrintWriter,如果writer被访问两次,即使错误也是正确的。这是从使用javax.servlet.filter的转储请求和响应这个很棒的示例派生出来的。
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;
}
public ServletOutputStream getStream()
{
return sos;
}
byte[] toByteArray()
{
return baos.toByteArray();
}
}
public class CharResponseWrapper extends HttpServletResponseWrapper
{
private ByteArrayPrintWriter output;
private boolean usingWriter;
public CharResponseWrapper(HttpServletResponse response)
{
super(response);
usingWriter = false;
output = new ByteArrayPrintWriter();
}
public byte[] getByteArray()
{
return output.toByteArray();
}
@Override
public ServletOutputStream getOutputStream() throws IOException
{
// will error out, if in use
if (usingWriter) {
super.getOutputStream();
}
usingWriter = true;
return output.getStream();
}
@Override
public PrintWriter getWriter() throws IOException
{
// will error out, if in use
if (usingWriter) {
super.getWriter();
}
usingWriter = true;
return output.getWriter();
}
public String toString()
{
return output.toString();
}
}
public void init(FilterConfig filterConfig) throws ServletException
{
this.filterConfig = filterConfig;
}
public void destroy()
{
filterConfig = null;
}
public void doFilter(
ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
CharResponseWrapper wrappedResponse = new CharResponseWrapper(
(HttpServletResponse)response);
chain.doFilter(request, wrappedResponse);
byte[] bytes = wrappedResponse.getByteArray();
if (wrappedResponse.getContentType().contains("text/html")) {
String out = new String(bytes);
// DO YOUR REPLACEMENTS HERE
out = out.replace("</head>", "WTF</head>");
response.getOutputStream().write(out.getBytes());
}
else {
response.getOutputStream().write(bytes);
}
}
}
问题内容: 我一直在搜索网络和stackoverflow,以获取有人使用servlet过滤器将内容插入响应中的示例,但只能找到人们捕获/压缩输出和/或更改标题的示例。我的目标是在所有HTML响应的结束 问题答案: 我正在使用的代码库在处理响应时调用getOutputStream方法,而不是getWriter,因此其他答案中包含的示例无济于事。如果对写入器进行了两次访问,这是一个更完整的答案,可以同
问题内容: 我正在尝试将一些内容插入“空白” iFrame中,但是没有插入任何内容。 HTML: JS: 我正在调用该函数,所以我不明白为什么它没有插入。 问题答案: 您真的不需要jQuery: 如果绝对必须使用jQuery,则应使用 请不要忘记,如果您使用的是jQuery,则需要按如下所示插入DOMReady函数:
我试图通过一个对象,和一些属性,我有有限数量的值,他们可以分配给。下面是我目前检查它们价值的方法: 有没有办法对此进行优化?
我已经创建了服务器过滤器,它计算响应大小。它通过创建响应包装器来实现这一点,该包装器将与Apache Commons包装在一起。此外,包装器创建带有包装流的PrintWriter。因此,理论上,无论使用什么方法来创建实际输出,都应该通过CountingOutputStream。 问题是,虽然整个过程对于典型的servlet请求都有效,但对于静态内容却失败了。准确地说,过滤器接收请求,创建响应包装,
如果任何< code>J2EE应用程序直接命中servlet,然后servlet将相同的请求转发给某个< code >。jsp页面。 我有一个带有以下url模式的servlet过滤器 因此,转发的请求是否也会进行过滤。 在我的情况下,它不会到来,这是一个预期的行为。只是想了解这一点。
有人知道是怎么回事吗?我会非常感谢任何伸出援手的人:)