news 2026/4/16 23:58:48

跨域的五种解决方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
跨域的五种解决方案

跟多介绍可参考:
跨域的五种解决方案笔记和相关资料下载

1. 什么是跨域

浏览器不允许执行其他网站的脚步(ajax),浏览器的同源策略造成的;
例如:发起ajax请求时如果IP、端口、协议任一不同,则都属于跨域。

例如以下案例中,A网站需要请求B网站接口:

A网站B网站是否跨域说明
http://192.162.1.1:8080http://192.162.2.2:8080存在跨域IP不同
http://192.162.1.1:8080http://192.162.1.1:8081存在跨域端口不同
http://192.162.1.1:8080https://192.162.1.1:8080存在跨域协议不同
http://192.162.1.1:8080http://192.162.1.1:8080不存在跨域(协议、ip、端口)全部相同

2. 演示跨域问题

步骤:
首先在右上角下载本章节相关资料;

  1. 将demo.html 放入Nginx的html目录中_(默认已经放进去了)_,双击nginx.exe启动Nginx,–启动Nginx
  2. 运行jar包java -jar kexuekt01.jar, 或通过idea打开kexuekt01项目,– 启动项目
  3. 浏览器访问:http://127.0.0.1/demo.html– 看效果
    F12打开浏览器控制台查看跨域error错误信息`:

重要知识点:存在跨域时Java接口是可以正常进行业务处理的,只是浏览器不能接收后台返回的数据,并在图 1浏览器控制台输出的跨域错误。

3. 解决跨域的五种方法

  1. jsonp
  2. 内部HttpClient远程调用
  3. nginx反向代理
  4. 设置响应头允许跨域 response.setHeader(“Access-Control-Allow-Origin”, “*”);
  5. SpringBoot注解@CrossOrigin

3.1 Jsonp解决跨域演示

前端代码
$.ajax({type:"get",dataType:"jsonp",jsonp:"callback",//请求中重写回调函数的名字url:"http://127.0.0.1:8080/kexue/user",success:function(data){alert(data.response);}},'json');
后台代码
  1. 后台需要接收的jsonp:"callback"中的"callback"参数,
  2. 返回参数格式必须为:callback({object});
@RequestMapping("/kexue/user")publicStringdemo(Stringcallback){JSONObjectobj=JSONUtil.createObj();obj.put("code",200);obj.put("response","调用成功");// 返回格式:callback({object});returncallback+"("+obj+")";}
说明

Jsonp的使用方式较为麻烦,解决跨域一般不会使用该方法。

3.2 内部HttpClient远程调用

启动两个后台

端口1:8080(自己公司的项目解决了跨域问题)
端口2:8081(模拟第三方项目接口,没有解决跨域问题)

8080端口项目
@CrossOrigin // 跨域注解 @RestController public class Demo1 { @RequestMapping("/kexue/user") public JSONObject demo() { String body = HttpRequest.get("127.0.0.1:8081/kexue/user2").execute().body(); JSONObject obj = JSONUtil.parseObj(body); return obj; } }
8081端口项目(第三方接口)
@RequestMapping("/kexue/user2") public JSONObject demo() { JSONObject obj = JSONUtil.createObj(); obj.put("code", 200); obj.put("response", "第三方接口"); return obj; }

注:修改端口号,便于测试 -Dserver.port=8081

说明

HttpClient这种方式适合调用第三方接口。
例如:调用第三方接口时,如果前端直接调用第三方接口会报跨域问题(第三方接口没有解决跨域问题),那么就只能通过后台HttpClient的方式进行调用。

3.3 Nginx反向代理

前端代码
$.ajax({ type:"get", url:"http://127.0.0.1:80/kexue/user", success:function (data) { //请求成功后的处理 alert(data.response); } }, 'json');
后端代码
@RequestMapping("/kexue/user") public JSONObject demo() { JSONObject obj = JSONUtil.createObj(); obj.put("code", 200); obj.put("response", "调用成功"); // 返回格式:callback({object}); return obj; }
nginx.conf
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } #拦截所有以/kexue开头的请求 location /kexue { index proxy_set_header Host $host; index proxy_set_header X-Real-IP $remote_addr; index proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; #后端服务地址 } } }
说明

使用Nginx方向代理的前提是,前端代码(vue)需要和Nginx服务在一台物理机上;如果满足以上条件,就优先考虑通过Nginx反向代理来解决跨域问题。

3.4 设置响应头允许跨域

前端代码
$.ajax({ type:"get", url:"http://127.0.0.1:8080/kexue/user", success:function (data) { //请求成功后的处理 alert(data.response); } }, 'json');
后端代码
@RequestMapping("/kexue/user") public JSONObject demo(HttpServletResponse response) { JSONObject obj = JSONUtil.createObj(); obj.put("code", 200); obj.put("response", "调用成功"); // *允许所有网站跨域 response.setHeader("Access-Control-Allow-Origin", "*"); return obj; }
说明

通常都是在拦截器中来配置“设置响应头允许跨域”。

3.5 @CrossOrigin注解

前端代码
$.ajax({ type:"get", url:"http://127.0.0.1:8080/kexue/user", success:function (data) { //请求成功后的处理 alert(data.response); } }, 'json');
后端代码
@CrossOrigin // 跨域注解 @RestController public class Demo1 { @RequestMapping("/kexue/user") public JSONObject demo() { JSONObject obj = JSONUtil.createObj(); obj.put("code", 200); obj.put("response", "调用成功"); return obj; } }
说明

@CrossOrigin注解底层通过Spring的拦截器功能往response里添加 Access-Control-Allow-Origin等响应头信息。
response.setHeader(“Access-Control-Allow-Origin”, “*”);

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈🌈 🌈🌈 🌈

个人博客首页 祁_z

🍎原创不易,感觉对自己有用的话就❤️点赞👉收藏💬评论把。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 23:58:45

Element UI 栅格系统实战:从基础布局到响应式设计

1. 初识Element UI栅格系统 第一次接触Element UI的栅格系统时,我正负责一个后台管理系统的前端重构。当时项目用的是传统浮动布局,代码里到处都是float:left和clear:both,维护起来特别头疼。直到同事推荐了Element UI的el-row和el-col组件&…

作者头像 李华
网站建设 2026/4/16 23:58:31

【鼠标手势】Mouselnc使用笔记/Mouselnc+AHK=无敌好用/鼠标手势分享

当鼠标手势Mouselnk遇上AHK真的太好用了,让win的体验直接更上一层楼。AHK负责改键改功能,Mouselnk负责输出。首先介绍的是Mouselnk的附带功能,这是在众多手势软件中选它的原因,再分享个人常用的手势。Mouselnk的附带功能 边缘滚动…

作者头像 李华
网站建设 2026/4/16 23:58:06

LDO噪声和电源抑制比PSRR

目录: 一、LDO噪声和PSRR 1、PSRR的计算 2、PSRR与输出噪声的区别 3、PSRR的影响因素 二、LDO噪声类型 三、LDO数据表中的噪声规格 四、哪种规格适合自己的应用 1、LDO为压控振荡器(VCO)供电 2、LDO为ADC或DAC供电 五、如何降低LDO噪声

作者头像 李华
网站建设 2026/4/16 23:55:14

Vue项目里用腾讯地图API把地址转成经纬度,我踩过的坑你别再踩了

Vue项目实战:腾讯地图地址解析避坑指南 第一次在Vue项目里集成腾讯地图API时,我天真地以为这不过是个简单的接口调用。直到连续三个晚上被各种报错折磨得怀疑人生,才意识到每个环节都藏着意想不到的坑。本文将分享我从零开始实现地址转经纬度…

作者头像 李华