自响应对象的实际流的 引用。baStream 是我们输出流的缓冲版本,后续处理器就写入这里。closed 标 记标明了 close() 是否在此实例流中被调用。构造器将来自响应对象的流引用存储起来并创建了缓冲流。它还将文本字符串存储起来供以后的替代操作使用。
清单 8. write() 方法
public void write(int i) throws java.io.IOException {
baStream.write(i);
}
Tomcat的过滤诀窍(6)
时间:2010-12-13 IBM Sing Li
我们须提供自己的源于 ServletOutputStream 的 write() 方法。在此,我 们当然是写入缓冲流。所有来自后续处理器的更高级输出方法都将以最低级别使 用该方法,以保证所有的写入都指向缓冲流。
清单 9. close() 及 flush() 方法
public void close() throws java.io.IOException {
if (!closed) {
processStream();
intStream.close();
closed = true;
}
}
public void flush() throws java.io.IOException {
if (baStream.size() != 0) {
if (! closed) {
processStream(); // need to synchronize the flush!
baStream = new ByteArrayOutputStream();
}
}
}
close() 及 flush() 方法是我们完成转换的语句。根据后续处理器不同,其 中的一个或两个程序都有可能被调用。我们使用布尔型的 closed 标识来避免异 常情况。请注意,我们将实际的替代工作委托给了 processStream() 方法。
清单 10. processStream() 方法
public void processStream() throws java.io.IOException {
intStream.write(replaceContent(baStream.toByteArray ()));
intStream.flush();
}
processStream() 方法将经转换的输出结果从 baStream 写入其已经配有的 intStream 中去。转换工作独立于 replaceContent() 方法。
清单 11. replaceContent() 方法
public byte [] replaceContent(byte [] inBytes) {
String retVal ="";
String firstPart="";
String tpString = new String(inBytes);
String srchString = (new String (inBytes)).toLowerCase();
int endBody = srchString.indexOf(origText);
if (endBody != -1) {
firstPart = tpString.substring(0, endBody);
retVal = firstPart + newText +
tpString.substring(endBody + origText.length ());
} else {
retVal=tpString;
}
return retVal.getBytes();
}
}
replaceContent() 是发生搜索与替换的语句。它将一个字节数组作为输入并 返回一个字节数组,创建一个原始的概念接口。事实上,我们能通过替换该方法 中的逻辑部分来完成任何形式的转换。这里,我们进行非常简单的文本替换。
清单 12. ReplaceTextWrapper 类
class ReplaceTextWrapper extends HttpServletResponseWrapper {
private PrintWriter tpWriter;
private ReplaceTextStream tpStream;
public ReplaceTextWrapper(ServletResponse inResp, String searchText,
String replaceText)
throws java.io.IOException {
super((HttpServletResponse) inResp
|