AJAX跨域完全讲解(修订版)

Python 爬虫进阶:解析技术与动态页面爬取实战 本文深入探讨Python爬虫进阶技术,重点介绍了以下核心内容:1.高级解析技术:包括XPath语法与lxml库应用、正则表达式高级匹配以及BeautifulSoup深度解析方法。2.动态页面处理:详细讲解AJAX接口分析和Selenium/Pyppeteer等无头浏览器技术。3.API爬取策略:涵盖RESTful API调用、速率限制处理和分页机制实现。4.数据清洗与存储:展示文本清洗技巧和结构化数据CSV存储方案。文章通过豆瓣图书、知乎话题、京东商品等多个实战案例,配合完整代码演示如何应对复杂网页结构和动 阅读详情

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

AJAX跨域完全讲解

我在收集AJAX面试题的时候其实就已经有过AJAX跨域的问题的了,当时候知道了为什么会存在跨域,以及跨域解决的方案有哪些,今天随着课程的学习,又加深了AJAX跨域的理解,以此记录下来。

640?wx_fmt=png

为什么会发生产生跨域问题?

上面的图也很清晰了,因为浏览器为了安全(同源),本身就限制了。

值得注意的是:跨域的问题是发生在XMLHttpRequest请求的,也就是说,不是XMLHttpRequest请求是不会有跨域问题的

解决跨域问题的思路

明显地,跨域的问题是由于浏览器限制的,是XMLHttpRequest才会发生的,那么我们可以以这个思路去找找解决思路:

640?wx_fmt=png

对于浏览器的问题,可以使用相关的参数进行启动浏览器,是可以解决跨域的问题,但是通用性是极低的,了解即可。

JSONP解决跨域

JSONP是JSON使用的一种补充方式,不是官方的协议。JSONP是一种解决跨域问题的一种协议

JSONP这种解决方案其实现在已经很少用了(复杂一点,需要修改后台代码),但我们可以适当了解一下。

使用步骤

在后端增加一个控制器,继承AbstractJsonpResponseBodyAdvice类,完整代码如下:

@ControllerAdvicepublic class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {    public JsonpAdvice() {        // TODO Auto-generated constructor stub        super("callback2");    }}
public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {

    public JsonpAdvice() {
        // TODO Auto-generated constructor stub
        super("callback2");
    }
}

前端ajax请求:

// 服务器返回的结果var result;$.ajax({    url: base +"/get1",    dataType: "jsonp",    jsonp: "callback2",    //是否需要缓存,如果这里没有配置缓存,那么请求的URL还会有一个参数    cache:true,    success: function(json){        result = json;    }});
var result;

$.ajax({
    url: base +"/get1",
    dataType: "jsonp",
    jsonp: "callback2",

    //是否需要缓存,如果这里没有配置缓存,那么请求的URL还会有一个参数
    cache:true,
    success: function(json){
        result = json;
    }
});

注意的是,前端AJAX的jsonp: "callback2",要和我们的Controllersuper("callback2");是一致的,不然是不会有效的。

JSONP原理是动态创建script来进行请求的:

640?wx_fmt=png

JSONP的弊端:

参考资料:

CORS解决跨域问题

CORS解决跨域问题(也就是我们服务端被调用方解决跨域的思路)

对于CORS是怎么理解的,我就直接摘抄一下:

640?wx_fmt=png

在Java中,我们写下面这个过滤器,就可以完全解决跨域的问题了:

package com.imooc;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.tomcat.util.buf.StringUtils;public class CrosFilter implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {        // TODO Auto-generated method stub    }    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)            throws IOException, ServletException {        // TODO Auto-generated method stub        HttpServletResponse res = (HttpServletResponse) response;        HttpServletRequest req = (HttpServletRequest) request;        //带cookie的时候,origin必须是全匹配,不能使用*        String origin = req.getHeader("Origin");        if (!org.springframework.util.StringUtils.isEmpty(origin)) {            res.addHeader("Access-Control-Allow-Origin", origin);        }        res.addHeader("Access-Control-Allow-Methods", "*");        // 支持所有自定义头和预检命令(非简单请求会有预检命令)        String headers = req.getHeader("Access-Control-Request-Headers");        if (!org.springframework.util.StringUtils.isEmpty(headers)) {            res.addHeader("Access-Control-Allow-Headers", headers);                 }        res.addHeader("Access-Control-Max-Age", "3600");        // enable cookie        res.addHeader("Access-Control-Allow-Credentials", "true");        chain.doFilter(request, response);    }    @Override    public void destroy() {        // TODO Auto-generated method stub    }}

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.tomcat.util.buf.StringUtils;

public class CrosFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException 
{
        // TODO Auto-generated method stub

        HttpServletResponse res = (HttpServletResponse) response;

        HttpServletRequest req = (HttpServletRequest) request;


        //带cookie的时候,origin必须是全匹配,不能使用*
        String origin = req.getHeader("Origin");
        if (!org.springframework.util.StringUtils.isEmpty(origin)) {
            res.addHeader("Access-Control-Allow-Origin", origin);
        }
        res.addHeader("Access-Control-Allow-Methods", "*");

        // 支持所有自定义头和预检命令(非简单请求会有预检命令)
        String headers = req.getHeader("Access-Control-Request-Headers");
        if (!org.springframework.util.StringUtils.isEmpty(headers)) {
            res.addHeader("Access-Control-Allow-Headers", headers);         
        }

        res.addHeader("Access-Control-Max-Age", "3600");
        // enable cookie
        res.addHeader("Access-Control-Allow-Credentials", "true");
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

}

上面提到了非简单请求,那什么是非简单请求呢,可以看下面的图:

640?wx_fmt=png

非简单请求会发出一个预检命令的(当然了,我们上面的Filter已经解决预检命令的问题了):

640?wx_fmt=png

Spring框架解决

如果使用的是Spring框架的话,那就只需要一个注解就能够解决跨域的问题了:@CrossOrigin

HTTP服务器层

我们在的商用开发中,一般请求的过程是这样的:浏览器->HTTP服务器(Nginx,Apache)->应用服务器(Tomcat,Weblogic)

上面编写的Filter、Spring框架都是在应用服务器上解决的,我们也是可以通过HTTP服务器(Nginx,Apache)来进行解决跨域问题的!

640?wx_fmt=png

Nginx我用过,Apache我倒是还没用过,下面就简单记录了Nginx和Apache是如何配置的:

Nginx配置:

640?wx_fmt=png

Apache配置:

640?wx_fmt=png

代理解决跨域问题

在之前的图我们已经看到了,解决跨域的问题可以在“调用方”中来进行解决。

“调用方”解决跨域的问题是这个思路的:让发送出去的请求代理成是本域的

举个例子:

www.zhongfucheng.top是调用方www.zhongfucheng.site是被调用方.zhongfucheng.top是调用方

www.zhongfucheng.site是被调用方

它俩是不同域的,但我们可以在nginx或Apache上进行配置代理:将被调用方www.zhongfucheng.site映射成别的路径

比如,像下面的图,将8080端口的映射成了ajaxServer,当调用方访问ajaxServer路径时,这样的方法在外部看起来就不像是跨域了,像是访问本地(8081端口),但实际访问别的域(8080端口)

640?wx_fmt=png

总结

令我感到最简单的是通过Spring的注解就可以解决跨域的问题了,JSONP的方式已经是很少用的了,因为存在一定的弊端,但了解一下也无妨,毕竟可能面试的时候会问到。当没有用任何框架的时候,写Filter也不麻烦,也只是配置了一下HTTP头信息而已。如果使用Nginx、Apache时,也可以用代理或者配置HTTP头信息都可以解决。看完之后,有没有觉得跨域问题就迎刃而解了。

最后

乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,不妨来关注一下!

640?wx_fmt=jpeg

有帮助?在看!转发!640


Mac电脑本地安装Stable Diffusion小白教程避开所有坑教程 如果出现黄字部分警告,如WARNING: The scripts pip, pip3 and pip3.9 are installed inz‘/usr/local/opt/python@3.9/Frameworks/Python.framework/Versions/3.9/bin’ which is not on PATH)需要将其添加到path。下载pip,输入:curl https://bootstrap.pypa.io/pip/get-pip.py -o get-pip.py。 阅读详情

相关推荐

FPGA_adc采样并通过以太网发送到上位机

本项目使用FPGA-ZYNQ-7020采集8通道ADC数据,通过以太网上传到上位机显示波形PL部分包括数据的获取与处理,数据从PL传递到PSPS部分包括以太网的发送,由PL到PS的中断触发本文章不详细讲解背后原理 但保证每一步足够详细,跟着就能实现。本人FPGA平台 大磊FPGA7020开发板 vivado2020.2 vitis2020.2 匿名上位机公开版

weixin_42304868的博客 5626

ajax跨域,这应该是最全的解决方案了

前言 从刚接触前端开发起,跨域这个词就一直以很高的频率在身边重复出现,一直到现在,已经调试过N个跨域相关的问题了,16年时也整理过一篇相关文章,但是感觉还是差了点什么,于是现在重新梳理了一下。 个人见识有限,如有差错,请多多见谅,欢迎提出issue,另外看到这个标题,请勿喷~ 题纲 关于跨域,有N种类型,本文只专注于ajax请求跨域(,ajax跨域只是属于浏览器"同源策略"中的一部分,其它的还有Cookie跨域iframe跨域,LocalStorage跨域等这里不做介绍),内容大概如下: 什么

洞庭儿女 1万+

【详细】芯片设计全流程(包括每个流程需要用到的工具以及需要参与的工作人员)

一颗芯片的诞生经历了设计、制造和测试(分别对应集成电路产业链的设计业、制造业和封测业),而每一步都包含了复杂的步骤和流程。 图0-1 集成电路产业链 现在,我们重点介绍芯片设计的全流程以及每个流程需要用到的设计工具和需要参与的工作人员。 一、IC设计分类 首先对IC设计的分类做个介绍,如图1-1所示。 图1-1 IC设计分类 如图1-1所示,IC设计可以粗分为数字IC设计和射频/模拟IC设计,数字IC设计又可分为ASIC设计和FPGA/CPLD设计,此外还有一部分IC设计.

qq_36045093的博客 8万+

AJAX跨域

一、什么是AJAX跨域问题、产生AJAX跨域问题的原因 什么是AJAX跨域问题 简单来说,就是前端调用后端服务接口时 如果服务接口不是同一个域,就会产生跨域问题 AJAX跨域场景 前后端分离、服务化的开发模式 前后端开发独立,前端需要大量调用后端接口的场景 只要后端接口不是同一个域,就会产生跨域问题 跨域问题很普遍,解决跨域问题也很重要 AJAX跨域原因 浏览器限制:浏览器安全校验限制 跨域(协议、域名、端口任何一个不一样都会认为是跨域) XHR(XMLHttpRequest)请求 二、

辛聪明的博客 2361

vins-fusion环境配置、安装与测试

本文主要介绍如何搭建vins-fusion的运行环境,以及解决vins-fusion编译运行时遇到的环境冲突问题,并在此基础上实现例程的运行。

qq_52068373的博客 1万+

深入剖析:NAND Flash与SD NAND(贴片式SD卡)存储扇区分配表架构差异与优化策略

本文深入探讨了NAND Flash与SD NAND(贴片式SD卡)在存储技术中的架构差异及其优化策略。NAND Flash作为非易失性存储器,依赖主控芯片进行坏块管理和磨损均衡,而SD NAND则通过内置控制器和标准文件系统(如FAT)简化了存储管理。两者在写入性能、容量扩展和可靠性方面各有优劣,NAND Flash需通过磨损均衡和写入合并优化性能,而SD NAND则通过高容量和高速传输提升效率。文章为嵌入式系统开发者和硬件工程师提供了关于如何根据需求选择并优化存储介质的参考。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1238

详细梳理ajax跨域4种解决方案

为什么需要跨域 跨域这个概念来自一个叫 “同源策略” 的东西。同源策略是浏览器(注意是浏览器,跟通信协议无关)上为了安全考虑实施的非常重要的安全机制。 Ajax默认只能获取到同源的数据,对于非同源的数据,Ajax是获取不到的。

_江屿_ 2502

一文搞懂深度学习:最全神经网络介绍

本文是深度学习系列文章的第二篇,我们将深入探讨各种类型的人工神经网络,探索它们独特的特性和应用。

2402_82802238的博客 2800

ajax跨域方法

为什么80%的码农都做不了架构师?>>> ...

weixin_34008933的博客 720

(超详细)互补格雷码+相移码求解包裹相位(Python实现)

记录实现“互补格雷码+相移码”求解包裹相位的编码过程。也可以叫它“5+4”法,5代表五幅格雷码图像,4代表四步相移法的四张正弦条纹图。

暴雨梨花博客 3万+

AutoSAR系列讲解(深入篇)13.6-闪烁一颗LED灯 6

闪烁一颗LED灯:配置SWC和生成代码

雪云飞星的博客 1万+

Ajax及跨域请求

javaScript实现ajax jquery实现ajax ajax跨域请求 jsonp

YUELEI118的博客 3830

基于STM32设计的智能防盗单车锁_349

本设计基于STM32F103RCT6单片机,研制了一种适用于户外环境的智能防盗单车锁系统。系统集成了GPS定位模块、ADXL345加速度传感器、4G通信模块(Air780E)、OLED显示屏、继电器模拟锁控模块等硬件,通过姿态感知实现车辆异常移动检测,在锁车状态下自动触发蜂鸣器报警并通过短信与APP通知用户。

867

只有ajax会跨域吗_AJAX跨域完全讲解(修订版)

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3yAJAX跨域完全讲解我在收集AJAX面试题的时候其实就已经有过AJAX跨域的问题的了,当时候知道了为什么会存在跨域,以及跨域解决的方案有哪些,今天随着课程的学习,又加深了AJAX跨域的理解,以此记录下来。为什么会发生产生跨域问题?上面的图也很清晰了...

weixin_35921127的博客 445

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ajax servlet怎么接收_AJAX跨域完全讲解(修订版)

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3yAJAX跨域完全讲解我在收集AJAX面试题的时候其实就已经有过AJAX跨域的问题的了,当时候知道了为什么会存在跨域,以及跨域解决的方案有哪些,今天随着课程的学习,又加深了AJAX跨域的理解,以此记录下来。为什么会发生产生跨域问题?上面的图也很清晰了...

weixin_39712969的博客 248

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

(修订版)AJAX入门!

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y一、什么是AjaxAjax(...

3y 504

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

AJAX常见面试题(修订版)

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3yAJAX常见面试题什么是AJ...

3y 349

ajax servlet怎么接收_AJAX常见面试题(修订版)

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3yAJAX常见面试题什么是AJAX,为什么要使用AjaxAJAX是“Asynchronous JavaScript and XML”的缩写。他是指一种创建交互式网页应用的网页开发技术。、客户端与服务器,可以在【不必刷新整个浏览器】的情况下,与服务器进...

weixin_39662142的博客 177

Atitit 代理解决方案proxy solu attilax总结 1. 为什么需要代理 1 1.1. Ajax跨域 1 1.2. Nginx反向代理 1 2. 分类 2 2.1. 普通vs隧道 2

Atitit 代理解决方案proxy solu attilax总结   1. 为什么需要代理 1 1.1. Ajax跨域 1 1.2. Nginx反向代理 1 2. 分类 2 2.1. 普通vs隧道 2 2.2. 正向反向 2 2.3. CGLIB 动态代理 AspectJ静态代理 2 2.4. http代理 socket代理 2 3. 普通代理 2 3.1.1.

attilax的专栏 547

ajax jq 图片上传请求头_(修订版)AJAX入门!

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y一、什么是AjaxAjax(Asynchronous JavaScript and XML) 异步JavaScript和XMLAjax实际上是下面这几种技术的融合:(1)XHTML和CSS的基于标准的表示技术 (2)DOM进行动态显示和交互 (3)...

weixin_36074359的博客 108

前端ajax数据提交到服务器_(修订版)AJAX入门!

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y一、什么是AjaxAjax(Asynchronous JavaScript and XML) 异步JavaScript和XMLAjax实际上是下面这几种技术的融合:(1)XHTML和CSS的基于标准的表示技术 (2)DOM进行动态显示和交互 (3)...

weixin_39930557的博客 171

c语言/iso/javaScript书籍推荐

《指针的编程艺术(第二版)》   “指针”(pointer),这是个让人又爱又难受的主题。常有人说:“指针好难啊,都不知道该怎么学……”。有许多人学到指针时,便裹足不前。基本原因是没有合适的图书来指导学习指针及其相关的问题。   《指针的编程艺术(第二版)》内容精彩无比,除了对c语言的指针有深入的探讨外,同时也对与指针有异曲同工之妙的reference详加讨论。《指针的编程艺术(第二版)》以指

南瓜粥的专栏 753

ASP.NET 推荐书籍

ASP.NET 推荐书籍 1、首先推荐一本ASP.NET MVC的书籍 —— 《Web开发新体验:ASP.NET 3.5 MVC架构与实战》 【点评】:ASP.NET的MVC的书籍本来就不多,非要买的话,就买这本了。你看完之后,告诉我这本书如何?我再来补充点评。 ASP.NET 3.5 MVC框架,是微软今后开发Web应用程序的一个主流技术。初学者学习ASP.NET 3.5 MVC框...

weixin_30808693的博客 292

寒假读书计划!

读书计划:时间:2007年1月22日-------2007年3月28日。总共38天,每天需要花费4个小时。共152个小时。方式:在读书过程中切记一定好做好笔记,哪一章的重点话语和代码示例。做成Word文档或者手写记录。目标:掌握Struts和hibernate的开发,掌握并懂得C++的语法规则。理解.net的开发思想。应该从Java Web的相关书籍开始,C++其次而.net书籍应

水浒轮的专栏 2616

第六章

ASP.NET 推荐书籍 ASP.NET 推荐书籍 1、首先推荐一本ASP.NET MVC的书籍 —— 《Web开发新体验:ASP.NET 3.5 MVC架构与实战》 【点评】:ASP.NET的MVC的书籍本来就不多,非要买的话,就买这本了。你看完之后,告诉我这本书如何?我再来补充点评。 ASP.NET 3.5 MVC框架,是微软今后开发Web应用程序的一个主流技术。...

weixin_30276935的博客 123
上一篇: 【蘑菇街】2020春招实习生内推|送四本JVM书
下一篇: AJAX常见面试题(修订版)
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值