2017-02-21 6 views
1

У меня был разработан API для отдыха в приложении весенней загрузки. API-интерфейсы принимают только GET и POST, но по запросу с использованием метода OPTIONS API отвечает на 200 статусов (вместо 405). Я искал эту проблему, но ни одно из решений не было основано на Springboot.Отключить метод HTTP OPTIONS в приложении весенней загрузки

Ответ:

Allow: OPTIONS, TRACE, GET, HEAD, POST 
Public: OPTIONS, TRACE, GET, HEAD, POST 

необходимо отключить метод OPTIONS.

+0

@dur Пожалуйста, проигнорируйте часть сервера. На самом деле я не могу показать полный ответ как его классифицированный. Поэтому я просто добавил аналогичный ответ. Надеюсь, вы сможете понять –

ответ

1

Previous answer предназначено только для tomcat, поэтому добавление рудника также. Можно отключить метод кросс-контейнера, например, с использованием стандартного фильтра сервлетов:

import java.io.IOException; 
import javax.servlet.FilterChain; 
import javax.servlet.ServletException; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.stereotype.Component;  
import org.springframework.web.filter.OncePerRequestFilter; 

@Component 
public class MethodFilter extends OncePerRequestFilter { 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
        throws ServletException, IOException { 
     if (request.getMethod().equals("OPTIONS")) { 
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED); 
     } else { 
      filterChain.doFilter(request, response); 
     } 
    } 
} 

Примечание: предполагается, что этот класс componentscanned с помощью Spring. Если нет, вы можете использовать другие методы регистрации, как описано in here.

0

Я пробовал это, и это сработало.

@Bean 
public EmbeddedServletContainerCustomizer containerCustomizer() { 
    return new EmbeddedServletContainerCustomizer() { 
     @Override 
     public void customize(ConfigurableEmbeddedServletContainer container) { 
      if (container.getClass().isAssignableFrom(TomcatEmbeddedServletContainerFactory.class)) { 
       TomcatEmbeddedServletContainerFactory tomcatContainer = (TomcatEmbeddedServletContainerFactory) container; 
       tomcatContainer.addContextCustomizers(new ContextSecurityCustomizer()); 
      } 
     } 
    }; 
} 

private static class ContextSecurityCustomizer implements TomcatContextCustomizer { 
    @Override 
    public void customize(Context context) { 
     SecurityConstraint constraint = new SecurityConstraint(); 
     SecurityCollection securityCollection = new SecurityCollection(); 
     securityCollection.setName("restricted_methods"); 
     securityCollection.addPattern("/*"); 
     securityCollection.addMethod(HttpMethod.OPTIONS.toString()); 
     constraint.addCollection(securityCollection); 
     constraint.setAuthConstraint(true); 
     context.addConstraint(constraint); 
    } 
} 
Смежные вопросы