Guest User

Untitled

a guest
Mar 26th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.76 KB | None | 0 0
  1. import java.io.IOException;
  2. import java.net.URL;
  3.  
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. import javax.servlet.annotation.WebFilter;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletRequestWrapper;
  12. import javax.servlet.http.HttpServletResponse;
  13. import javax.servlet.http.HttpServletResponseWrapper;
  14.  
  15. import org.apache.commons.logging.Log;
  16. import org.apache.commons.logging.LogFactory;
  17.  
  18. /**
  19.  * Реализация CORS фильтра по спецификации
  20.  * https://developer.mozilla.org/ru/docs/Web/HTTP/CORS
  21.  *
  22.  * @author stranger
  23.  *
  24.  */
  25. @WebFilter("/*")
  26. public class CorsFilter implements javax.servlet.Filter {
  27.     private static final String ALLOWED_METHODS = "GET, POST, PUT, DELETE, OPTIONS, HEAD";
  28.     private Log log = LogFactory.getLog(CorsFilter.class);
  29.  
  30.     @Override
  31.     public void init(FilterConfig filterConfig) throws ServletException {
  32.         if (log.isInfoEnabled()) {
  33.             log.info("CorsFilter initialized");
  34.         }
  35.     }
  36.  
  37.     @Override
  38.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  39.             throws IOException, ServletException {
  40.         try {
  41.             if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
  42.                 final HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(
  43.                         (HttpServletRequest) request);
  44.                 final String httpRequestUrl = requestWrapper.getRequestURL().toString();
  45.                 final String httpQueryString = requestWrapper.getQueryString();
  46.                 if (log.isDebugEnabled()) {
  47.                     log.debug(String.format("%s?%s", httpRequestUrl, httpQueryString));
  48.                 }
  49.                 final String httpOrigin = requestWrapper.getHeader("origin");
  50.                 if (httpOrigin != null && !httpOrigin.isEmpty()) {
  51.                     final URL httpOriginUrl = new URL(httpOrigin);
  52.                     final String httpOriginHost = httpOriginUrl.getHost();
  53.                     if (isAllowedOriginHost(httpOriginHost)) {
  54.                         if (log.isInfoEnabled()) {
  55.                             log.info(String.format("The %s http header origin is allowed", httpOrigin));
  56.                         }
  57.                         final HttpServletResponseWrapper responseWrapper = new HttpServletResponseWrapper(
  58.                                 (HttpServletResponse) response);
  59.                         responseWrapper.setHeader("Access-Control-Allow-Origin", httpOrigin);
  60.                         if ("OPTIONS".equals(requestWrapper.getMethod())) {
  61.                             final String accessControlRequestHeaders = requestWrapper.getHeader("Access-Control-Request-Headers");
  62.                             if(accessControlRequestHeaders != null ) {
  63.                                 responseWrapper.setHeader("Access-Control-Allow-Headers", accessControlRequestHeaders);
  64.                             }
  65.                             responseWrapper.setHeader("Access-Control-Allow-Methods", ALLOWED_METHODS);
  66.                             responseWrapper.setHeader("Access-Control-Allow-Credentials", "true");
  67.                             responseWrapper.setHeader("Access-Control-Max-Age", "86400");
  68.                             responseWrapper.setStatus(204);
  69.                             if (log.isInfoEnabled()) {
  70.                                 log.info(String.format("The CORS preflighted request (OPTIONS) for the %s origin [Access-Control-Request-Headers: %s] succeeded", httpOrigin, accessControlRequestHeaders));
  71.                             }
  72.                             return;
  73.                         }
  74.                     } else {
  75.                         if (log.isWarnEnabled()) {
  76.                             log.warn(String.format("The %s http header origin is not allowed and CORS request has been rejected", httpOrigin));
  77.                         }
  78.                     }
  79.                 }
  80.                 if (log.isDebugEnabled()) {
  81.                     log.debug(String.format("%s?%s finished", httpRequestUrl, httpQueryString));
  82.                 }
  83.  
  84.             }
  85.             chain.doFilter(request, response);
  86.         } catch (Exception e) {
  87.             log.error("Failed", e);
  88.             chain.doFilter(request, response);
  89.         }
  90.     }
  91.  
  92.     @Override
  93.     public void destroy() {
  94.         if (log.isInfoEnabled()) {
  95.             log.info("Destoyed");
  96.         }
  97.     }
  98.    
  99.     public static boolean isAllowedOriginHost(String httpOriginHost) {
  100.         if( httpOriginHost != null ) {
  101.             if( "localhost".equalsIgnoreCase(httpOriginHost) ) {
  102.                 return true;
  103.             } else
  104.             if( httpOriginHost.equals("127.0.0.1") ) {
  105.                 return true;
  106.             } else
  107.             if( httpOriginHost.startsWith("10.") ) {
  108.                 return true;
  109.             } else
  110.             if( httpOriginHost.startsWith("100.") ) {
  111.                 String parts[] = httpOriginHost.split("/.");
  112.                 if( parts.length == 4 ) {
  113.                     int d = Integer.valueOf(parts[2]);
  114.                     return 64 <= d && d <= 127;
  115.                 }
  116.             } else
  117.             if( httpOriginHost.startsWith("172.") ) {
  118.                 String parts[] = httpOriginHost.split("/.");
  119.                 if( parts.length == 4 ) {
  120.                     int d = Integer.valueOf(parts[2]);
  121.                     return 16 <= d && d <= 31;
  122.                 }
  123.             } else
  124.             if( httpOriginHost.startsWith("192.168.") ) {
  125.                 return true;
  126.             }
  127.         }
  128.         return false;
  129.     }
  130.    
  131.    
  132.  
  133. }
Advertisement
Add Comment
Please, Sign In to add comment