2017-02-21 137 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); 
    } 
} 
相关问题