3月部分问题汇总

目录

Android BLE连接 status =133优化

1、 为什么会出现 133的错误码

2、 GATT每次连接前, close之前的资源

3、清理Gatt缓存

4、 出现133错误码时, 进行重试策略

彻底理解cookie,session,token

1.发展史

Session

Token

webpack

 Flutter/Dart 语法补遗-  sync* 和 async* 、yield 和yield* 、async 和 await

 创建 package

Library Package 的组成

 Dart 语言异步之Stream详解

drain method



Android BLE连接 status =133优化

Android BLE连接 status =133优化 - 掘金 (juejin.cn)

1、 为什么会出现 133的错误码

  • gatt.close()没有调用,资源没有释放导致连接失败,等

  • 如何解决?

2、 GATT每次连接前, close之前的资源

    // 全局gatt
    private BluetoothGatt mGatt;
​
    private void connect(BluetoothDevice device, BluetoothGattCallback callback) {
        // 释放上次gatt连接资源
        close();
        if (SdkUtil.isAtLeastM_23()) {
            mGatt = device.connectGatt(ViotSDK.getInstance().getBaseContext(), false, callback, BluetoothDevice.TRANSPORT_LE);
        } else {
            mGatt = device.connectGatt(ViotSDK.getInstance().getBaseContext(), false, callback);
        }
    }
​
    // 释放上次gatt连接资源
    public void close() {
        if (mGatt != null) {
            mGatt.disconnect();
            mGatt.close();
            mGatt = null;
        }
    }

3、清理Gatt缓存

在重连的时候先将Gatt缓存进行清理:

4、 出现133错误码时, 进行重试策略

在Gatt连接的回调中,如果连接失败,并且错误码是133时,进行重试连接

彻底理解cookie,session,token

彻底理解cookie,session,token - 知乎 (zhihu.com)

1.发展史

  1. 很久以前,Web 基本上就是文档的浏览而已,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应

  2. 随着交互式Web应用的兴起,像在线购物网站,需要登录的网站等等,问题就是要管理会话,必须记住哪些人登录系统, 哪些人往自己的购物车中放商品, 也就是说我必须把每个人区分开,这就是一个不小的挑战,因为HTTP请求是无状态的,所以想出的办法就是给大家发一个会话标识(session id), 说白了就是一个随机的字串,每个人收到的都不一样, 每次大家向我发起HTTP请求的时候,把这个字符串给一并捎过来, 这样我就能区分开谁是谁了

  3. 服务器要保存所有人的session id ! 如果访问服务器多了, 就得由成千上万,这对服务器说是一个巨大的开销 , 严重的限制了服务器扩展能力。

  4. 后来有个叫Memcached的支了招: 把session id 集中存储到一个地方, 所有的机器都来访问这个地方的数据, 这样一来,就不用复制了, 但是增加了单点失败的可能性, 要是那个负责session 的机器挂了, 所有人都得重新登录一遍, 估计得被人骂死。

  5. 于是有人就一直在思考, 我为什么要保存这可恶的session呢, 只让每个客户端去保存该多好?

  6. 可是如果不保存这些session id , 怎么验证客户端发给我的session id 的确是我生成的呢? 如果不去验证,我们都不知道他们是不是合法登录的用户, 那些不怀好意的家伙们就可以伪造session id , 为所欲为了。

  7. 嗯,对了,关键点就是验证 !

    比如说, 小F已经登录了系统, 我给他发一个令牌(token), 里边包含了小F的 user id, 下一次小F 再次通过Http 请求访问我的时候, 把这个token 通过Http header 带过来不就可以了。

  8. 不过这和session id没有本质区别啊, 任何人都可以可以伪造, 所以我得想点儿办法, 让别人伪造不了。

    那就对数据做一个签名吧, 比如说我用HMAC-SHA256 算法,加上一个只有我才知道的密钥, 对数据做一个签名, 把这个签名和数据一起作为token , 由于密钥别人不知道, 就无法伪造token了。

  9. 这个token 我不保存, 当小F把这个token 给我发过来的时候,我再用同样的HMAC-SHA256 算法和同样的密钥,对数据再计算一次签名, 和token 中的签名做个比较, 如果相同, 我就知道小F已经登录过了,并且可以直接取到小F的user id , 如果不相同, 数据部分肯定被人篡改过, 我就告诉发送者: 对不起,没有认证。

cookie 是存在客户端上,一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据。

cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。

浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。

Session

session 从字面上讲,就是会话。这个就类似于你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征(长相等)表明他就是张三。

服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,大家都默认采用 cookie 的方式。

服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。

Token

安全性

请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,让我们少了对session操作。

token是有时效的,一段时间之后用户需要重新验证。我们也不一定需要等到token自动失效,token有撤回的操作,通过token revocataion可以使一个特定的token或是一组有相同认证的token无效。

可扩展性

Tokens能够创建与其它程序共享权限的程序。例如,能将一个随便的社交帐号和自己的大号(Fackbook或是Twitter)联系起来。当通过服务登录Twitter(我们将这个过程Buffer)时,我们可以将这些Buffer附到Twitter的数据流上(we are allowing Buffer to post to our Twitter stream)。

使用tokens时,可以提供可选的权限给第三方应用程序。当用户想让另一个应用程序访问它们的数据,我们可以通过建立自己的API,得出特殊权限的tokens。

webpack

之前的rn在运行构建过程中产生的报错

npm install --save-dev typescript ts-node @types/node @types/webpack
# and, if using webpack-dev-server < v4.7.0
npm install --save-dev @types/webpack-dev-server

 Flutter/Dart 语法补遗-  sync* 和 async* 、yield 和yield* 、async 和 await

【-Flutter/Dart 语法补遗-】 sync* 和 async* 、yield 和yield* 、async 和 await-腾讯云开发者社区-腾讯云 (tencent.com)

  • 一、多元素同步函数生成器
    • 1. sync* 和 yield
    • 2、sync* 和 yield*
  • 二、异步处理: async和await
  • 三、多元素异步函数生成器:
    • 1.async*和yield、await
    • 2.async*和yield*、await
  • 四、Stream的使用-StreamBuilder
    • 1.顶部组件
    • 2.StreamBuilder组件的使用
    • 题外话:

 创建 package

创建 package | Dart

Library Package 的组成

下图展示了最简单的 Library Package 布局:

 Dart 语言异步之Stream详解

Dart 语言异步之Stream详解 - 掘金 (juejin.cn)

drain<E> method

drain method - Stream class - dart:async library - Dart API (flutter-io.cn)

猜你喜欢

转载自blog.csdn.net/m0_73016265/article/details/130558983