Advertisement
Javi

REST: JSONFilter

Jan 27th, 2014
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.46 KB | None | 0 0
  1. package com.javiermoreno.rest;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.IOException;
  5. import java.io.OutputStream;
  6. import javax.servlet.DispatcherType;
  7. import javax.servlet.Filter;
  8. import javax.servlet.FilterChain;
  9. import javax.servlet.FilterConfig;
  10. import javax.servlet.ServletException;
  11. import javax.servlet.ServletOutputStream;
  12. import javax.servlet.ServletRequest;
  13. import javax.servlet.ServletResponse;
  14. import javax.servlet.annotation.WebFilter;
  15. import javax.servlet.http.HttpServletResponse;
  16. import javax.servlet.http.HttpServletResponseWrapper;
  17.  
  18. /**
  19.  *
  20.  * @author ciberado
  21.  */
  22. @WebFilter(filterName = "JsonpFilter", urlPatterns = {"/api/*"}, dispatcherTypes = {DispatcherType.FORWARD, DispatcherType.REQUEST})
  23. public class JsonpFilter implements Filter {
  24.  
  25.    
  26.    
  27.     @Override
  28.     public void doFilter(ServletRequest request, ServletResponse response,
  29.             FilterChain chain)
  30.             throws IOException, ServletException {
  31.         String callbackValue = request.getParameter("callback");
  32.         if (callbackValue != null) {
  33.             ResponseWrapper wrappedResponse
  34.                     = new ResponseWrapper((HttpServletResponse) response);
  35.             chain.doFilter(request, wrappedResponse);
  36.             byte[] prefix = (callbackValue + "(").getBytes("utf8");
  37.             byte[] content = wrappedResponse.getContentAsBytes();
  38.             byte[] sufix = (")").getBytes("utf8");
  39.             int length = prefix.length + content.length + sufix.length;
  40.            
  41.             wrappedResponse.setHeader("Content-Length", String.valueOf(length));
  42.             OutputStream realOut = response.getOutputStream();
  43.             realOut.write(prefix);
  44.             realOut.write(content);
  45.             realOut.write(sufix);
  46.         } else {
  47.             chain.doFilter(request, response);
  48.         }
  49.  
  50.     }
  51.  
  52.     @Override
  53.     public void init(FilterConfig filterConfig) throws ServletException {
  54.     }
  55.  
  56.     @Override
  57.     public void destroy() {
  58.     }
  59.    
  60.  
  61.     class FakeServletOutputStream extends ServletOutputStream {
  62.  
  63.         private ByteArrayOutputStream out;
  64.  
  65.         public FakeServletOutputStream() {
  66.             out = new ByteArrayOutputStream(1024 * 32);
  67.         }
  68.  
  69.         public ByteArrayOutputStream getImplementation() {
  70.             return out;
  71.         }
  72.        
  73.         @Override
  74.         public void close() throws IOException {
  75.             out.close();
  76.         }
  77.  
  78.         @Override
  79.         public void flush() throws IOException {
  80.             out.flush();
  81.         }
  82.  
  83.         @Override
  84.         public void write(int data) throws IOException {
  85.             out.write((byte) data);
  86.         }
  87.  
  88.         @Override
  89.         public void write(byte data[]) throws IOException {
  90.             write(data, 0, data.length);
  91.         }
  92.  
  93.         @Override
  94.         public void write(byte data[], int off, int len) throws IOException {
  95.             out.write(data, off, len);
  96.         }
  97.  
  98.     }
  99.  
  100.     class ResponseWrapper extends HttpServletResponseWrapper {
  101.  
  102.         private FakeServletOutputStream out;
  103.  
  104.         public ResponseWrapper(HttpServletResponse response) {
  105.             super(response);
  106.             out = new FakeServletOutputStream();
  107.         }
  108.  
  109.         @Override
  110.         public ServletOutputStream getOutputStream() throws IOException {
  111.             return out;
  112.         }
  113.  
  114.         public byte[] getContentAsBytes() {
  115.             return out.getImplementation().toByteArray();
  116.         }
  117.     }
  118.  
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement