Java 禁用spring启动应用程序中的HTTP选项方法
我已经在spring boot应用程序上开发了RESTAPI。API只接受GET和POST,但在使用OPTIONS方法请求时,API响应200状态(而不是405)。我用谷歌搜索了这个问题,但没有一个解决方案是基于springboot的 答复:Java 禁用spring启动应用程序中的HTTP选项方法,java,spring-boot,spring-security,Java,Spring Boot,Spring Security,我已经在spring boot应用程序上开发了RESTAPI。API只接受GET和POST,但在使用OPTIONS方法请求时,API响应200状态(而不是405)。我用谷歌搜索了这个问题,但没有一个解决方案是基于springboot的 答复: Allow: OPTIONS, TRACE, GET, HEAD, POST Public: OPTIONS, TRACE, GET, HEAD, POST 需要禁用选项方法。我尝试了这个方法,效果很好 @Bean public EmbeddedServ
Allow: OPTIONS, TRACE, GET, HEAD, POST
Public: OPTIONS, TRACE, GET, HEAD, POST
需要禁用选项方法。我尝试了这个方法,效果很好
@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);
}
}
只针对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扫描的组件。如果没有,您可以使用其他详细的注册方法。试试这个;在
allowedMethods
中,您可以筛选所需的方法:
@Configuration
public class CorsConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins(origins u want to allow)
.allowCredentials(false).allowedMethods("POST", "GET", "PUT");
}
};
}
}
对于SpringBoot服务器,请遵循以下代码
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}
Source@dur请忽略服务器部分。事实上,我不能显示完整的回应,因为它是保密的。所以我只是添加了类似类型的响应。希望你能理解