我已經在彈簧引導應用程序上開發了其他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請忽略服務器部分。其實我不能顯示完整的迴應,因爲它的分類。所以我只是加了類似的迴應。希望你能理解 –