前端开发中的ajax请求、axios封装

news2024/11/24 2:36:54

目录

浏览器http请求

同步 js标签跨域、url

异步ajax、websock协议

ajax是异步的技术术语,最早的api是xhr(XMLHttpRequest)

fetch es6 api

axios

封装axios

src/utils/request.ts

src/utils/func.ts

SSO(Single Sign-On)单点登录,一次登陆可访问多个相互独立的程序

正则表达式

常用字符

前/后向查找:匹配括号中的内容(不包含括号)

src/api/common.ts

src/views/components

基础知识回顾

url参数

location属性值

同源策略

token和cookie

替换cookie(开发中模拟不同权限的用户)

A.手动

B.设置index.html 

C.浏览器扩展小程序:一键获取/设置多个

浏览器的本地存储Cookie、WebStorage(localStorage、sessionStorage)

web安全

XSS跨站脚本攻击Cross-Site Scripting(登陆时执行脚本读取)

CSRF跨站请求伪造Cross-site request forgery(凭证请求)

SQL注入攻击(交表单/输域名 执行SQL命令)

DDoS攻击分布式拒绝服务 Distributed Denial of Service(请求过载)

浏览器http请求

同步 js标签跨域、url

<img src>,<link href>

异步ajax、websock协议

ajax是异步的技术术语,最早的api是xhr(XMLHttpRequest)

fetch es6 api

基于promise,简单易用 

axios

  • 同构,即同样的代码在nodejs端,浏览器端都可用
  • 在浏览器用xhr,Node.js中使用Node的内置http模块。
// 在浏览器中,根据其Content-Type头信息,自动转换数据
axios.get('/api/data').then(response => {
  // response.data 将是一个JavaScript对象
});

// 在Node.js中手动设置响应数据类型
axios.get('/api/data', { responseType: 'json' }).then(response => {
  // response.data 将是一个JavaScript对象
});
  • axios 新版本也支持了fetch
  • 第三方库都是基于原生API的,所以axios也还是基于xhr的

【JavaScript】爆肝 2 万字!一次性搞懂 Ajax、Fetch 和 Axios 的区别~ - 掘金

封装axios

src/utils/request.ts

import service from 'axios'
import { handleSSO } from '@/utils/func'
import router from '@/router/index'

// 请求拦截器
service.interceptors.request.use(
  (config: any) => {
    // 在请求头中添加XMLHttpRequest字段
    config.headers['X-Requested-With'] = 'XMLHttpRequest'
    return config
  },
  (error: any) => {
    console.log('request:', error) // 用于调试的错误信息
    return Promise.reject(error)
  }
)

function errorMsgTips(msg: any) {
  window.$message.error(msg)
}

// 响应拦截器
service.interceptors.response.use(
  (response: { data: any; config: any }) => {
    const resData = response.data || {}
    if (resData.code === 302) {
      // 如果响应码为302,进行页面重定向到指定链接
      window.location.href = `https://www.example.com/path/to/resource.html/domain=${location.host}&req=${encodeURIComponent(location.pathname)}&protocol=https${location.hash}`
    } else if (resData.code == 0 || resData.code == 200) {
      // 如果响应码为0或200,则直接返回响应数据
      return resData
    } else if (resData.code == 4004) {//自定义响应码
      // 如果响应码为4004,说明没有权限,跳转至无权限页面
      router.push({
        path: '/notPermission'
      })
    } else {
      // 其他情况下,显示错误提示消息
      errorMsgTips(resData.message || '接口错误,请稍后重试')
    }
  },
  (error: any) => {
    if (service.isCancel(error)) {
      console.log('取消请求 error -> ', error)
      return
    }
    if (error && error.response && error.response.status === 302) {
      if (process.env.NODE_ENV === 'development') {
        // 如果是开发环境,并且错误码为302,显示替换SSO_SESSION_ID的提示
        errorMsgTips('请替换Cookies里的SSO_SESSION_ID')
        return
      } else {
        // 非开发环境下,进行单点登录重定向
        window.location.href = handleSSO('login')
      }
    } else if (error && error.stack.includes('timeout')) {
      // 如果错误信息中包含"timeout",显示接口超时错误提示
      errorMsgTips('接口超时')
      return
    } else if (error && error.stack.includes('Network')) {
      // 如果错误信息中包含"Network",显示网络异常错误提示
      errorMsgTips('网络异常')
      return
    }
    return Promise.reject(error)
  }
)

export default service

src/utils/func.ts

/**
 * 清除会话
 * @param
 */
function clearSession() {
  //匹配不包含空格和分号的字符,该字符后面必须跟着一个等号。这会返回一个由cookie键组成的数组。
  const keys = document.cookie.match(/[^ =;]+(?=\=)/g)
  if (keys) {
    for (let i = keys.length; i--; )
     //) 创建了一个代表时间戳 0 的 JavaScript Date 对象,并将其转换为 UTC 字符串。
     //这个时间对应于 1970 年 1 月 1 日 协调世界时 (UTC) 时间 00:00:00。
      document.cookie = keys[i] + '=0;expires=' + new Date(0).toUTCString()
  }
  sessionStorage.clear()
  localStorage.clear()
}

/**
 * SSO登入登出
 * @param SSOtype
 * login登入
 * logout登出
 */
export function handleSSO(SSOtype: string): string {
  const hostStr = 'passport.example.com'
  clearSession()
  return `https://${hostStr}/${SSOtype}?service=` + encodeURIComponent(window.location.origin)
}

SSO(Single Sign-On)单点登录,一次登陆可访问多个相互独立的程序

通常靠token/cookie实现

正则表达式

常用字符

·匹配除换行字符外的任何单个字符
*匹配前一个字符零或多次。例如,"zo*”与"z”或"zoo”匹配。
+匹配前一个字符一次或多次。例如,"zo+"与"zoo”匹配,但和"z”不匹配。
?匹配前一个字符零或一次。例如,"a?ve?”和"never"中的“"ve”匹配。
x|y 匹配x或y
{n}匹配n次。n是非负整数
{n,} n是一个非负整数。至少匹配n次。例如,"o{2,)"和"Bob”中的"o”不匹配,但和"foooood"中的所有o匹配。"o{1}”与"o+”等效。"o{0,}”和"o*”等效。
{n,m}m和n是非负整数。至少匹配n次而至多匹配 m次。例如,"o{1,3]"和"fooooood”中的前三个o匹配。"o{0,1}”和“o?”等效。
[xyz]匹配括号内的任一字符。例如,"[abc]"和"plain”中的"a”匹配。

[^xyz]匹配非括号内的任何字符。例如,"[^abc]"和“plain”中的"p”匹配。
[a-z]字符范围。和指定范围内的任一字符匹配。例如,"[a-z]”匹配"a"到"z"范围内的任一小写的字母表字符。

[^m-z]否定字符范围。匹配不在指定范围内的任何字符。例如,"[m-z]”匹配不在"m"到"z"范围内的任何字符。

前/后向查找:匹配括号中的内容(不包含括号)

后向查找:(?<=exp)是以exp开头的字符串, 但不包含本身.

前向查找:(?=exp)就匹配为exp结尾的字符串, 但不包含本身.

负后向查找(?<!exp) ,在之前被指定的子表达式不能被匹配到

负前向查找::(?!exp),在之后被指定的子表达式不能被匹配到

正向先行断言 (?=\=) 表示在匹配等号 = 前面的位置进行断言,即正向这个位置后面必须跟着等号 = 才能进行匹配。这种断言不会消耗实际的字符。

前向查找 (?==) 表示匹配等号 =,并且把等号 = 包含在匹配结果中。这种查找会消耗等号 = 这个字符。

src/api/common.ts

import request from '@/utils/request'
const baseUrl = process.env.NODE_ENV === 'development' ? '/test' : ''
const mock = false

// 查看自己信息接口
export const commonQuery = (data: any) => {
  const url = mock ? `${baseUrl}/common/query` : `${baseUrl}/mock/query`
  return request.post(url, data)
}

// 查看自己信息接口
export const getUserInfo = () => {
  const url = `${baseUrl}/menu/userInfo`
  return request.get(url)
}

src/views/components

import * as API from "@/api/common"
...
 API.commonQuery(params).then((res: any) => {
      console.log('res::::', res)
    })

基础知识回顾

url参数

http://example.com/page?param1=value1&param2=value2#section1

分隔实际的URL和参数
&URL中指定的参数间的分隔符
=左边为参数名、右边参数值
#

锚点(Anchor),用于标识文档中的特定位置或元素,

仅在客户端使用,并且由浏览器处理,不发送到服务器

指示浏览器滚动到具有 id="section1" 的元素处。

location属性值

window的全局对象,表示当前页面http://www.example.com/path/index.html

window.location.href:获取/设置 url

window.location.orgin:协议、主机名和端口号部分

//https://www.example.com:8080/page.html
//     ://               :
//https%3A%2F%2Fwww.example.com%3A8080。
encodeURIComponent(window.location.origin)
//encodeURIComponent用于将字符串中的特殊字符(空格、&、+、= 、?)转换为编码形式,确保URL中不包含任何无效字符



//查询参数时 或者 动态参数时 需要encodeURIComponent
const url = 'https://example.com/api?param=' + encodeURIComponent(queryParam);
window.location.href =`https://www.example.com/path/to/resource.html/domain=${location.host}&req=${encodeURIComponent(location.pathname)}&protocol=https${location.hash}`

window.location.protocol: 协议http

window.location.host:主机+端口(host:8080)/IP地址(127.123.32.1唯一)/域名(www.example.com助记)

window.location.hostname:主机host

window.location.port:端口8080

window.location.pathname: 资源路径path/index.html,资源index.html

window.location.hash:

window.location.search: 搜索

var searchParams = new URLSearchParams(window.location.search);
console.log(searchParams.get('name')); // 输出 "John"

同源策略

同源/域:顾名思义,域名包括前缀都要相同,自然也包括端口号

但是cookie从端口号开始就可以不同

跨域请求默认情况下不会携带 Cookie。

然而,可以通过设置 CORS(跨源资源共享)头部来允许携带 Cookie 进行跨域请求。

withCredentials 属性为 true,以告知浏览器在请求中携带 Cookie。

token和cookie

凭证tokencookie
跨域

token 完全由应用管理,所以它可以避开同源策略

服务器端生成管理,不能跨域
与session

移动端对 cookie 的支持不是很好,所以移动端常用的是 token

session 需要基于 cookie 实现

替换cookie(开发中模拟不同权限的用户)

A.手动

 

B.设置index.html 

<!DOCTYPE html>
<html lang="">
  <head>
...
    <div id="app"></div>
    <script>
      document.cookie = 'sso_ticket=xx'
    </script>
  </body>
</html>

C.浏览器扩展小程序:一键获取/设置多个

浏览器的本地存储Cookie、WebStorage(localStorage、sessionStorage)


web安全


XSS跨站脚本攻击Cross-Site Scripting(登陆时执行脚本读取)

解决:

  • url参数使用encodeURIComponent方法转义
  • 尽量不用InnerHtml插入HTML内容

CSRF跨站请求伪造Cross-site request forgery(凭证请求)

解决:添加验证码、使用token

SQL注入攻击(交表单/输域名 执行SQL命令)

解决:表单输入时通过正则表达式将一些特殊字符进行转换

DDoS攻击分布式拒绝服务 Distributed Denial of Service(请求过载)

解决:

  • 限制单IP请求频率。
  • 检查特权端口的开放

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于JAVA SpringBoot和Vue UniApp外卖订餐小程序

随着社会的发展和进步&#xff0c;网络信息技术的迅速发展已经渗透到我们生活的各个角落&#xff0c;传统餐饮业也受到了很大的影响&#xff0c;大部分传统中餐馆都开门&#xff0c;最多只能通过一个电话预约。但是在中国春节长假期间&#xff0c;餐厅不能接待这么多顾客。因此…

zabbix6.0LTS 配置proxy分布式监控

一、环境介绍 角色IP备注zabbix_server192.168.1.17zabbix_proxy192.168.1.14rpm包方式安装zabbix_agent192.168.1.18源码包安装 二、部署zabbix_proxy数据库 zabbix_proxy必须要安装一个数据库.zabbix官网推荐使用mariadb数据库&#xff0c;本人尝试过使用mysql8.0。由于内…

一步一步学OAK之十二:DepthAI API中Nodes各节点特性总结

目录 ColorCamera节点EdgeDetector节点FeatureTracker 节点ImageManip节点IMU 节点MobileNetDetectionNetwork节点MobileNetSpatialDetectionNetwork节点MonoCamera节点NeuralNetwork节点ObjectTracker节点Script节点SpatialLocationCalculator节点SPIIn节点SPIOut节点StereoDe…

2023年华中杯数学建模A题新型镇静药物临床实验疗效分析与预测解题全过程文档及程序

2023年华中杯数学建模 A题 新型镇静药物临床实验疗效分析与预测 原题再现 临床研究是新药物研究中的关键环节。本题拟围绕一种新型镇静药物的临床实验数据分析展开。 尝试根据附件中提供的数据和相关材料&#xff0c;研究以下问题&#xff1a;   1. 关于术中、术后 24h 不良…

React V6实现v-if、v-show、v-html

功能背景 在vue中使用v-if、v-show、v-html这些命令得心应手&#xff0c;那么react是否也存在这样的命令呢&#xff1f;似乎是没有的&#xff0c;需要自己实现&#xff0c;也就是用原生的写法直接控制dom。 实际效果 代码实现 const [dialogVisible, setDialogVisible] useSt…

Linux学习之守护进程

守护进程是daemon&#xff08;也称作精灵进程&#xff09;&#xff0c;守护进程不需要终端就可以启动起来&#xff0c;另外它的日志会打印到一些特殊文件中&#xff0c;并且占用的目录是根目录&#xff0c;避免占用其他目录&#xff0c;避免想要卸载其他目录时&#xff0c;报无…

taobao/天猫整店采集(店铺宝贝列表接口)

对于做竟店分析来说&#xff0c;首先要知道店铺有哪些商品&#xff0c;店铺宝贝列表则提供了这样的入口&#xff0c;可以查看该店铺的所有宝贝&#xff0c;也可以通过关键词全局搜索来获取店铺宝贝&#xff0c;但搜索会夹带这很多推荐的结果在里面&#xff0c;会比较混乱。 淘宝…

软件破解专题01

玩脱壳&#xff1f; 破解的功能&#xff1a;可以把收费软件免费使用 推荐论坛&#xff1a;pyg论坛》www.chinapyg.com 逆向&#xff1a;团队合作&#xff0c;有条件可以参加ctf大赛&#xff0c;这个应该是进步最快的途径 一个很强的开源项目&#xff1a;de4dot 作者…

Qt加载百度地图实现地图浏览(一)

一、功能介绍 在使用Qt中的QWebEngineView实现加载百度地图,并提供地图浏览功能。用户可以在Qt应用程序中显示百度地图,并使用常见的地图操作(如缩放、平移等)进行交互。 QWebEngine用于在Qt应用程序中嵌入Web内容。提供了对现代Web技术(如HTML5、CSS3、JavaScript等)的…

【Java高级编程】网络编程

网络编程 1、InetAddress类的使用1.1、实现网络通信需要解决的两个问题1.2、网络通信的两个要素1.3、通信要素一&#xff1a;IP和端口号1.4、通信要素二&#xff1a;网络通信协议1.5、TCP和UDP的区别1.6、TCP三次握手和四次挥手 2、TCP网络编程3、UDP网络编程4、URL编程4.1、UR…

14-上传文件

目录 1.核心方法 1.1.HttpServletRequest 类方法 1.2.Part 类方法 2.代码示例 2.1.通过form表单方式提交文件 2.2.通过Postman来模拟上传文件 2.2.1.简易版文件上传 2.2.2.正式版&#xff0c;可以上传多个图片&#xff0c;不会覆盖 数据提交有3种方式&#xff1a; form…

6.28学习 babel转换,es6的装饰器

6.28学习 babel转换&#xff0c;es6的装饰器 1.babel转换1.1出现问题1.2babel转换 2.装饰器2.1类装饰器2.2方法装饰器 1.babel转换 1.1出现问题 先来一段代码&#xff0c;运行&#xff0c;有可能是会报错的&#xff0c;为什么呢&#xff1f;因为JS以前只能运行在浏览器中&…

Bokeh 绘图基础与常用功能

Reference | Getting started with Bokeh – Medium Post 在 Github 上查看交互式的绘图结果 | Bokeh 绘图入门 – Posted by Paradise 在这篇文章中&#xff0c;从最基本的绘图开始&#xff0c;逐步学习 Bokeh 中常用的绘图功能&#xff0c;目标是能满足大部分基础的绘图需求。…

密码学—Vigenere加密Python程序

文章目录 维吉尼亚加密加密算法解密算法 注意事项 维吉尼亚加密 古典密码&#xff0c;属于多表加密。 怎么就是多表了&#xff1f; 维吉尼亚密码的加密算法实质是凯撒密码&#xff0c;因为他是先分好小组&#xff0c;然后用密钥串对应着分好组的每一个字母进行加密&#xff08…

用纯CSS和DIV绘制播放按钮样式

最近在做前端的视屏监控播放对接&#xff0c;前端弄了个播放按钮&#xff0c;记录下&#xff0c;效果如图所示&#xff1a; HTML代码&#xff1a; <div className"box"><div className"one" ><div className"two"><div cl…

1.1、Java初级认识Java、jdk、 idea

前言 1.1 软件开发之 Java 开发 Java现在已经占有主流市场 企业级应用领域&#xff08;JavaEE 后台&#xff09;&#xff1a;用来开发企业级的应用程序&#xff0c;大型网站如淘宝、京 东、12306&#xff0c;以及各大物流、银行、金融、社交、医疗、交通、各种 OA 系统等都…

Centos7下root安装Elasticsearchhe和IK分词器

安装Elasticsearchhe和IK分词器 1. 安装前准备 安装Elasticsearch之前&#xff0c;需要安装Java8或Java8以上的Java环境&#xff0c;linux安装jdk百度一下。 2. 下载Elasticsearchhe 创建安装目录 mkdir -p /usr/local/elasticsearch如果主机联网,可以选择在线下载&#…

Matlab可调用MODTRAN5封装器之Mod5

目录 Mod5介绍安装Mod5Mod5文件位置注意事项 运行Mod5创建实例设置MODTRAN参数运行MODTRAN结果绘制示例图 Mod5介绍 MODTRAN 是一个计算地球大气中电磁辐射传输的软件代码。MODTRAN是通过使用具有严格格式的输入文本文件来控制的。这个文件被称为“tape5”&#xff0c;扩展名为…

华硕ROG幻14 2023原装Windows11系统工厂模式带ASUS RECOVERY功能恢复

第一步&#xff1a;下载原装系统文件&#xff08;工厂包&#xff09; 第二步&#xff1a;华硕天选冰刃魔霸枪神灵耀等 需要自备16g空u盘安装 第三步&#xff1a;创建u盘分区&#xff0c;第一个分区格式为FAT32(存放TLK引导文件)&#xff0c;第二个分区大小为NTFS&#xff08…

利用Jetpack Compose进行导航(Navigation)

引言 Jetpack Compose是一个现代化的&#xff0c;声明式的UI工具包&#xff0c;它让我们可以更快、更简便地构建Android的界面。今天&#xff0c;我们要讨论如何使用Jetpack Compose和它的导航库&#xff08;Navigation Compose&#xff09;来进行应用导航。 初步了解Navigati…