UD在线学习网站开发日记-------解决跨域问题

一、为什么会出现跨域问题呢?

首先了解一下同源策略(SOP),它是由Netscape公司在1995年引入浏览器的。同源策略是浏览器中最基本最重要的安全功能,如果缺少了同源策略,我们的浏览器就会很容易受到XSS、CSFR等攻击。而所谓的同源策略是指:协议+域名+端口三者相同。
因此,当我们请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。

二、解决跨域问题的方法

1、通过JSONP跨域


通过 script 标签的 src 属性进行跨域请求,如果服务端要响应内容则首先读取请求参数 callback 的值,callback 是一个回调函数的名称,服务端读取 callback 的值后将响应 内容通过调用 callback 函数的方式告诉请求方。
核心思想:网页通过添加一个script元素,向服务器请求 JSON 数据,服务器收到请求后,将数据放在一个指定名字的回调函数的参数位置传回来。

2、添加响应头

cors是跨域资源共享,是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它 origin(域,协议和端口),使得浏览器允许这些 origin 访问加载自己的资源。服务端设置了Access-Control-Allow-Origin就开启了CORS,所以这种方式只要后端实现了CORS,就解决跨域问题。
 //允许白名单域名进行跨域调用
 config.addAllowedOrigin("*");
 //允许跨域发送 cookie
 config.setAllowCredentials(true);
 //放行全部原始头信息
 config.addAllowedHeader("*");
 //允许所有请求方法跨域调用

 config.addAllowedMethod("*");

package com.xuecheng.system.config;
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;
/**
* @description 跨域过虑器
* @author Mr.M
* @date 2022/9/7 11:04
* @version 1.0
*/
@Configuration
public class GlobalCorsConfig {
 /**
 * 允许跨域调用的过滤器
 */
 @Bean
 public CorsFilter corsFilter() {
 CorsConfiguration config = new CorsConfiguration();
 //允许白名单域名进行跨域调用
 config.addAllowedOrigin("*");
 //允许跨越发送 cookie
 config.setAllowCredentials(true);
 //放行全部原始头信息
 config.addAllowedHeader("*");
 //允许所有请求方法跨域调用
 config.addAllowedMethod("*");
 UrlBasedCorsConfigurationSource source = new 
UrlBasedCorsConfigurationSource();
 source.registerCorsConfiguration("/**", config);
 return new CorsFilter(source);
 }
}

此配置类实现了跨域过虑器,在响应头添加 Access-Control-Allow-Origin。

3.Nginx反向代理解决跨域

由于服务端之间没有跨域,浏览器通过 nginx 去访问跨域地址。利用了服务器和服务器之间通信不受浏览器的同源策略的限制