测试中间件是weblogic8.1.4,jdk 是weblogic 自带的1.42
网上看到很多HttpServletResponseWrapper 的继承类的实现方法,最简单就是通过CharArrayWriter 对象缓存输出字符,但是这种方式只能在tomcat 中可以实现,在weblogic 中无法实现,因为weblogic 只能用流操作输出,下面的ResponseWrapper 代码是我试了很多次,终于在weblogic 上可以实现了。
但是个人是不建议使用ResponseWrapper 的,对于复杂页面,多层嵌套,多个编码组成的页面,单就乱码等就搞死人了,复杂的页面布局也不一定能正确显示。
一般用于简单构成页面,并且过滤器最好指定特定的地址。
在过滤器中写上下面这些, 最好加上try-catch-finally, 乱码问题自行解决
ResponseWrapper mr = new ResponseWrapper(response); //定义好ResponseWrapper 对象,这个时候response 里面的流就写入到ResponseWrapper 对象里面了
chain.doFilter(request, mr); //传给下一个过滤器
ServletOutputStream out = resp.getOutputStream(); //注意weblogic 的话,getReader 和getOutputStream 两者只能调用其中一个,weblogic 默认调用了getOutputStream,调用getReader 会报异常。
String result = new String(mr.getResponseData()); //获取输出内容
response.setContentLength(-1); //避免输出内容有差错,写上这个
out.write(result.getBytes(), 0, result.length()); //重新输出内容
out.flush();
out.close();
下面都是ResponseWrapper 的代码,要全部搬上去,已经通过了weblogic8.1.4 的测试
package filters;
import java.io.ByteArrayOutputStream;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import javax.servlet.http.HttpServletRequestWrapper;
public class ResponseWrapper extends HttpServletResponseWrapper {
private ByteArrayOutputStream buffer = null;
private ServletOutputStream out = null;
private PrintWriter writer = null;
public ResponseWrapper(HttpServletResponse response) throws IOException {
super(response);
buffer = new ByteArrayOutputStream();
out = new WapperedOutputStream(buffer);
writer = new PrintWriter(new OutputStreamWriter(buffer, this.getCharacterEncoding()));
}
public PrintWriter getWriter() throws IOException {
return writer;
}
public ServletOutputStream getOutputStream() throws IOException {
return out;
}
public void flushBuffer() throws IOException {
if (out != null) {
out.flush();
}
if (writer != null) {
writer.flush();
}
}
public void reset() {
buffer.reset();
}
public byte[] getResponseData() throws IOException {
flushBuffer();
return buffer.toByteArray();
}
}
package filters;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.servlet.ServletOutputStream;
public class WapperedOutputStream extends ServletOutputStream {
private ByteArrayOutputStream bos = null;
public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException {
bos = stream;
}
public void write(int b) throws IOException {
bos.write(b);
}
}