Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Servlet过滤器和响应包装器_Java_Jsp_Servlets_Servlet Filters - Fatal编程技术网

Java Servlet过滤器和响应包装器

Java Servlet过滤器和响应包装器,java,jsp,servlets,servlet-filters,Java,Jsp,Servlets,Servlet Filters,试图搞乱我尝试过的回复内容 所以我把我的类定义为 public class FilterServletOutputStream extends ServletOutputStream { //======================================================================= private DataOutputStream stream; //==================================

试图搞乱我尝试过的回复内容

所以我把我的类定义为

public class FilterServletOutputStream extends ServletOutputStream
{
    //=======================================================================
    private DataOutputStream stream; 
    //=======================================================================
    public FilterServletOutputStream(OutputStream output) { 
      stream = new DataOutputStream(output); 
    }
    //=======================================================================
    @Override
    public void write(int b) throws IOException  {
        stream.write(b); 
    }
    //=======================================================================
    @Override
    public void write(byte[] b) throws IOException  { 
        stream.write(b); 
    }
    //=======================================================================
    @Override
    public void write(byte[] b, int off, int len) throws IOException  {
        stream.write(b,off,len); 
    }
    //=======================================================================
}




public class GenericResponseWrapper extends HttpServletResponseWrapper 
{ 
  private ByteArrayOutputStream output;
  private int contentLength;
  private String contentType;
  public GenericResponseWrapper(HttpServletResponse response) { 
    super(response);
    output=new ByteArrayOutputStream();
  } 
  public byte[] getData() { 
    return output.toByteArray(); 
  } 
  @Override
  public ServletOutputStream getOutputStream() 
  { 
    return new FilterServletOutputStream(output); 
  } 

  @Override
  public PrintWriter getWriter() 
  { 
    return new PrintWriter(getOutputStream(),true); 
  } 

  @Override
  public void setContentLength(int length) { 
    this.contentLength = length;
    super.setContentLength(length); 
  } 

  public int getContentLength() { 
    return contentLength; 
  } 
  @Override
  public void setContentType(String type) { 
    this.contentType = type;
    super.setContentType(type); 
  } 
  @Override
  public String getContentType() { 
    return contentType; 
  } 
} 
然后是我的过滤器

public void  doFilter(ServletRequest request, ServletResponse response, FilterChain   chain) throws IOException, ServletException
{
    //===================================================================
    GenericResponseWrapper wrapper = new GenericResponseWrapper((HttpServletResponse) response);
    chain.doFilter(request, wrapper);
    OutputStream out = response.getOutputStream();
    out.write(wrapper.getData());
    out.write("test content".getBytes());
    out.close();
    //===================================================================
}
过滤器似乎没问题。我可以读取“测试内容”,但它似乎
wrapper.getData()
返回0字节。当我调用
chain.doFilter(..)
时,通常是一个servlet,有时它会发送到jsp页面。尝试了JSP普通页面的URL,但似乎没有写入数据。 过滤器被配置为捕获所有请求,并且做得很好

我做错了什么?唯一的区别是我添加了
@override
。但我也试着不用它们

添加了一个JSP

  <%@page contentType="text/html" pageEncoding="UTF-8" session="false"%>
  <!DOCTYPE html>
  <html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <style>
  <%-- @include file="/static/css/divs.css" --%>
  <%-- @include file="/static/css/links.css" --%>
  </style>
  <title>title</title>
  </head>
  <body style="margin-top: 0px; margin-left: 0px; margin-right: 0px">
  <%--@include file="publicheader.jsp" --%>
  <div class="desktopwebpagecontainer">
  main page.
  </div>
  <%--@include file="publicfooter.jsp" --%>
  </body>
  </html>

标题
主页。

解决问题的方法是使pwriter和outpstrm类成为成员(字段)

然后改变获取它们的方法

@Override
public ServletOutputStream getOutputStream() 
{ 
    if (outpstrm == null) outpstrm = new AppServletOutputStream(output);
    return outpstrm;
} 
@Override
public PrintWriter getWriter() 
{ 
    if (pwriter == null) pwriter = new PrintWriter(getOutputStream(),true); 
    return pwriter;
} 
这似乎就是解决我问题的方法。由于这一变化,包装工作良好。
顺便说一句谁说你不能调用RequestDispatcher类的methodforward(req,res)方法?

你怎么知道
wrapper.getData()
返回0字节?我不能,这就是为什么我说“似乎”。我能说的是它不是空的。打印出
getData().length
。我打印到控制台。它是0。未能将其打印到以前的响应中。我无法复制此内容。向我们展示一个将复制此内容的
Servlet
。尽可能减少示例。AppServletOutputStream是否与FilterServletOutputStream相同。其次,我无法获得
request.getRequestDispatcher(“abcd.html”).forward(请求,响应)工作。我在过滤器映射中添加了
转发请求
,因此在转发过程中也会调用过滤器,但不知何故,修改后的响应不会发送到浏览器。浏览器仍按html文件中的格式显示abcd.html。
@Override
public ServletOutputStream getOutputStream() 
{ 
    if (outpstrm == null) outpstrm = new AppServletOutputStream(output);
    return outpstrm;
} 
@Override
public PrintWriter getWriter() 
{ 
    if (pwriter == null) pwriter = new PrintWriter(getOutputStream(),true); 
    return pwriter;
}