JavaScript 中更安全的 URL 读写
前言
URL
对于我们开发人员来讲,应该是非常熟悉了。在对URL
进行参数拼接时,我们一般都会直接进行字符串拼接或使用模版字符串,因为这样非常方便,但是我们这样其实会在不知不觉中以不安全的方式编写 URL。
比如,我们通常会这样写:
const url = `https://www.baidu.com
?model=${model}&locale=${locale}?query.text=${text}`
这样确实写起来非常方便,但你可能会在不知不觉中会你的程序带来一些问题。(如上代码就是一段有问题的代码)
如果这篇文章有帮助到你,️关注+点赞️鼓励一下作者,文章公众号首发,关注 前端南玖
第一时间获取最新文章~
常见问题
不正确的分隔符
这种错误可能在新手身上比较常见,但即使是经验老道的程序员也不可能绝对避免这个错误。造成这个错误的罪魁祸首绝大多数是在修改或移动代码之后。例如,你有一个结构正确的 URL,然后将一个片段从一个片段复制到另一个片段,然后错过了参数分隔符的错误排序。
忘记编码
许多时候我们URL
上的参数是需要进行编码的,因为URL
参数可以是任意类型的文本,包括空格和特殊字符,这会给我们带来一些无法预料的问题。
所以为了避免这种情况,我们往往会这样写:
const url = `https://www.baidu.com
?model=${
encodeURIComponent(model)
}&locale=${
encodeURIComponent(locale)
}&query.text=${
encodeURIComponent(text)
}`
但这样的写法给人的感觉是非常的冗余且不雅观
意外的空白字符
有时候我们为了将一个长 URL
分成多行,我们会不小心在 URL 中包含了换行符和额外的空格,这将导致无法按预期进行抓取。
所以为了正确分解URL
字符串,我们通常会这样写:
const url = `https://www.baidu.com`
+ `?model=${
encodeURIComponent(model)
}&locale=${
encodeURIComponent(locale)
}&query.text=${
encodeURIComponent(text)
}`
但这样是我们的代码变得更加混乱以及难以阅读。
难道就没有一种既安全又优雅的方法来编写URL
吗?
URL构造函数
既优雅又安全的方法就是使用URL
构造函数
URL()
构造函数返回一个新创建的URL
对象,表示由一组参数定义的 URL。如果给定的基本 URL 或生成的 URL 不是有效的 URL 链接,则会抛出一个
TypeError
。
语法
const url = new URL(url [, base])
参数
url
是一个表示绝对或相对 URL 的
DOMString
。如果url
是相对 URL,则会将base
用作基准 URL。如果url
是绝对 URL,则无论参数base
是否存在,都将被忽略base
可选是一个表示基准 URL 的
DOMString
,在 url 是相对 URL 时,它才会起效。如果未指定,则默认为''
解决
所以上面的URL
我们就可以这样来写:
const url = new URL('https://www.baidu.com')
url.searchParams.set('model', model)
url.searchParams.set('locale', locale)
url.searchParams.set('text', text)
这样写就可以为我们解决这些问题:
- 分隔符总是正确的(
?
对于第一个参数,以及之后的参数) - 所有参数都自动编码
- 长 URL 跨多行时没有额外空白字符的风险
修改URL
对于我们在不知道当前参数状态下的情况,它也非常适用。
比如:
url += (url.includes('?') ? '&' : '?') + 'foo=bar'
使用URL
构造函数我们可以这样写:
// url是一个URL构造函数
url.searchParams.set('foo', 'bar')
// 或者是一个字符串
const structuredUrl = new URL(url)
structuredUrl.searchParams.set('foo', 'bar')
url = structuredUrl.toString()
读取URL
现在,我如果想在没有库的情况下从当前 URL 读取查询参数这个由来已久的问题也得到了解决。
const pageParam = new URL(location.href).searchParams.get('page')
const url = new URL(location.href)
const currentPage = Number(url.searchParams.get('page'))
url.searchParams.set('page', String(currentPage + 1))
location.href = url.toString()
这不仅限于浏览器,它也可以在 Node.js 中使用
const http = require('http');
const server = http.createServer((req, res) => {
const url = new URL(req.url, `https://${req.headers.host}`)
});
URL属性
URL 实例支持您已经在浏览器中使用的所有属性,例如 onwindow.location
或 anchor 元素,所有这些我们都可以读写:
const url = new URL('https://www.baidu.com/a?page=1');
url.protocol // https:
url.host // www.baidu.com
url.pathname // /a
url.search // ?page=1
url.href // https://www.baidu.com/a?page=1
url.origin // https://www.baidu.com
url.searchParams.get('page') // 1
常用URLSearchParams方法
该URLSearchParams
对象可在URL
实例上访问,url.searchParams
支持许多方便的方法:
searchParams.has(name)
检查搜索参数是否包含给定名称
url.searchParams.has('page') // true
searchParams.get(name)
获取给定参数的值
url.searchParams.get('page') // '1'
searchParams.getAll(name)
获取为参数提供的所有值。如果你允许同名的多个值,这很方便,例如
&page=1&page=2
url.searchParams.getAll('page') // ['1']
searchParams.set(name, value)
设置参数的值
url.searchParams.set('page', '1')
searchParams.append(name, value)
附加一个参数——如果你可能多次支持同一个参数,这很有用,比如
&page=1&page=2
url.searchParams.append('page', '2')
searchParams.delete(name)
从 URL 中完全删除一个参数
url.searchParams.delete('page')
兼容性
new URL
基本支持所有现代浏览器(除了IE),以及 Node.js。
JavaScript 中更安全的 URL 读写的更多相关文章
- 如何在 JavaScript 中更好地使用数组
使用 Array.includes 替代 Array.indexOf “如果需要在数组中查找某个元素,请使用 Array.indexOf.” 我记得在我学习 JavaScript 的课程中有类似的这么 ...
- javascript中函数的3个高级技巧
× 目录 [1]作用域安全 [2]惰性载入 [3]函数绑定 前面的话 函数对任何一门语言来说都是一个核心的概念,在javascript中更是如此.前面曾以深入理解函数系列的形式介绍了函数的相关内容,本 ...
- 详解JavaScript中的Url编码/解码,表单提交中网址编码
本文主要针对URI编解码的相关问题做了介绍,对Url编码中哪些字符需要编码.为什么需要编码做了详细的说明,并对比分析了Javascript 中和 编解码相关的几对函数escape / unescape ...
- Javascript中的url编码与解码(详解)
摘要 本文主要针对URI编解码的相关问题做了介绍,对url编码中哪些字符需要编码.为什么需要编码做了详细的说明,并对比分析了Javascript中和编解码相关的几对函数escape / unescap ...
- java,javascript中的url编码
真实场景 url示例如下 http://localhost:31956/Login/Auto?Token=e8a67a9f-c062-4964-b703-d79f29c8b64e&Return ...
- JavaScript中url 传递参数(特殊字符)解决方法及转码解码的介绍
有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.下表中列出了一些URL特殊符号及编码 十六进制值 1. + URL 中+号表示空格 %2B 2. 空 ...
- URL地址中中文乱码详解(javascript中encodeURI和decodeURI方法、java.net.URLDecoder.encode、java.net.URLDecoder.decode)
引言: 在Restful类的服务设计中,经常会碰到需要在URL地址中使用中文作为的参数的情况,这种情况下,一般都需要正确的设置和编码中文字符信息.乱码问题就此产生了,该如何解决呢?且听本文详细道来. ...
- Django中如何将javascript中的变量传给位于javascript内的{% url %}中的参数?
这个问题困扰了我一天,不知道困扰了你多久,希望能帮助你 django 中的url模版使用起来可以说是非常方便的,但是怎么在url模版中传入参数的 {% url "url.index" ...
- C#与JavaScript中URL编码解码问题(转)
混乱的URI编码 JavaScript中编码有三种方法:escape.encodeURI.encodeURIComponent C#中编码主要方法:HttpUtility.UrlEncode.Serv ...
- javascript中如何使用js脚本模拟"request"获取url后参数值呢?
转自:猫猫小屋--js获取url后参数信息 摘要: 下文讲述javascript中使用js代码获取url地址后面的参数值的方法分享,如下所示: 实现思路: 使用正则表达式对参数值进行匹配,获取参数后的 ...
随机推荐
- ysoserial commonscollections3 分析
cc3利用链如下: TrAXFilter(Templates templates) TemplatesImpl->newTransformer() TemplatesImpl->getTr ...
- FlinkSQL之Windowing TVF
Windowing TVF 在Flink1.13版本之后出现的替代之前的Group window的产物,官网描述其 is more powerful and effective //TVF 中的tu ...
- MYSQL一键导库脚本
上周完成了一个性能测试环境搭建,有富余时间的同时研究了一个一键导库的脚本,一周的开始先马住!!! 一.思路 准备:54.158服务器上分别已经装好了MYSQL数据库 目的:把部分库从54导出并导入到1 ...
- 优秀的Kafka GUI客户端、可视化管理工具、监控工具
想要查看Topic里的消息却找不到软件,想要查看或更新Broker.Topic配置,想要监控Broker服务器状态?试试下面的Kafka GUI工具--Kafka Assistant 官网地址:htt ...
- elasticsearch多字段聚合实现方式
目录 1.背景 2.实现多字段聚合的思路 3.需求 4.数据准备 4.1 创建索引 4.2 准备数据 5.实现方式 5.1 multi_terms实现 5.1.1 dsl 5.1.2 java 代码 ...
- Go语言核心36讲15---结构体
我们都知道,结构体类型表示的是实实在在的数据结构.一个结构体类型可以包含若干个字段,每个字段通常都需要有确切的名字和类型. 前导内容:结构体类型基础知识 当然了,结构体类型也可以不包含任何字段,这样并 ...
- shell文件报错syntax error near unexpected token '$'\r''
本来跑的好好得一个文件,在windows下修改了,然后移植到linux就报错了. 找了一圈以下是解决方案: 这种情况发生的原因是因为你所处理的文件换行符是dos格式的"\r\n" ...
- centos ssh 连接缓慢
在连接apache,ssh,mysql等服务器时,如果出现连接过慢,可能的原因是dns 的反向查询.反向解析是防止假冒的IP连接服务器,把IP解析成域名,来提高安全性,看这个IP是否是伪造,这是dns ...
- i春秋象棋
这是一道非常有意思的一道题,打开后就是一个pve的象棋游戏,我觉得下赢了就应该会出现flag,可惜多次尝试后失败了(果真有点厉害,我一时兴起就玩了好几把,有空试试拿更厉害的电脑跟他对下,如果赢了会怎么 ...
- 基于Sklearn机器学习代码实战
LinearRegression 线性回归入门 数据生成 为了直观地看到算法的思路,我们先生成一些二维数据来直观展现 import numpy as np import matplotlib.pypl ...