跨域问题解决方案

article/2025/9/20 6:57:43

跨域问题产生的前提条件

  • 必须要有浏览器,没有浏览器,是不存在跨域问题。
  • 浏览器为了安全问题,限制了跨域访问,不允许跨域请求资源。

跨域

  • 浏览器从一个域名的网页去请求另一个域名的资源,域名、端口、协议有任何一个不同,都被当作是不同的域,都是跨域。
  • 跨域是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。
  • 域名不同:
    • 主域名不同:http://www.baidu.com/index.html跟http://www.csdn.com/test.js
    • 子域名不同:http://www.111.baidu.com/index.html跟http://www.222.baidu.com/test.js
    • 域名和域名IP:http://www.baidu.com/index.html跟http://180.179.122.42/test.js
  • 协议不同:http://www.baidu.com:8080/index.html跟https://www.baidu.com:8080/test.js
  • 端口不同:http://www.baidu.com:8080/index.html跟http://www.baidu.com:8081/test.js
  • 注意:
    • 如果是端口和协议的不同,造成的跨域问题,前端是无能为力的,只能通过后台解决。
    • 在跨域问题上,仅仅是通过URL的首部识别,而不会根据域名对应的IP地址是否相同来判断,因此localhost和127.0.0.1都是指向本机,也属于跨域。
    • URL的首部:协议、域名、端口必须匹配。

跨域限制行为

  • 无法读取非同源网页的Cookie、LocalStorage和IndexedDB。
  • 无法接触非同源网页的DOM。
  • 无法向非同源地址发送Ajax请求,可以发送,但是浏览器会拒绝接受响应。

解决跨域问题的方案

添加响应头

例子:http://127.0.0.1:8081请求http://127.0.0.1:8082/user

  • 在被请求的页面控制器中添加响应头。
response.addHeader("Access-Control-Allow-Origin","允许请求该页面资源的地址")
response.addHeader("Access-Control-Allow-Origin","http://127.0.0.1:8081")
  •  原来是发送一个请求,现在会发送两个请求,一个是option类型的预检请求,用于询问服务器是否支持当前页面进行跨域,如果支持,再发送第二个get请求。
  • 设置预检请求的时间,在时间范围内,第一次请求,需要发送预检请求,之后不用再发送预检请求,可以直接发送get请求。如果超过了预检请求的时间,则请求时会再次发送两个请求。
response.addHeader("Access-Control-Max-Age","预检请求时间,单位秒")
  • 设置允许跨域的方法
response.addHeader("Access-Control-Allow-Method","get或者post")
  • SpringBoot中可以使用注解,在控制器的方法上添加@CrossOrigin注解。
@CrocsOrigin(origins={"允许请求资源的地址"})

手写Java反向代理

  •  通过一个代理控制器,拦截所有请求该服务器的/aip/**请求,使用RestTemplate,代理到8082服务器,进行访问,将结果响应回请求地址,再响应给前端。

Nginx反向代理

  • 在nginx.conf文件中,配置一个反向代理路径,例如所有访问/api的请求,进行代理。
server{listen 8080;server_name localhost;location / {root html;index index.html;}location /api {proxy_pass http://127.0.0.1:8082;}
}
  •  Nginx是一个静态服务器,可以存储静态页面,Nginx中的静态页面请求的是Nginx的地址,请求页面,访问的是Nginx自己的服务器,Nginx服务器再代理到另一个服务器。

Jsonp

  • <script src=""></script>标签支持跨域,可以通过<script src="资源地址"></script>进行跨域,拿到返回的结果。
  • 只支持Get请求,不支持Post请求。

http://chatgpt.dhexx.cn/article/DosereAZ.shtml

相关文章

跨域理解与解决方案

一 、跨域是啥 为啥会发生&#xff1f; 跨域本质是浏览器基于同源策略的一种安全手段&#xff0c;是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能&#xff0c;如果缺少了同源策略&#xff0c;则浏览器的正常功能可能都会受到影响。可以说 Web 是构建在同源策略基础…

Vue中的跨域解决方案

前言 跨域是因为浏览器存在对不同源页面数据接收的限制。这种限制就是浏览器的同源策略。 同源策略是浏览器的安全机制&#xff0c;跨域的原理就是通过各种方式避开浏览器的安全机制 使用 在项目开发时&#xff0c;对跨域的概念仅限于了解&#xff0c;所以没有注重过程&#xf…

Vue跨域解决方案

文章目录 前言一、跨域是什么&#xff1f;二、解决跨域的办法 前言 跨域错误信息 Access to XMLHttpRequest at ‘http://192.168.2.92:3000/api/b/home’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: Response to preflight request doesn’t …

跨域的几种解决方案(详细)

跨域的几种解决方案 1.什么是跨域2.演示用axios请求网易新闻地址&#xff0c;发现跨域出错3.解决跨域方式3.1 jsonp方式3.2 cors方式3.3 proxy代理转发 1.什么是跨域 .网页所在url的协议、域名、端口号&#xff0c;和Ajax请求url的协议、域名、端口号有一个对应不上&#xff0…

跨域9大解决方案(超详细) 总结

前面的话 我们经常听到跨域这词&#xff0c;这是由于浏览器同源策略限制的一类请求场景。这样做的目的使得 浏览器不容易受到攻击。 推荐文章&#xff1a;九种跨域方式实现原理&#xff08;完整版&#xff09; 什么是同源策略&#xff1f; 同源策略&#xff08;Same origin…

前端跨域解决方案

文章目录 注意&#xff0c;本文已迁移 1.同源政策2.跨域解决方案2.1 CORS普通跨域请求&#xff1a;只需服务端设置Access-Control-Allow-Origin即可携带cookie跨域请求&#xff1a;前后端都需设置 2.2 postMessage跨域2.3 JSONP原理缺点数据格式jsonp跨域实现 2.4 WebSocket属性…

解决跨域的三种方案

解决跨域的三种方案 到目前为止&#xff0c;我们编写的 GET 和 POST 接口&#xff0c;存在一个很严重的问题&#xff1a;不支持跨域请求 解决接口跨域问题的方案主要有三种 CORS (主流的解决方案&#xff0c;推荐使用) 代理 (推荐使用) JSONP (有缺陷的解决方案&#xff1a…

跨域的五种解决方案详解

1.跨域解决方案一:cors技术 CORS :全称cross origin resource share &#xff08;资源共享&#xff09; 工作原理&#xff1a; 服务器 在返回响应报文的时候&#xff0c;在响应头中 设置一个允许的header res.setHeader(‘Access-Control-Allow-Origin’, ‘*’) CORS :全称…

Java中parseInt用法(double类似)

1.将字符直接解析为十进制数进行输出 2.如果方法有两个参数&#xff0c; 使用第二个参数指定的基数&#xff0c;将字符串参数解析为有符号的10进制整数。&#xff08;所谓指定基数&#xff1a;就是将字符串指定为2&#xff0c;8&#xff0c;16等进制数&#xff0c;然后用解析为…

javascript:parseInt用法,特殊用法,进制转换

parseInt( string,radix ) 一、功能&#xff1a; 除了我们众所周知的字符串转换为整数以外&#xff0c;还涉及到进制问题&#xff1a; 将 [ 指定进制的 ] 字符串转换为十进制整数型 用汉语翻一下这个方法&#xff1a; 二、参数&#xff1a; 1、string: 要解析的字符串&a…

前端JS字符串转数值 Number和parseInt用法

Number() 只包含数值的字符串字符串为空则为0 parseInt() 字符串不能为空字符串第一个必须为数值从第一个数值开始取&#xff0c;到最后一个连续数值结束

java中Integer.parseInt用法详细分析(全)

目录 前言函数讲解 前言 将数字字符串转化成原生整型数据 属于java.lang.Integer 是原生类型整型的包裹类 函数讲解 1.parseInt(String s) 将字符串s转换为十进制的数字&#xff0c;默认为十进制 public static void main(String[] args) {int numInteger.parseInt("10…

parseInt用法

MDN: 从给定的字符串中解析出的一个整数。 代码&#xff1a; <script>var aparseInt("100px");console.log("a:"a" type:"typeof(a));</script>效果&#xff1a;

parseInt鲜为人知的用法

用法一&#xff1a;将小数转换成整数 var float_num 3.14;float_num parseInt(float_num);console.log(float_num);输出结果&#xff1a; 用法二&#xff1a;以数字开头的字符变量转换成整数 var str_num 3.14string;str_num parseInt(str_num);console.log(str_num);输出…

javax.servlet.http.HttpServletRequest错误

javax.servlet.http.HttpServletRequest错误 javax这个api出错 问题分析&#xff1a;javax.api找不到。 解决方案&#xff1a; 方案一&#xff1a; 可以再maven的pom.xml文件中导入方案二&#xff1a; idea没有导入tomcat下的lib目录下的api,我们手动导入就可以。 步骤如下&a…

java: 程序包javax.validation不存在

之前&#xff0c;有位同学反馈说&#xff0c;在运行newbee-mall-api项目时遇到了下面这个问题&#xff0c;无法正常编译项目&#xff0c;错误截图如下&#xff1a; 看了一下应该是NotEmpty、Valid这几个验证注解引起的&#xff0c;因为这几个注解都是定义在javax.validation包…

maven install 时提示程序包javax.crypto不存在

maven install 时提示程序包javax.crypto不存在 大家好&#xff0c;我是酷酷的韩~ 一.maven install报错原因 javax.crypto是在jdk的jre\lib目录下的,需要在编译的时候引入jdk的rt.jar包和jce.jar包。 二.解决办法 <build><plugins><plugin><groupId&…

javax.crypto.AEADBadTagException: Tag mismatch 的解决办法

问题概述 关于这个问题&#xff0c;博主是在微信支付开发与配置过程中遇到的&#xff0c;在使用工具 “ CertificateDownloader-1.1.jar ” 生成平台证书时&#xff0c;报&#xff1a;“ javax.crypto.AEADBadTagException: Tag mismatch! ” ,提示标签不匹配&#xff0c; 如下…

java javax.servlet_java.lang.NoClassDefFoundError: javax/servlet/ServletOutputStream 报错解决

报错的方法栈 在ssm中写了一个 utils 类&#xff0c;定义了main方法测试和查看工具实际数据 运行main方法时报错了&#xff0c;之前都没错&#xff0c;莫名其妙报了错 java.lang.NoClassDefFoundError: javax/servlet/ServletOutputStream at java.lang.Class.getDeclaredMetho…

javax 和hibernate 的NotBlank

问题&#xff1a;hibernate版本在5 的时候&#xff0c;如果你用了 import javax.validation.constraints.NotBlank; 在校验的时会报错 HV000030: No validator could be found for constraint javax.validation.constraints.NotBlank validating type java.lang.String. Chec…