欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

微人事第四天:跨域问题

程序员文章站 2022-04-30 22:41:20
...

要知道什么是跨域问题首先要了解同源策略:
很多人对跨域有一种误解,以为这是前端的事,和后端没关系,其实不是这样的,说到跨域,就不得不说说浏览器的同源策略。

同源策略是由 Netscape 提出的一个著名的安全策略,它是浏览器最核心也最基本的安全功能,现在所有支持 JavaScript 的浏览器都会使用这个策略。所谓同源是指协议、域名以及端口要相同。同源策略是基于安全方面的考虑提出来的,这个策略本身没问题,但是我们在实际开发中,由于各种原因又经常有跨域的需求,传统的跨域方案是 JSONP,JSONP 虽然能解决跨域但是有一个很大的局限性,那就是只支持 GET 请求,不支持其他类型的请求,而今天我们说的 CORS(跨域源资源共享)(CORS,Cross-origin resource sharing)是一个 W3C 标准,它是一份浏览器技术的规范,提供了 Web 服务从不同网域传来沙盒脚本的方法,以避开浏览器的同源策略,这是 JSONP 模式的现代版。

在 Spring 框架中,对于 CORS 也提供了相应的解决方案,今天我们就来看看 SpringBoot 中如何实现 CORS。

现在通过一个实际案例来解释什么是跨域问题:
1.首先创建springboot项目名称叫cors1
微人事第四天:跨域问题
2.在该项目中写一个简单的controller类

package org.javaboy.cors1;

import org.springframework.web.bind.annotation.GetMapping;

public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "hello cors!";
    }
}

也就是当我们访问的路径最后是/hello页面就会显示“hello cors”
3.现在来创建另外一个springboot项目名称叫cors2
微人事第四天:跨域问题
4.在配置类中修改项目端口(为了与项目1区分开来)

server.port=8081

5.写一个html文件作为前端界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery.min.js"></script>
</head>
<body>
    <div id="app"></div>
    <input type="button" value="GET" onclick="getData()"/>
<script>
    function getData() {
        $.get('http://localhost:8080/hello',function (msg) {
            $('#app').html(msg);
        })
    }
</script>
</body>
</html>

实现原理:通过访问index.html中的界面,通过ajax的异步请求到cors1中的controller类中的方法。现在来看看是否能够成功访问
6.访问路径:http://localhost:8081/index.html
点击GET之后页面没有反应,控制台报错:
微人事第四天:跨域问题
8081端口的服务器无法访问到8080端口的服务器,可以看到,由于同源策略的限制,请求无法发送成功,这就是所谓的跨域问题。

如何解决跨域问题呢?
我们在控制类方法前加上注解:

@CrossOrigin(origins = "http://localhost:8081")

这个注解表示同意接收来自端口8081服务器的请求

再次访问:http://localhost:8081/index.html 点击get,成功返回字符串。
微人事第四天:跨域问题
这样似乎看起来就能解决跨域问题,但是问题是以后需要在每一个controller类的方法下都需要添加这个注解,那就显得太麻烦了,所以我们需要换种策略。

我们需要通过增添配置类来解决跨域问题:

package org.javaboy.cors1;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //表示所有接口都允许跨域
        registry.addMapping("/**").allowedOrigins("http://localhost:8081")
                .allowedHeaders("*")
                .allowedMethods("*")
                .maxAge(30 * 1000);
    }
}

addMapping表示所有的接口都允许跨域请求
allowedOrigins(“http://localhost:8081”)表示允许来自8081端口服务器的请求
allowedHeaders("")表示允许所有的请求头发出请求
allowedMethods("
")表示允许所有的请求方式发出的请求
现在再来访问路径http://localhost:8081/index.html
点击get,显示:
微人事第四天:跨域问题

相关标签: 微人事课程