如何在Spring Boot Cors中设置标头?

时间:2018-08-27 12:17:15

标签: java spring-boot cors

我想在Spring Boot 2中启用CORS。我这样做如下:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("*")
                .allowedHeaders("*");
    }
}

在大多数请求中都可以正常工作,但是在某些特殊请求中,我需要设置Access-Control-Allow-Origin头作为响应。 我该怎么做

3 个答案:

答案 0 :(得分:0)

有许多方法可以做到这一点,例如使用“过滤器”或“拦截器”或“方面”。如果您使用的是Spring 5,也可以使用WebFilter。

其中一种方法是通过拦截器。这是一个粗略的代码。

public class AccessControlInterceptor implements HandlerInterceptor {

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        if(somecondition) {
            response.setHeader("Access-Control-Allow-Origin", "your_value");
        }
    }
}

并用这样的弹簧注册此拦截器

@Configuration
public class MyConfig extends WebMvcConfigurerAdapter{
    @Override
    public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(new AccessControlInterceptor ()).addPathPatterns("/**");
    }
}

答案 1 :(得分:0)

摘自Spring文档https://spring.io/guides/gs/rest-service-cors/

启用CORS 控制器方法CORS配置 为了使RESTful Web服务的响应中包含CORS访问控制标头,只需在处理程序方法中添加@CrossOrigin批注:

@RestController
public class GreetingController {

    @CrossOrigin(origins = "http://localhost:9000")
    @GetMapping("/greeting")
    public Greeting greeting(@RequestParam(required=false, defaultValue="World") String name) {
        System.out.println("==== in greeting ====");
        return new Greeting(counter.incrementAndGet(),String.format(template, name));
}

此@CrossOrigin批注仅对此特定方法启用跨域请求。默认情况下,它允许使用所有来源,所有标头,@ RequestMapping批注中指定的HTTP方法以及30分钟的maxAge。您可以通过指定以下注释属性之一的值来自定义此行为:起点,方法,allowedHeaders,暴露的Headers,allowCredentials或maxAge。在此示例中,我们仅允许http://localhost:9000发送跨域请求。

也可以在控制器类级别添加此批注,以便在此类的所有处理程序方法上启用CORS。

答案 2 :(得分:0)

当前,您将Access-Control-Allow-Origin设置为*,这是一个通配符,并且匹配所有原点。

如果您的请求包含与凭证相关的数据,例如通过将XMLHttpRequest.withCredentials设置为true

  • Access-Control-Allow-Origin的值不能为*

  • 需要附加值为Access-Control-Allow-Credentials的附加响应标头true