前端开发笔记——Ajax与跨域

简介: AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

Ajax与跨域

一、Ajax

AJAX 是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

  • ajax获取服务器数据条件(同源数据):协议一样,域名相同,端口号相同。
创建步骤

1、创建 XMLHttpRequest 对象以及浏览器适配

var xhr = null;
    if(window.XMLHttpRequest){
        xhr =new XMLHttpRequest();
    }else{
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }

2、 向服务器发送请求

    var params="";
    for (var attr in defaults.data){
        params+=attr+"="+defaults.data[attr]+"&";
    }
    if(params){
        params = params.substring(0,params.length-1);
    }
    if(defaults.type =="get"){
        xhr.send(null);
    }else if(defaults.type =="post"){
        xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        xhr.send(params);
    }

3、 服务器 响应

//获得字符串形式的响应数据。
result=xhr.responseXML

//获得 XML 形式的响应数据
result=xhr.responseText;
result=JSON.parse(result)

4、onreadystatechange 事件

readyState的值分别代表:

  • 0: 请求未初始化
  • 1: 服务器连接已建立
  • 2: 请求已接收
  • 3: 请求处理中
  • 4: 请求已完成,且响应已就绪
xhr.onreadystatechange = function(){
            if(xhr.readyState ==4){
                if(xhr.status == 200){
                    var result=null;
                    if(defaults.dataType =="json"){
                        result=xhr.responseText;
                        result=JSON.parse(result);
                    }else if(defaults.dataType =="xml"){
                        result=xhr.responseXML;
                    }else{
                        result=xhr.responseText;
                    }
                    defaults.success(result)
                }
            }
        };
Tips
  • ie6以下浏览器需要兼容
  • json格式 json.parse()转换为对象
  • xml数据格式的解析example

二、跨域

产生跨域的原因:当一个请求 url 的协议、域名、端口三者之间任意一个与当前页面 url 不同。

  • 跨域的本质:其实就是服务器返回了一个方法调用,这个方法是我们事先定义好的,而方法
    中的参数就是我们想要的数据
解决跨域的方法一(jsonp):
  • JSONP :特点就是简单适用,兼容性好(兼容低版本IE),缺点是只支持get请求,不支持post请求。
  • js实现跨域请求
function myAjax4Across(obj){
    var defaults={
        type:"get",
        url:"#",
        data:{},
        success:function(data){},
        jsonp:"callback",
        jsonpCallback:"haha"
    };
    
    for(var key in obj){
        defaults[key]=obj[key];
    }
    
    var params="";
    for(var attr in defaults.data){
        params+=attr+"="+defaults.data[attr]+"&";
    }
    if(params){
        params = params.substring(0,params.length-1);
        defaults.url+="?"+params;
    }
    defaults.url += "&"+defaults.jsonp+"="+defaults.jsonpCallback;
    console.log(defaults.url);
    var script = document.createElement("script");
    script.src=defaults.url;
    
    window[defaults.jsonpCallback] = function(data){
        defaults.success(data);
    }
    
    var head = document.querySelector("head");
    head.appendChild(script);
}
  • JQ实现跨域请求(其中dataType必须为jsonp)

    image-20220515145842511

解决跨域的方法二(前端框架处理(vue)):

src / utils / request.js

// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项,表示请求URL公共部分
  // baseURL: 'http://127.0.0.1:8888/ruoyi',
  baseURL: '/api',
  // changeOrigin: true,
  // 超时
  timeout: 10000
})

vue.config.js

module.exports = {
  devServer: {
    // 自动打开浏览器
    open: true,
    port: 70,
    proxy: {
      // // detail: https://cli.vuejs.org/config/#devserver-proxy
      '/api': {
        target: `http://localhost:8888/ruoyi`,
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  }
}

login.vue

import request from '@/utils/request'
// 获取验证码
export function getCodeImg() {
  return request({
    url: '/captcha/captchaImage?type=math',
    method: 'get'
  })
}

优点:

  • 在浏览器中屏蔽了实际访问后端的 地址,相对安全
  • 后端代码不必要进行额外处理跨域

缺点

  • 在浏览器中看不到后端访问的地址,开发阶段调试不太方便
解决跨域的方法三(SpringBoot后端进行处理):

在 每个 Controller 类上加入 @CrossOrigin 注解

或者

在 Controller的基类中加上 @CrossOrigin 注解然后其他 Controller 类就有了这个 @Controller

优点 :

  • 使用起来简单,直接在Controller类上加 @CrossOrigin 注解即可

缺点:

  • 如果后端技术使用的不是 SpringBoot,后端代码还需要处理跨域问题
  • 浏览器直接访问 后端API,在某种程度上是不太安全的
解决跨域的方法四:

百度:Nginx

三、封装ajax (myutils.js)

function myAjax(obj){
    if(obj.dataType == "jsonp"){
        myAjax4Across(obj);
    }else{
        myAjax4Normal(obj);
    }
}

// 跨域数据
function myAjax4Across(obj){
    // 设置默认参数
    //obj中的属性,覆盖到defaults中的属性
    //1、如果有一些属性只存在obj中,会给defaults中增加属性
    //2、如果一些属性在obj和defaults中都存在,会将defaults中的默认值覆盖
    //3、如果有一些属性只在defaults中存在,在obj中不存在,这时defaults中将保留预定义的属性
    var defaults={
        type:"get",
        url:"#",
        data:{},
        success:function(data){},
        jsonp:"callback",
        jsonpCallback:"haha"
    };
    
    for(var key in obj){
        defaults[key]=obj[key];
    }
    
    var params="";
    for(var attr in defaults.data){
        params+=attr+"="+defaults.data[attr]+"&";
    }
    if(params){
        params = params.substring(0,params.length-1);
        defaults.url+="?"+params;
    }
    defaults.url += "&"+defaults.jsonp+"="+defaults.jsonpCallback;
    console.log(defaults.url);
    var script = document.createElement("script");
    script.src=defaults.url;
    
    window[defaults.jsonpCallback] = function(data){
        defaults.success(data);
    }
    
    var head = document.querySelector("head");
    head.appendChild(script);
}


//同源数据
function myAjax4Normal(obj){
    
    var defaults={
        type:"get",
        url:"#",
        dataType:"json",
        data:{},
        async:true,
        success:function(data){console.log(result);}
    };
    
    for(var key in obj){
        defaults[key]=obj[key];
    }
    var xhr = null;
    if(window.XMLHttpRequest){
        xhr =new XMLHttpRequest();
    }else{
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    //得到params
    var params="";
    for (var attr in defaults.data){
        params+=attr+"="+defaults.data[attr]+"&";
    }
    if(params){
        params = params.substring(0,params.length-1);
    }
    if(defaults.type =="get"){
        xhr.send(null);
    }else if(defaults.type =="post"){
        xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        xhr.send(params);
    }
    
    if(defaults.async){
        xhr.onreadystatechange = function(){
            if(xhr.readyState ==4){
                if(xhr.status == 200){
                    var result=null;
                    if(defaults.dataType =="json"){
                        result=xhr.responseText;
                        result=JSON.parse(result);
                    }else if(defaults.dataType =="xml"){
                        result=xhr.responseXML;
                    }else{
                        result=xhr.responseText;
                    }
                    defaults.success(result)
                }
            }
        };
    }else{
        if(xhr.readyState ==4){
            if(xhr.status == 200){
                var result=null;
                if(defaults.dataType =="json"){
                    result=xhr.responseText;
                    result=JSON.parse(result);
                }else if(defaults.dataType =="xml"){
                    result=xhr.responseXML;
                }else{
                    result=xhr.responseText;
                }
                defaults.success(result)
            }
        }
    }
    
}

博客:fangqc.xyz

相关文章
|
14天前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
|
14天前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
30 0
|
2月前
|
前端开发 API UED
Python后端与前端交互新纪元:AJAX、Fetch API联手,打造极致用户体验!
Python后端与前端交互新纪元:AJAX、Fetch API联手,打造极致用户体验!
77 2
|
13天前
|
前端开发 JavaScript
回顾前端页面发送ajax请求方式
回顾前端页面发送ajax请求方式
33 18
|
14天前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
14天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
14天前
|
机器学习/深度学习 弹性计算 自然语言处理
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。
|
14天前
|
前端开发 算法 测试技术
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
本文对比测试了通义千文、文心一言、智谱和讯飞等多个国产大模型在处理基础计数问题上的表现,特别是通过链式推理(COT)提示的效果。结果显示,GPTo1-mini、文心一言3.5和讯飞4.0Ultra在首轮测试中表现优秀,而其他模型在COT提示后也能显著提升正确率,唯有讯飞4.0-Lite表现不佳。测试强调了COT在提升模型逻辑推理能力中的重要性,并指出免费版本中智谱GLM较为可靠。
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
|
2月前
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
2月前
|
运维 前端开发
前端使用antdesign导出插件跨域问题
前端使用antdesign导出插件跨域问题
22 1