Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.IOException;
- import java.net.URL;
- import javax.servlet.FilterChain;
- import javax.servlet.FilterConfig;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- import javax.servlet.annotation.WebFilter;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletRequestWrapper;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpServletResponseWrapper;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- /**
- * Реализация CORS фильтра по спецификации
- * https://developer.mozilla.org/ru/docs/Web/HTTP/CORS
- *
- * @author stranger
- *
- */
- @WebFilter("/*")
- public class CorsFilter implements javax.servlet.Filter {
- private static final String ALLOWED_METHODS = "GET, POST, PUT, DELETE, OPTIONS, HEAD";
- private Log log = LogFactory.getLog(CorsFilter.class);
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- if (log.isInfoEnabled()) {
- log.info("CorsFilter initialized");
- }
- }
- @Override
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
- throws IOException, ServletException {
- try {
- if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
- final HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(
- (HttpServletRequest) request);
- final String httpRequestUrl = requestWrapper.getRequestURL().toString();
- final String httpQueryString = requestWrapper.getQueryString();
- if (log.isDebugEnabled()) {
- log.debug(String.format("%s?%s", httpRequestUrl, httpQueryString));
- }
- final String httpOrigin = requestWrapper.getHeader("origin");
- if (httpOrigin != null && !httpOrigin.isEmpty()) {
- final URL httpOriginUrl = new URL(httpOrigin);
- final String httpOriginHost = httpOriginUrl.getHost();
- if (isAllowedOriginHost(httpOriginHost)) {
- if (log.isInfoEnabled()) {
- log.info(String.format("The %s http header origin is allowed", httpOrigin));
- }
- final HttpServletResponseWrapper responseWrapper = new HttpServletResponseWrapper(
- (HttpServletResponse) response);
- responseWrapper.setHeader("Access-Control-Allow-Origin", httpOrigin);
- if ("OPTIONS".equals(requestWrapper.getMethod())) {
- final String accessControlRequestHeaders = requestWrapper.getHeader("Access-Control-Request-Headers");
- if(accessControlRequestHeaders != null ) {
- responseWrapper.setHeader("Access-Control-Allow-Headers", accessControlRequestHeaders);
- }
- responseWrapper.setHeader("Access-Control-Allow-Methods", ALLOWED_METHODS);
- responseWrapper.setHeader("Access-Control-Allow-Credentials", "true");
- responseWrapper.setHeader("Access-Control-Max-Age", "86400");
- responseWrapper.setStatus(204);
- if (log.isInfoEnabled()) {
- log.info(String.format("The CORS preflighted request (OPTIONS) for the %s origin [Access-Control-Request-Headers: %s] succeeded", httpOrigin, accessControlRequestHeaders));
- }
- return;
- }
- } else {
- if (log.isWarnEnabled()) {
- log.warn(String.format("The %s http header origin is not allowed and CORS request has been rejected", httpOrigin));
- }
- }
- }
- if (log.isDebugEnabled()) {
- log.debug(String.format("%s?%s finished", httpRequestUrl, httpQueryString));
- }
- }
- chain.doFilter(request, response);
- } catch (Exception e) {
- log.error("Failed", e);
- chain.doFilter(request, response);
- }
- }
- @Override
- public void destroy() {
- if (log.isInfoEnabled()) {
- log.info("Destoyed");
- }
- }
- public static boolean isAllowedOriginHost(String httpOriginHost) {
- if( httpOriginHost != null ) {
- if( "localhost".equalsIgnoreCase(httpOriginHost) ) {
- return true;
- } else
- if( httpOriginHost.equals("127.0.0.1") ) {
- return true;
- } else
- if( httpOriginHost.startsWith("10.") ) {
- return true;
- } else
- if( httpOriginHost.startsWith("100.") ) {
- String parts[] = httpOriginHost.split("/.");
- if( parts.length == 4 ) {
- int d = Integer.valueOf(parts[2]);
- return 64 <= d && d <= 127;
- }
- } else
- if( httpOriginHost.startsWith("172.") ) {
- String parts[] = httpOriginHost.split("/.");
- if( parts.length == 4 ) {
- int d = Integer.valueOf(parts[2]);
- return 16 <= d && d <= 31;
- }
- } else
- if( httpOriginHost.startsWith("192.168.") ) {
- return true;
- }
- }
- return false;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment