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