代码编织梦想

概述

在浏览器端进行 Ajax 请求时会出现跨域问题,那么什么是跨域,如何解决跨域呢?先看浏览器端出现跨域问题的现象,如下图所示
在这里插入图片描述

什么是跨域问题?

跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对 JavaScript 施加的安全限制。

什么是同源?

所谓同源是指,域名,协议,端口均相同

  • http://www.adozoo.com --> http://admin.adozoo.com 跨域
  • http://www.adozoo.com --> http://www.adozoo.com 非跨域
  • http://www.adozoo.com --> http://www.adozoo.com:8080 跨域
  • http://www.adozoo.com --> https://www.adozoo.com 跨域

如何解决跨域问题?

使用 CORS(跨资源共享)解决跨域问题

CORS 是一个 W3C 标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出 XMLHttpRequest 请求,从而克服了 AJAX 只能同源使用的限制。

CORS 需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE 浏览器不能低于 IE10。整个 CORS 通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS 通信与同源的 AJAX 通信没有差别,代码完全一样。浏览器一旦发现 AJAX 请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现 CORS 通信的关键是服务器。只要服务器实现了 CORS 接口,就可以跨源通信(在 header 中设置:Access-Control-Allow-Origin

使用 JSONP 解决跨域问题

JSONP(JSON with Padding)是 JSON 的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与 server2.example.com 的服务器沟通,而 HTML 的 <script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的 JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析(需要目标服务器配合一个 callback 函数)。

CORS 与 JSONP 的比较

CORS 与 JSONP 的使用目的相同,但是比 JSONP 更强大。

JSONP 只支持 GET 请求,CORS 支持所有类型的 HTTP 请求。JSONP 的优势在于支持老式浏览器,以及可以向不支持 CORS 的网站请求数据。

使用 Nginx 反向代理解决跨域问题

以上跨域问题解决方案都需要服务器支持,当服务器无法设置 header 或提供 callback 时我们就可以采用 Nginx 反向代理的方式解决跨域问题。

以下为文件上传的跨域配置方案:

user  nginx;
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 upload.myshop.com;
        add_header 'Access-Control-Allow-Origin'  '*';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
        location / {
            proxy_pass  http://192.168.0.104:8888;
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin  *;
                add_header Access-Control-Allow-Headers X-Requested-With;
                add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,PATCH,OPTIONS;
                # 解决假请求问题,如果是简单请求则没有这个问题,但这里是上传文件,首次请求为 OPTIONS 方式,实际请求为 POST 方式
                # Provisional headers are shown.
                # Request header field Cache-Control is not allowed by Access-Control-Allow-Headers in preflight response.
                add_header Access-Control-Allow-Headers DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range;
                return 200;
            }
        }
    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_38316561/article/details/111100529

SpringBoot如何利用Actuator来监控应用?-爱代码爱编程

文章目录 Actuator是什么?快速开始引入依赖yml与自动配置主程序类测试Endpoints官方列举的所有端点列表启动端点暴露端点配置端点发现页面跨域支持实现一个定义的端点Health端点设置何时显示信息设置顺序设置响应码自定义健康信息源码下载参考阅读 Actuator是什么? 官网:Spring Boot Actuator: Pr

Java课堂篇11_集合小练习(多对象放入Set集合、Set、List、Array互转、按照要求对象元素进行排序、按name属性创建Map、Map转Properties、Properties写入磁盘)-爱代码爱编程

一、要求 1:首先将3猴子3狗熊3鸭子放到集合里 2:转成list,然后排序,先猴子再狗熊然后鸭子,同类的先类别再名字最后年龄, 3:按名字建索引 map key value list 4:map 存盘 二、实现 最后存盘效果图 重点是: 设计类之间的关系,重写hashCode、equals、toString等方法实现排序需求需要实现Compa

Java第三周学习知识点总结-爱代码爱编程

Java第三周学习知识点总结 前言:本周学习了Java中的接口、多态、异常和集合等知识点。知识点不多,但每一点都很重要和深奥。 接口 在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的

javaweb基础打卡20-爱代码爱编程

JSP:java服务器端页面 1.指令: 1.作用:用于配置JSP页面,导入资源文件 2.格式: <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %> 3.分类: 1.page:配置JSP页面的 1.contentType:等同于response.setContentType() 1.设置响应体的

hibernatetemplate实现分页查询-爱代码爱编程

hibernatetemplate实现分页查询 今天用hibernateTemplate.findByCriteria()试着进行了分页查询,网上都说采用接口 org.springframework.orm.hibernate3.HibernateCallback来做,有会的小伙伴可以告诉我我写的和他有啥优点和缺点吗? @SuppressWarnin

手动实现CAS 思想之 AtomicInteger 自增原理(十一)-爱代码爱编程

1、手动实现CAS 思想之自增原理: public class HalfAtomicInt { private static AtomicInteger atomicI = new AtomicInteger(0); /*CAS递增方法实现*/ public void increament() { for (;

Intent的数据传递-爱代码爱编程

Intent的数据传递类型分为两类: 1.第一种的向下一个activity传递数据 (1)调用Intent的构造方法传activity名: Intent intent = new Intent(MainActivity.this, Thirdctivity.class); intent.putExtra("name", "zhansan");

2020年下半年1+X Web前端开发(中级)实操考试模拟试题一(附答案)-爱代码爱编程

传送门教育部:职业教育将启动“1+X”证书制度改革职业教育改革1+X证书制度试点启动1+X成绩/证书查询入口 文章目录 试题一(每空 2 分,共 30 分)试题一答案试题二(30分)试题二答案试题三(每空 2 分,共 20 分)试题三答案试题四(每空 2 分,共 20 分)试题四答案 试题一(每空 2 分,共 30 分) 阅

动态添加删除Tab选项卡-爱代码爱编程

效果图: html: <div class="tabbable"> <ul class="nav nav-tabs" id="myTab"> <li class="active show" id="compose1-li"> <a data-toggle="tab

AdminLte3改造为:单iframe,多级动态json菜单-爱代码爱编程

一、下载代码 https://gitee.com/zhou-kang/admin-lte3-i-frame-json_menus 二、运行index.html 三、核心文件menu.js menu.js中定义了json格式的菜单,并将json转为adminLte的菜单html,可根据需要改在为动态菜单。 pages/test/leaf*.ht

用 canvas.toDataURL() 将图片转为Base64编码时避免跨域报错的方法【避坑】-爱代码爱编程

用 canvas.toDataURL() 将图片转为Base64编码时避免跨域报错的方法【避坑】 梗概 本文主要介绍canvas.toDataURL()将图片转为Base64编码时避免跨域的两种方法: 1、搭建服务器,将HTML文件和图片挂在服务器上使两者位于同一域下(较麻烦); 2、用 URL.createObjectURL() 方法创建一个指向

bootstrap-爱代码爱编程

bootstrap简介 1)bootstrap由@mdo 和 @fat 在Twitter工作时创建,Bootstrap使用 LESS CSS 并用 Node 编译,托管在 GitHub 上,方便大家使用这一框架构建更好的web应用。 2)Bootstrap不光为了看起来好看,而且在现代的桌面浏览器上有极佳的表现(包括IE7!)。在平板电脑和智能手机上面