我已经在弹簧引导应用程序上开发了其他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方法。
我已经在弹簧引导应用程序上开发了其他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方法。
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。
我试过这个,它工作。
@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);
}
}
@dur请忽略服务器部分。其实我不能显示完整的回应,因为它的分类。所以我只是加了类似的回应。希望你能理解 –