在 Spring 二级 Servlet 中启用 CORS

Posted

技术标签:

【中文标题】在 Spring 二级 Servlet 中启用 CORS【英文标题】:Enabling CORS in Spring Secondary Servlet 【发布时间】:2016-11-28 07:28:53 【问题描述】:

我正在使用 Spring boot 的 ServletRegistrationBean 注册一个辅助 servlet

@Configuration
public class CxfServletRegister    
@Bean
public ServletRegistrationBean getODataServletRegistrationBean() 
    ServletRegistrationBean odataServletRegistrationBean = new ServletRegistrationBean(new CXFNonSpringJaxrsServlet(), "/odata.svc/*");
    Map<String, String> initParameters = new HashMap<String, String>();
    initParameters.put("javax.ws.rs.Application", "org.apache.olingo.odata2.core.rest.app.ODataApplication");
    initParameters.put("org.apache.olingo.odata2.service.factory", "com.cce.utils.JPAServiceFactory");
    odataServletRegistrationBean.setInitParameters(initParameters);
    return odataServletRegistrationBean;


我正在使用 Apache Olingo 构建 OData 应用程序。我希望为我的服务启用 CORS。 如何为此 servlet 启用 CORS?

PS 我已经尝试过 Spring 中的 WebConfigurer bean:入门指南

@Bean
public WebMvcConfigurer corsConfigurer() 
    return new WebMvcConfigurerAdapter() 
        @Override
        public void addCorsMappings(CorsRegistry registry) 
            registry.addMapping("/greeting-javaconfig").allowedOrigins("*");
        
    ;

这不起作用,可能是因为这是配置spring web的默认调度器servlet,而不是使用ServletRegistrationBean配置的附加servlet

【问题讨论】:

【参考方案1】:

我在这里找到了一种可能的方法: https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

    @Configuration
    public class MyConfiguration 

    @Bean
    public FilterRegistrationBean corsFilter() 
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("http://domain1.com");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        bean.setOrder(0);
        return bean;
       
    

【讨论】:

这成功了!确切的代码是:FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source), servletRegistrationBean); //servletRegistrationBean 在哪里注册了我想要的 servlet

以上是关于在 Spring 二级 Servlet 中启用 CORS的主要内容,如果未能解决你的问题,请参考以下文章

休眠:无法启用二级缓存

Spring gzip 与 Tomcat gzip

spring 之 文件上传

Spring学习-缓存

spring mvc 返回JSON数据

Ajax-Servlet第二课 员工管理系统-二级联动搜索功能