隐约雷鸣

隐约雷鸣 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑

人声控,吉他控,喵星控。

个人动态

隐约雷鸣 回答了问题 · 2020-10-22

解决微信打开页面显示空白

已解决。解决方法:卸载微信app,然后重新下载安装,然后就正常打开了。

实在是不明白。。。

关注 1 回答 1

隐约雷鸣 提出了问题 · 2020-10-22

解决微信打开页面显示空白

我有一个https的链接,在微信里打开这个链接,小米8是正常打开的。

但是oppo ace2上用微信打开就是白屏,用自带浏览器是正常打开的,并且在该手机的微信上,用http://debugmm.qq.com/?forcex...,在x5内核下也是正常打开的;用http://debugmm.qq.com/?forcex...,关闭x5内核之后就是白屏了。

我认为可以排除js代码报错的可能,那么是什么原因引起的?

关注 1 回答 1

隐约雷鸣 赞了回答 · 2020-09-16

解决除了cookie之外,还能用什么方法做验证码功能?

前端调用发送验证码的接口,该接口给用户手机号发送验证码,同时将这个验证码保存到redis,可以设置一分钟或者五分钟的有效期,不需要将验证码返回给前端

用户手机短信收到验证码后,自己输入验证码,调用验证接口,用户输入的验证码与刚刚redis保存的验证码进行校验和对比即可

关注 5 回答 5

隐约雷鸣 赞了回答 · 2020-09-16

解决除了cookie之外,还能用什么方法做验证码功能?

你说的方案也可以.因为验证码无非就是后端生成验证码的时候,再生成一个凭据返回给用户,用户拿凭据和验证码给后端来验证验证码是否正确,至于这个凭据放到哪里,无所谓的,只要你能让用户带回来就好.
一般有状态的话就放在服务端 session 中,这是最保险的.也可以返回给前端,让前端自行保存,这样的话,这个凭据就必须是足够随机的.

关注 5 回答 5

隐约雷鸣 回答了问题 · 2020-09-15

解决除了cookie之外,还能用什么方法做验证码功能?

把放在cookie里的字段,直接放在response里,让前端暂存起来,调验证的接口时,再带上去,这样可以吗?

关注 5 回答 5

隐约雷鸣 提出了问题 · 2020-09-15

解决除了cookie之外,还能用什么方法做验证码功能?

如题,一般现在的短信验证码是这样做的(至少我们是这样做的):前端调发短信接口,response返回一个cookie,然后下一个验证的接口,前端通过设置credentials: 'include',把cookie带上传给服务器,这样服务器就知道要对上哪个验证码了。

但是现在cookie有了个新敌人:SameSite,使得传递cookie变得困难起来,而且SameSite的兼容性也是个问题,据说部分旧版和国内的浏览器不能正确地识别SameSite=None,使得服务器端设了也白设。另外SameSite=None确实也有cors的风险。

所以我们如果不用cookie,还能怎么样实现验证码功能呢?

关注 5 回答 5

隐约雷鸣 发布了文章 · 2020-07-24

微信小程序(Taro)手撕FormData

小程序里没有FormData类,所以POST方法如果要传multipart/form-data就会报错。

而npm上的formdata-polyfill,类似 https://github.com/form-data/... 或者https://github.com/jimmywarti...
都不好用

好在有人探究出来 https://developers.weixin.qq.... 可以手动拼装出FormData格式的字符串,并且成功调用。

以下附代码:

// 手动拼接FormData字符串
// 函数边界处理没怎么做,各位可自行补充
// 数组和obj的情况没有处理,可以用postman发个请求看看格式,很简单的
function createFormData(params = {}, boundary = '') {
  let result = '';
  for (let i in params) {
    result += `\r\n--${boundary}`;
    result += `\r\nContent-Disposition: form-data; name="${i}"`;
    result += '\r\n';
    result += `\r\n${params[i]}`
  }
  // 如果obj不为空,则最后一行加上boundary
  if (result) {
    result += `\r\n--${boundary}`
  }
  return result
}

// 通用post请求
export const post = function (url, params) {
  return new Promise(function (resolve, reject) {
    // 生成一个boundary字符串
    const boundary = `----FooBar${new Date().getTime()}`;
    const formData = createFormData(params, boundary);
    console.log(formData);
    Taro.request({ // 这里我用的taro,改成wx.request也一样
      url,
      method: 'POST',
      credentials: 'include', //设置传递cookies
      dataType: 'json',
      header: {
        'Accept': 'application/json',
        'Content-Type': `multipart/form-data; boundary=${boundary}`,
      },
      data: formData,
      timeout: 5000,
      success: function (res) {
        resolve(res.data);
      },
      fail: function (error) {
        reject(error);
      }
    })
  });
}

formdata格式

用postman发个formdata请求,我们可以看到数据长这样:

Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="mobile"

13800138000
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="name"

张三
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="address"

地球
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="weappid"

abcdefghijklmn
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="id"

107
------WebKitFormBoundary7MA4YWxkTrZu0gW--

仔细观察以下,就可以总结出上面的拼装规则了。
其中,数据体中boundary,是Content-Type中的boundary前面加--

开头和结尾还有每个field之间要加上boundary

查看原文

赞 1 收藏 1 评论 1

隐约雷鸣 提出了问题 · 2020-07-21

解决微信小程序(Taro)里的window对象

我之前有个H5,用react写的,然后现在用Taro改写成小程序。
原来H5的代码里有类似:

let { search } = window.location;

编译成小程序后,在微信开发者工具里面调试,发现console报错:
TypeError: Cannot read property 'search' of undefined

然而我直接在微信开发者工具的console里面输入:window.location.search,发现又是可以取到的。

我的问题:
1、微信小程序(或者Taro)里到底有window对象吗?
2、我在之前H5里用到的window.locationwindow.history要用什么代替?

关注 1 回答 1

隐约雷鸣 提出了问题 · 2019-10-16

tree diff 和 component diff的区别?

最近在学习react diff算法,有一个地方一直没弄明白,tree diff 和 component diff的区别在哪?

在我看来好像没有tree diff这一回事,都是component diff,同层的component比较了之后,同一个类型的就不变,不同类型的就把这个节点删掉(包括所有的子节点),挂上新类型的节点(还有它所有的子节点)

关注 1 回答 2

隐约雷鸣 提出了问题 · 2019-04-29

WKWebView禁用前进手势

如题。我使用WKWebView来显示网页,并且设置了AllowBackForwardNavigationGestures = YES,目的是让WKWebView能左滑后退一页。但没想到这个属性兼具右滑前进一页。

请问我只想左滑后退,不想右滑前进,该怎么做呢?

关注 3 回答 1

认证与成就

  • 获得 32 次点赞
  • 获得 48 枚徽章 获得 1 枚金徽章, 获得 12 枚银徽章, 获得 35 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2015-06-04
个人主页被 2k 人浏览