2017-02-21 135 views
1

我已經在彈簧引導應用程序上開發了其他API。 API只接受GET和POST,但在請求使用OPTIONS方法時,API響應200狀態(而不是405)。我GOOGLE了這個問題,但沒有一個解決方案是基於springboot的。在彈簧引導應用程序中禁用HTTP OPTIONS方法

響應:

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

需要禁用OPTIONS方法。

+0

@dur請忽略服務器部分。其實我不能顯示完整的迴應,因爲它的分類。所以我只是加了類似的迴應。希望你能理解 –

回答

1

Previous answer只適用於tomcat,所以也加入我的。您可以禁用該方法跨容器,例如,使用一個標準的Servlet過濾器:

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); 
     } 
    } 
} 

注意:假設這個類是由Spring componentscanned。如果不是,您可以使用其他註冊方法,詳見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); 
    } 
} 
相關問題