AJAX学习笔记8 跨域问题及解决方案

这篇具有很好参考价值的文章主要介绍了AJAX学习笔记8 跨域问题及解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

AJAX学习笔记7 AJAX实现省市联动_biubiubiu0706的博客-CSDN博客

跨域:指一个域名的网页去请求另外一个域名资源.比如百度页面去请求京东页面资源.

同源与不同源三要素:协议,域名,端口

协议一致,域名一致,端口一致.才算是同源.其他一律不同源

新建项目测试:

1.window.open();

window.location.href="";

document.location.href="";

是否可以直接跨域访问.

2.测试<form action="" method="">表单是否可以跨域访问

3.测试引入JS资源是否可以跨域访问:<script type="text/javascript" src=""></script>

4.测试<img src=""/> 图片资源是否可以直接跨域访问

如里把C应用里的servlet拖到D应用里(搞错了)

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

D应用用个简单Servlet接收

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

测试结果上面4中方式跨域没有问题

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

他们的特点好比在url地址栏上直接访问

测试AJAX请求,发起跨域请求行不行

从C应用发送AJAX请求到D应用

前端

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

后端

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

跨域问题的根本原因在于浏览器内存中,两个站点不能共享同一个XMLHttpRequest,这话不一定对,,原因不安全

跨域问题发生的主要原因是浏览器执行了同源策略,因此一个网页的JavaScript代码无法直接访问不同域的资源。这包括使用XMLHttpRequest或Fetch API发送Ajax请求时,无法从一个域请求另一个域的数据。

跨域问题通常指的是浏览器限制了通过JavaScript发起的跨域请求,这些请求虽然发送了,但由于浏览器的同源策略(Same-Origin Policy)而被服务器拒绝

但是在微服务中,很多时候是需要跨域的

下面介绍解决方式:

1.服务器设置响应头,预检请求只是猜测   后面参数是允许的请求源

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

测试   可以访问

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

2.jsonp的方式:(json with padding)带填充的json

注意:jsonp不是一个真正的ajax请求.只不过可以完成局部刷新效果.是一种类似ajax请求的机制

jsonp不是ajax请求,但是可以完成局部刷新效果,并且可以解决跨域问题

jsonp事实上是依赖于

<script src="http://localhost:8081/d/ajax/js/jquery-3.4.1.js"></script>

这段引入JS文件的代码是可以跨域访问的

注意jsonp只支持Get请求跨域

好比C应用引入了D引用的JS

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

继续测试

后端返回方法调用,行不行?

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

测试,可以的

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

返回方法,方法内携带json数据行不行?

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

可以

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

能不能把方法变活,通过

<script type="text/javascript" src="http://localhost:8081/d/jsonp?fun=hi"></script>标签传参数过去

AJAX学习笔记8 跨域问题及解决方案,学习,笔记AJAX学习笔记8 跨域问题及解决方案,学习,笔记AJAX学习笔记8 跨域问题及解决方案,学习,笔记

后端只是传了字符串回去,真正的调用者是浏览器

上面代码可以看出来jsonp其实和ajax没半毛钱关系,ajax是依靠XMLHttpRequest对象的

而jsonp依靠与<script type="text/javascript" src="http://localhost:8081/d/jsonp"></script>达到了和ajax差不多的效果

上面的代码,只是浏览器加载顺序,一步步执行,但是并没有达到局部刷新效果

有没有办法,比如页面上有一个按钮,当点击按钮时候执行

<script type="text/javascript" src="http://localhost:8081/d/jsonp?fun=hi"></script>

去调用后端,返回可以让浏览器执行的JS字符串

来达到页面的局部刷新

AJAX学习笔记8 跨域问题及解决方案,学习,笔记AJAX学习笔记8 跨域问题及解决方案,学习,笔记测试

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

上面这样就不需要点击事件直接加载完就调用了

现在把点击事件加上

AJAX学习笔记8 跨域问题及解决方案,学习,笔记AJAX学习笔记8 跨域问题及解决方案,学习,笔记

点击按钮后

AJAX学习笔记8 跨域问题及解决方案,学习,笔记AJAX学习笔记8 跨域问题及解决方案,学习,笔记

用JQuery封装jsonp

引入JQuery文件  就是别人写的js脚本

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

data:传不传看需求

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

AJAX学习笔记8 跨域问题及解决方案,学习,笔记AJAX学习笔记8 跨域问题及解决方案,学习,笔记http://localhost:8081/d/jsonp2?callback=jQuery34105755191968251865_1693966302334&username=HI&_=1693966302335

callback说明是个回调函数

callback=jQuery34105755191968251865_1693966302334 是JQuery加上去的

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

3.代理机制(HttpClient)

  • 使用Java程序怎么去发送get/post请求呢?【GET和POST请求就是HTTP请求。】

    • 第一种方案:使用JDK内置的API(java.net.URL.....),这些API是可以发送HTTP请求的。(比较麻烦)

    • 第二种方案:使用第三方的开源组件,比如:apache的httpclient组件。(httpclient组件是开源免费的,可以直接用)

  • 在java程序中,使用httpclient组件可以发送http请求。

    • 对于httpclient组件的代码,大家目前可以不进行深入的研究,可以从网上直接搜。然后粘贴过来,改一改,看看能不能完成发送get和post请求。

    • 使用httpclient组件,需要先将这个组件相关的jar包引入到项目当中。

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

引入jar包

AJAX学习笔记8 跨域问题及解决方案,学习,笔记




import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @author hrui
 * @date 2023/9/6 14:03
 */
@WebServlet("/")
public class AServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    public static void main(String[] args) throws IOException {
        //使用Java代码发送HTTP get请求
        String url="http://localhost:8081/d/b";
        HttpGet httpGet=new HttpGet(url);

        //设置响应类型"application/x-www-form-urlencoded"      "application/json"
        httpGet.setHeader("Content-type","application/x-www-form-urlencoded");
        System.out.println("调用URL:"+httpGet.getURI());

        //httpClient实例化
        CloseableHttpClient aDefault = HttpClients.createDefault();
        //执行请求并获取返回
        //CloseableHttpResponse response = aDefault.execute(httpGet);
        HttpResponse response = aDefault.execute(httpGet);

        System.out.println("返回的状态码:"+response.getStatusLine());
        HttpEntity entity = response.getEntity();

        //显示结果
        BufferedReader reader=new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
        String line=null;
        StringBuffer stringBuffer=new StringBuffer();
        while((line=reader.readLine())!=null){
            stringBuffer.append(line);
        }
        System.out.println("服务器响应的数据:"+stringBuffer);
        reader.close();

        aDefault.close();

    }
}

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

那么就是说C应用的资源页面发起访问C应用的AJAX请求,然后让C应用的后端访问D应用的后端且返回数据是可行的

上面讲的是原理过程

实际使用的代理机制

C应用前端访问C应用后端

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

C应用后端访问D应用后端

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

在D应用建个目标Servlet

AJAX学习笔记8 跨域问题及解决方案,学习,笔记

4.Nginx反向代理,解决AJAX跨域问题

nginx反向代理中也是使用了这种代理机制来完成AJAX的跨域,实现起来非常简单,只要修改一个nginx的配置即可。

要解决通过Nginx处理Ajax请求的跨域问题,可以使用Nginx的配置来设置CORS(跨域资源共享)头信息,以允许跨域请求。以下是一些常见的方法:

  1. 使用add_header指令

    在Nginx配置中,您可以使用add_header指令来添加CORS头信息。以下是一个示例配置:AJAX学习笔记8 跨域问题及解决方案,学习,笔记

  2. 这个配置允许来自任何来源(*)的跨域请求,并支持常见的HTTP方法(GET、POST、OPTIONS)。还定义了其他CORS相关的头信息。

  3. 使用Nginx的proxy_pass指令

    如果您的Nginx服务器用于代理后端API服务器,您也可以在proxy_pass指令中包含CORS头信息。以下是一个示例配置:

  4. 这个配置允许代理后端服务器,并添加CORS头信息,以便处理跨域请求。

  5. 请注意,这些示例配置中的Access-Control-Allow-Origin头信息设置为*,这意味着允许来自任何来源的请求。根据您的需求,您可以将其设置为特定的域名或IP地址。此外,还可以根据需要自定义其他CORS头信息。

    在配置Nginx之后,确保重新加载Nginx配置,以使更改生效。这可以通过运行nginx -s reload来完成。

    这些是解决通过Nginx处理Ajax请求的跨域问题的一些方法。根据您的具体需求和架构,您可以选择适合您情况的方法。文章来源地址https://www.toymoban.com/news/detail-705268.html

到了这里,关于AJAX学习笔记8 跨域问题及解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • geoserver跨域问题多种解决方案

    geoserver发布服务完成之后,很重要的一个应用场景是前端服务调用,来展示服务数据,那么很可能遇到一个跨域问题,今天我们分享一下跨越问题的多种解决方案,来适用不同需求的业务场景。 一、nginx服务均衡策略 如果你的项目正在使用nginx,那么很简单操作,在conf/ngin

    2024年02月03日
    浏览(46)
  • html前端跨域问题的解决方案

    前言: 在前端发出Ajax请求的时候,有时候会产生跨域问题,报错如下: Access to XMLHttpRequest at ‘http://127.0.0.1/api/post’ from origin ‘null’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. 针对以上问题,本文提供两种解决方案,CORS中间件和

    2023年04月22日
    浏览(70)
  • SpringBoot 解决跨域问题的 5 种方案!

    供学习使用 SpringBoot 解决跨域问题的 5 种方案! 跨域问题指的是不同站点之间,使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。但这个保护机制也带来了新的问题,它的问题是给不同站点之间

    2024年02月08日
    浏览(28)
  • 前端笔记 ---- Chrome 浏览器不能跨域访问解决方案

    1. 需求场景 Chrome 浏览器开发 H5 进行接口联调时,浏览器不允许跨域访问; 想通过浏览器设置,不使用代理等,浏览器可以进行跨域访问。 2. 报错图片 3. 解决方案 3.1 获取Chrome 浏览器安装位置 3.2 设置允许跨域和不验证证书 3.3 cmd 执行设置命令 3.4 组成完整命令 3.5 cmd 运行命

    2024年02月15日
    浏览(41)
  • 【uniapp】uni.request请求跨域问题解决方案

    例如,运行H5页面,请求一个地址资源,如果不是本站地址,浏览器就会报跨域错误,这样访问受限 例如,项目代码里是这样写的,运行H5测试 因为 https://gitcode.net 不是本站地址,根据浏览器同源策略,是会报跨域错误, 打开项目的 manifest.json 文件,以源码视图查看,添加以

    2024年02月05日
    浏览(33)
  • Spring Boot 解决跨域问题的 5种方案

     跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。 在请求时,如果出现了以下情况中的任意一种,那么它就是跨域请求: 协议不同,如 http 和 https; 域名不同; 端口不同。 也就是说, 即使域名相同,如果一个使用的是

    2024年02月15日
    浏览(33)
  • 分享后端解决跨域问题的三种方案

    跨源资源共享( CORS——Cross-Origin Resource Sharing ,跨源资源共享,或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它源(域、协议或端口),使得浏览器允许这些源访问加载自己的资源。跨源资源共享还通过一种机制来

    2024年02月02日
    浏览(50)
  • 跨域问题踩坑记录——附多种报错详细解决方案

    跨域是出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,当一个请求url的 协议、域名、端口 三者之间任意一个与当前页面url不同即为跨域。 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的

    2024年02月04日
    浏览(35)
  • 最新版本chrome浏览器出现的跨域问题及解决方案

    最近将chrome浏览器更新到了最新版本 ,在个别网站上出现了跨域访问问题。 目录 解决办法: (1)增加参数配置代码 (2)重新打开浏览器 在桌面快捷方式中右键》属性》快捷方式中的目标后面加入以下参数配置代码 注意:其中chrome.exe与--disable之间有一个空格 然后重新打

    2024年02月06日
    浏览(40)
  • 前后端分离项目跨域问题No ‘Access-Control-Allow-Origin‘解决方案

    一.问题背景 前后端分离项目跨域问题,浏览器控制台报错: No \\\'Access-Control-Allow-Origin\\\' header is present on the requested resource. 请求方法为OPTIONS,状态值为302或403。 本文解决常见的CORS跨域问题,以及,集成CAS 5.3单点登录内嵌页面时,发送复杂请求产生的跨域问题。 二.解决方案

    2024年02月02日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包