6、CORS支持,什么是跨域?跨域怎么解决?jsonp、CROS,完成的跨域流程,跨域测试。Springboot解决跨域

6. CORS支持

6.1、什么是跨域?

image.pngimage.pngimage.png

image.pngimage.png

如果一个服务是91端口,这个服务又调用其他的服务。而这个服务是90端口,这就会出现跨域

image.pngimage.png

6.2、跨域怎么解决?

1、jsonp,

缺点:只支持Get,而且是把远程的函数拉过来本地运行。和开发流程不符合。所以最好使用CROS

image.png

2、CROS

比如:

对8080:当前服务是在8080端口,而我的前端想访问8081端口里的服务(添加、删除),请求8081

对8081:如果8081端口的服务里这两个方法没有开启跨域支持8080,那么就会访问失败(没有解决跨域)

总结,当8080端口的前端页面需要去8081端口拿数据(而不是8080自身),就会出现跨域。解决办法是让8081端口允许被跨域。

注意:跨域指的不是自身前端页面解决,而是被请求的后端资源去解决。被请求的服务要允许自己被其他人访问,而不是仅仅是自身才能访问。

服务端支持跨域

image.png

完整的跨域流程

image.pngimage.pngimage.png

跨域解决

有两种办法:一种在方法上加@CrossOrigin、一种在全局进行配置

下面创建两个工程

8081工程提供后端服务。这里配置跨域,表示自己的资源可以被跨域取到。

8080工程负责前端请求。这里发起ajax请求,去拿8081端口的服务。

8081工程:这里是写在了方法上。

@RestController
@RequestMapping("/book")
public class CROSController {

    @PostMapping("/")
    @CrossOrigin(value="http://localhost:8080",maxAge = 1800,allowedHeaders = "*")
    public String addBook(String name) {
        return "receive:"+name;
    }

    @DeleteMapping("/{id}")
    @CrossOrigin(value="http://localhost:8080",maxAge = 1800,allowedHeaders = "*")
    public String deleteById(@PathVariable Long id) {
        return String.valueOf(id);
    }
}

image.pngimage.png

还可以写在全局中

@Configuration
public class MyWebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/book/**")
                .allowedHeaders("*")
                .allowedMethods("*")
                .maxAge(1800)
                .allowedOrigins("http://localhost:8080");
    }
}

image.png

配置文件把端口改成8081

8080工程:

resources/static文件下创建index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js">
    </script>
</head>
<body>
<div id="contentDiv"></div>
<div id="deleteResult"></div>
<input type="button" value="提交数据" onclick="getData()"><br>
<input type="button" value="删除数据" onclick="deleteData()"><br>
<script>
    function deleteData() {
        $.ajax({
            url: 'http://localhost:8081/book/99',
            type: 'delete',
            success: function(msg) {
                $("#deleteResult").html(msg);
            }
        })
    }

    function getData() {
        $.ajax({
            url: 'http://localhost:8081/book/',
            type: 'post',
            data: {name: '三国演义'},
            success: function(msg) {
                $("#contentDiv").html(msg);
            }
        })
    }
</script>
</body>
</html>

然后运行两个服务。运行结果如下:

image.png

如果我把跨域代码注释,运行结果变成了:

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值