各位高手,
我写了一个filter来过滤网页中的某些文字,但总是报错,
package com.filter;import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;public class MyFilter  implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
PrintWriter out=response.getWriter(); PageResponseWrapper wrapper=new PageResponseWrapper((HttpServletResponse)response);       chain.doFilter(request,wrapper);       String resStr=wrapper.toString();       String newStr="";       resStr=resStr.replaceAll("xxxx", "yyyyyyyyyyy");
               resStr=resStr.replaceAll("zzzz", "yyyyyyyyyyy");
      newStr=resStr;       out.println(newStr);
     
      System.out.print("******************************");      
 }
  public void init(FilterConfig config) throws ServletException {  }  public void destroy() {}}package com.filter;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;public class PageResponseWrapper extends HttpServletResponseWrapper { private CharArrayWriter output;    public String toString(){       return output.toString();    }    public PageResponseWrapper(HttpServletResponse response){      super(response);      output=new CharArrayWriter();    }    public PrintWriter getWriter(){      return new PrintWriter(output);    }
}
报错:
java.net.ProtocolException: Didn't meet stated Content-Length, wrote: '13779' bytes instead of stated: '7512' bytes..
java.net.ProtocolException: Didn't meet stated Content-Length, wrote: '13779' by
tes instead of stated: '7512' bytes.
        at weblogic.servlet.internal.ServletOutputStreamImpl.ensureContentLength
(ServletOutputStreamImpl.java:422)
        at weblogic.servlet.internal.ServletResponseImpl.ensureContentLength(Ser
vletResponseImpl.java:1416)
        at weblogic.servlet.internal.ServletResponseImpl.send(ServletResponseImp
l.java:1459)
        at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.j
ava:1415)
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
        Truncated. see log file for complete stacktrace
>java.lang.StringIndexOutOfBoundsException: String index out of range: -52
        at java.lang.String.substring(String.java:1938)
        at weblogic.servlet.internal.ChunkOutputWrapper.print(ChunkOutputWrapper
.java:158)
        at weblogic.servlet.internal.ChunkWriter.write(ChunkWriter.java:51)
        at java.io.PrintWriter.newLine(PrintWriter.java:436)
        at java.io.PrintWriter.println(PrintWriter.java:585)
        Truncated. see log file for complete stacktrace

解决方案 »

  1.   

    另外,再问一下sitemesh是否可实现同样功能?怎么做啊
      

  2.   

    java.lang.StringIndexOutOfBoundsException: String index out of range: -52 这个错误是下标越界了。
    看你代码好像没发现。
    再仔细查查吧。
    我们过滤某些字符放到数据库中了。
    就是可以动态添加要过滤的汉字。
      

  3.   

    我在out.println(newStr); 前加response.setContentLength(newStr.length())还是报错,两个错
      

  4.   

    是不是weblogic服务的错误,换个服务看看
      

  5.   


    没试过其他服务器,我用的是ORACLE WEBLOGIC 1OgR3,难道它有问题?
      

  6.   

    web.xml<filter>
         <filter-name>myfilter</filter-name>
            <filter-class>com.filter.MyFilter</filter-class>
        </filter><filter-mapping>    <filter-name>myfilter</filter-name>    <servlet-name>*</servlet-name>  </filter-mapping>
        <filter>
         <filter-name>RewriteFilter</filter-name>
            <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
            <init-param>
             <param-name>logLevel</param-name>
                <param-value>WARN</param-value>
            </init-param>
        </filter>
        
        <filter-mapping>
         <filter-name>RewriteFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping> 
      

  7.   

     resStr=resStr.replaceAll("xxxx", "yyyyyyyyyyy"); 
                  resStr=resStr.replaceAll("zzzz", "yyyyyyyyyyy"); 
          newStr=resStr;       out.println(newStr); 
    可能你传进来的字符串里没有"xxxx", 应该先个判断吧
      if(resStr.indexOf("xxxx") > 0){
          resStr=resStr.replaceAll("xxxx", "yyyyyyyyyyy"); 
                  resStr=resStr.replaceAll("zzzz", "yyyyyyyyyyy"); 
          newStr=resStr;       out.println(newStr);
    }
      

  8.   

    在网上搜索一下,发现这个异常有几种解释或解决方法,请参考第一种,weblogic自身的bug。在weblogic6的时候有这个问题,通过打补丁可以解决。wls7的时候不存在,在wls8.1sp2、sp3都有这个问题。建议是升级到sp5可以解决,或者使用升级bea关于这个问题单独的补丁包(购买服务后,将该问题反馈到bea support后,bea会将改补丁包发回)。第二种,使用smartupload会和wls有冲突。有说法smartupload部署在wls上,上传没有问题,下载需要手动修改一个类文件,覆盖后才能解决。实际测试结果验证了使用smartupload下载会有冲突,但没有实验网上所说的修改部分,故未贴出代码。建议使用标准的流方式下载。