ramostear.comramostear.com 谭朝红的技术分享博客

格言 编程是一门技术,也是一门艺术 !

如何在Spring Boot中解决跨域问题?

如何在Spring Boot中解决跨域问题?

Spring Boot(十三)— CORS跨域支持

CORS,全称Cross-Origin Resource Sharing,是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domain)的脚本请求访问的机制,通常由于同域安全策略(the same-origin security policy)浏览器会禁止这种跨域请求。它会在你进行如下的请求时被触发:

在本章节的内容中,我将以一个简单的案例来讲解在Spring Boot中如何处理跨域请求资源。

1. 局部跨域

在Spring Boot应用程序中,你可以使用@CrossOrign注解来开启单个控制器支持跨域请求操作。需要注意@CrossOrign的作用范围只在被注释的Rest API(局部支持跨域)。下面的代码给出了一个简单的演示:

@GetMapping("/users")
@CrossOrign(origins="http://localhost:8080")
public ResponseEntity<Object> users(){
    return null;
}

2. 全局跨域

Spring Boot提供了显示Bean装配的方式配置允许全局跨域操作。你可以参照下面给出的代码配置允许全局跨域请求:

@Bean
    public WebMvcConfigurationSupport crossConfig(){
        return new WebMvcConfigurationSupport(){
            @Override
            public void addCorsMappings(CorsRegistry registry){
                registry.addMapping("/users").allowedOrigins("http://localhost:8080");
            }
        };
    }

3. 跨域调用

现在,创建一个控制调用第六章—RESTful Web服务,获取用户的信息。在这里,我们使用RestTemplate调用User Restful Web服务,如何使用RestTemplate,请阅读第十章 — RestTemplate相关内容。下面的代码显示了使用RestTemplate进行跨域调用Restful Web服务。

package com.ramostear.application.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.Arrays;

/**
 * @author ramostear
 * @create-time 2019/3/11 0011-7:14
 * @modify by :
 * @since:
 */
@RestController
public class UserController {
    private static final String ROOT_URI = "http://localhost:8080/users";

    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/users")
    public String getUsers(){
        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
        HttpEntity<String> entity = new HttpEntity<>(headers);
        return restTemplate.exchange(ROOT_URI, HttpMethod.GET,entity,String.class).getBody();
    }

}

除此之外,需要修改application.propertiesserver.port属性的值为8090(或者其他与User Restful Web服务不冲突的端口号):

server.port= 8090

现在,分别启动两个应用程序,并测试跨域调用是否成功。启动Postman测试应用程序,在地址栏输入:http://localhost:8090/users, 发送请求,并观察页面变化: