在Java Web開發中,咱們常常須要攔截http請求,去作一些轉發或者是校驗等事情。這類工做一般filter能夠很輕鬆的搞定,但這通常都是攔截請求。而咱們有時候也會有一些需求,好比說是攔截服務器的返回(Response),但願在數據流在服務器端處理完畢,且返回瀏覽器以前,在這中間作一些本身的事情。網上搜了搜,發現資源不多。因而本身實現了一版,跟你們分享一下。主要用到了HttpServletResponseWrapper獲取到數據流,而後經過response.getWriter().write來回寫數據。html
1 HttpStreamFilter.java 2 3 package test; 4 5 import java.io.BufferedReader; 6 import java.io.FileReader; 7 import java.io.File; 8 import java.io.IOException; 9 import javax.servlet.Filter; 10 import javax.servlet.FilterChain; 11 import javax.servlet.FilterConfig; 12 import javax.servlet.ServletException; 13 import javax.servlet.ServletRequest; 14 import javax.servlet.ServletResponse; 15 import javax.servlet.http.HttpServletRequest; 16 import javax.servlet.http.HttpServletResponse; 17 import java.util.regex.Pattern; 18 import java.util.regex.Matcher; 19 import java.util.concurrent.ConcurrentHashMap; 20 21 public class HttpStreamFilter implements Filter { 22 23 public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) 24 throws IOException, ServletException 25 { 26 HttpServletRequest request = (HttpServletRequest)arg0; 27 HttpServletResponse response = (HttpServletResponse)arg1; 28 29 WrapperResponse wrapperResponse = new WrapperResponse(response); 30 chain.doFilter(request, wrapperResponse); 31 String html = wrapperResponse.getContent(); 32 response.setContentLength(-1); 33 response.getWriter().write( filterHTML(html) ); 34 } 35 36 public void init(FilterConfig filterConfig) throws ServletException { 37 38 } 39 40 public void destroy() {} 41 42 public String filterHTML(String html) throws IOException 43 { 44 return html.replace("script", ""); 45 } 46 } 47 WrapperResponse.java 48 49 package test; 50 51 import java.io.ByteArrayOutputStream; 52 import java.io.IOException; 53 import java.io.PrintWriter; 54 import java.io.UnsupportedEncodingException; 55 import javax.servlet.http.HttpServletResponse; 56 import javax.servlet.http.HttpServletResponseWrapper; 57 58 public class WrapperResponse extends HttpServletResponseWrapper { 59 60 private class ResponsePrintWriter extends PrintWriter 61 { 62 ByteArrayOutputStream output; 63 64 public ResponsePrintWriter(ByteArrayOutputStream output) 65 { 66 super(output); 67 this.output = output; 68 } 69 70 public ByteArrayOutputStream getByteArrayOutputStream() 71 { 72 return output; 73 } 74 } 75 76 private ResponsePrintWriter writer; 77 private ByteArrayOutputStream output; 78 79 public WrapperResponse(HttpServletResponse httpServletResponse) 80 { 81 super(httpServletResponse); 82 output = new ByteArrayOutputStream(); 83 writer = new ResponsePrintWriter(output); 84 } 85 86 public void finalize() throws Throwable 87 { 88 super.finalize(); 89 output.close(); 90 writer.close(); 91 } 92 93 public String getContent() 94 { 95 try 96 { 97 writer.flush(); 98 return writer.getByteArrayOutputStream().toString("GBK"); 99 } 100 catch(UnsupportedEncodingException e) 101 { 102 return "UnsupportedEncoding"; 103 } 104 } 105 106 public void close() throws IOException 107 { 108 writer.close(); 109 } 110 111 public PrintWriter getWriter() throws IOException 112 { 113 return writer; 114 } 115 }