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地址后面的参数值的方法分享,如下所示: 实现思路: 使用正则表达式对参数值进行匹配,获取参数后的 ...
随机推荐
- k8s挂在问题
今天在重启pod这个后发现一直处于 然后去describe发现报错如下 先去手动mount的发现挂在不了 然后去slave节点发现这个没有安装 然后手动去安装后重启pod问题解决
- linux下搭建oh-my-zsh环境
目标:因为用习惯了zsh的shell环境,所以习惯在服务器上也搭建zsh环境,但是每次搭建都需要Google每一步骤,感觉很麻烦,所以决定记录一下,免得一次次查 1. 安装zsh zsh是一款shel ...
- VBA---Basic
题记: 之前用VBA做过几个小工具,用来实现办公自动化的.在编写过程中也遇到了一些问题,但最终都通过网友们的分享予以解决,现对其中的一些知识点进行总结. common sense 取消文件刷新: Ap ...
- javax.script.ScriptException: ReferenceError: "window" is not defined in security.js at line number 10
使用jmeter执行加密登录接口的测试遇到的问题. 问题记录: 今天使用jmeter执行加密登录接口的测试,因为测试环境的应用包是以前的老版本(可能有两年了),所以需要替换加密文件:security. ...
- 安装 TypeScript 并编译成JS
官网: https://github.com/microsoft/TypeScript TypeScript是一种由微软开发的开源.跨平台的编程语言.它是JavaScript的超集,最终会被编译为Ja ...
- jupyter notebook使用相对路径的方法
在当前文件夹路径下开启jupyter notebook 这样就可以直接使用相对路径了,而不用管绝对路径这一令人心烦的问题 首先需要重新安装PowerShell 下载链接:https://cloud.1 ...
- 如何查看mysql数据目录位置
mysql> show global variables like "%datadir%"; +---------------+-----------------+ | Va ...
- lambda、map、reduce、filter、sorted函数
# lambda 函数from functools import reducea = lambda x: x ** 2print(a(3))def power(func, l=[]): return ...
- 深入浅出学习透析Nginx服务器的基本原理和配置指南「Keepalive性能分析实战篇」
Linux系统:Centos 7 x64 Nginx版本:1.11.5 Nginx 是一款面向性能设计的 HTTP 服务器,能反向代理 HTTP,HTTPS 和邮件相关(SMTP,POP3,IMAP) ...
- jquery &&、||
$(function(){ $('.mainall').textbox({}); var r = 5; r=r==2&&r*8||r*3; alert(r); }); &&am ...