在运行时动态地将CORS映射添加到Rest Controller

时间:2017-12-05 11:46:52

标签: java spring rest spring-boot cors

嗨!我是Spring Boot的初学者。我有一个简单的Java Spring Boot应用程序,它使用Rest Controller。某些控制器的端点暴露给CORS请求。我发现通过在方法上方添加@CrossOrigin(originins =“..”)注释可以允许CORS请求。 我的问题是我目前不知道所有的起源,并且必须在我的Spring Boot应用程序的运行时间之后添加其中的一些。 是否有可能有一种方法手动将新的原始地址添加到我的Rest Controller的某些端点?例如。在我的Rest Controller中有一个端点,允许特定用户(例如,Admin)将新的cors-origin添加到休息端点?如果是:请举一个简单的例子。

4 个答案:

答案 0 :(得分:0)

我认为通过实施您自己的org.springframework.web.cors.CorsProcessor可以做到这一点。看看org.springframework.web.filter.CorsFilter的实施情况,可以通过方法CorsProcessor配置您的自定义public void setCorsProcessor(CorsProcessor processor)

然后我建议您实施自己的CorsProcessor并使用方法processRequest处理您的自定义规则。

或者另一种选择是在Spring Security Config中设置自己的CorsConfigurationSource。例如 @Override protected void configure(HttpSecurity http) throws Exception { http.cors().configurationSource(new CustomConfigSource()); }

CorsConfigurationSource提供了一种方法CorsConfiguration getCorsConfiguration(HttpServletRequest request);,您可以在其中处理特定的CORS处理。

答案 1 :(得分:0)

您可以通过res.addHeader("Access-Control-Allow-Origin","what you want here like http/.....");

将其直接添加到HttpServletResponse res中
@RequestMapping(value="/getbot/{id}", 
       method = RequestMethod.POST,
       headers="Accept=application/json") 
@ResponseBody public String getbot(HttpServletResponse res) { 
          res.addHeader("Access-Control-Allow-Origin","*");
          ...
}

我尝试过用springboot做到这一点,因为默认的cors处理程序会覆盖您的标头,但我没有找到阻止它的方法 我认为我们需要为该springboot编写servlet,但我们不能动态地完成

答案 2 :(得分:0)

以下在 Spring 2.4 中对我有用:

import java.util.Arrays;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration corsConfiguration = new CorsConfiguration();

        final String corsAllowedOrigins = System.getenv("CORS_ALLOWED_ORIGINS");

        corsConfiguration.setAllowCredentials(true);
        corsConfiguration.setAllowedOrigins(Arrays.asList(corsAllowedOrigins.split(",")));
        corsConfiguration.setAllowedMethods(Arrays.asList(CorsConfiguration.ALL));
        corsConfiguration.setAllowedHeaders(Arrays.asList(CorsConfiguration.ALL));

        source.registerCorsConfiguration("/**", corsConfiguration);

        return new CorsFilter(source);
    }
}

答案 3 :(得分:-1)

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    response.addHeader("Access-Control-Allow-Origin", "*");

    if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
        LOG.trace("Sending Header....");
        // CORS "pre-flight" request
        response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");

        response.addHeader("Access-Control-Allow-Headers", "Content-Type");
        response.addHeader("Access-Control-Max-Age", "1");
    }

    filterChain.doFilter(request, response);
}

请使用过滤器cros_filter