1239.串联字符串的*大长度 关于字符串的回溯算法!

一个优秀的内容风控解决方案应该是怎样的?
信息传播的媒介与形态五花八门,对于互联网平台来说,保障内容安全越来越难。当下互联网平台面临哪些困境?7月3日,腾讯安全思享会,带大家一起探索亟需的答案,限额报名
1239.串联字符串的*大长度
https://leetcode-cn.com/problems/maximum-length-of-a-concatenated-string-with-unique-characters/solution/1239chuan-lian-zi-fu-chuan-de-zui-da-cha-7weh/
难度:中等
题目:
给定一个字符串数组 arr,字符串 s 是将 arr 某一子序列字符串连接所得的字符串, 如果 s 中的每一个字符都只出现过一次,那么它就是一个可行解。
请返回所有可行解 s 中*长长度。
提示:
1 <= arr.length <= 16
1 <= arr[i].length <= 26
arr[i] 中只含有小写英文字母
示例:
<pre class=”custom” data-tool=”mdnice编辑器” style=”margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;”>`示例 1:
输入:arr = [“un”,”iq”,”ue”]
输出:4
解释:所有可能的串联组合是 “”,”un”,”iq”,”ue”,”uniq” 和 “ique”,*大长度为 4。
示例 2:
输入:arr = [“cha”,”r”,”act”,”ers”]
输出:6
解释:可能的解答有 “chaers” 和 “acters”。
示例 3:
输入:arr = [“abcdefghijklmnopqrstuvwxyz”]
输出:26` </pre>
分析
当看到题目涉及排列组合求*优、*长、并且需要选择加入这类条件时,就要考虑回溯方法了。 这道题由于arr.length <= 16 且仅包含26个小写英文字母那么复杂度会底很多。
首先,我们在接收到arr列表后,先对列表中每一个元素是否存在重复值进行过滤, 这样可以节省回溯过程中不必要的判断与剪枝操作。
之后开始通过index逐步递归判断*长字符串,大家日常遇到的可能列表的回溯比较多,需要先append,再pop。
但这道题是字符串所以只需要字符串拼接即可,总体来说是一道比较简单的回溯题目。
解题:
<pre class=”custom” data-tool=”mdnice编辑器” style=”margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;”>`class Solution:
def maxLength(self, arr):
arr = [i for i in arr if len(set(i)) == len(i)]
ln = len(arr)
ret = 0
def dfs(strs, index):
        nonlocal ret
        if ln <= index:
            ret = max(ret, len(strs))
            return
        if not set(arr[index]) & set(strs):
            dfs(strs + arr[index], index + 1)
        dfs(strs, index + 1)
    dfs(”, 0)
    return ret` </pre>

python 两个栈实现一个队列 && 两个队列实现一个栈

python 两个栈实现一个队列 && 两个队列实现一个栈
一个优秀的内容风控解决方案应该是怎样的?
信息传播的媒介与形态五花八门,对于互联网平台来说,保障内容安全越来越难。当下互联网平台面临哪些困境?7月3日,腾讯安全思享会,带大家一起探索亟需的答案,限额报名
剑指Offer09.用两个栈实现队列
https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/solution/jian-zhi-offer09yong-liang-ge-zhan-shi-x-hybm/
难度:简单
题目:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,
分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )
提示:
1 <= values <= 10000
*多会对 appendTail、deleteHead 进行 10000 次调用
示例:
示例 1:
输入:
[“CQueue”,”appendTail”,”deleteHead”,”deleteHead”]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:
输入:
[“CQueue”,”deleteHead”,”appendTail”,”appendTail”,”deleteHead”,”deleteHead”]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
分析
首先扫盲队列与栈的知识:
队列:先进先出
栈:后进先出
那么,为什么要双栈实现队列呢?其实大家只要思考下:
我们准备两个栈add_stack和pop_stack:
先把1,2,3先挨个加入add_stack栈
下来依次将add_stack栈内的数据出栈,同时将出栈的数据加入pop_stack栈中
1、2执行完成后,add_stack变成了空,pop_stack栈中存储的数据成了[3,2,1]
那么下次出栈时,直接将pop_stack的栈内数据弹出,不就成了列队的先进先出!
关于什么时候执行2步骤需要注意下:
如果pop_stack栈中有数据,就直接return pop的数据
如果pop_stack栈中没有数据
a. add_stack也没有数据,return -1
b. add_stack有数据,执行上面步骤2,将add_stack数据加入pop_stack中
返回pop_stack栈弹出的数据
解题:
class CQueue:
    def __init__(self):
        self.add_stack, self.pop_stack = [], []
    def appendTail(self, value: int) -> None:
        self.add_stack.append(value)
    def deleteHead(self) -> int:
        if self.pop_stack:
            return self.pop_stack.pop()
        if not self.add_stack:
            return -1
        while self.add_stack:
            self.pop_stack.append(self.add_stack.pop())
        return self.pop_stack.pop()
225.用队列实现栈
https://leetcode-cn.com/problems/implement-stack-using-queues/solution/225yong-dui-lie-shi-xian-zhan-by-qingfen-igp1/
难度:简单
题目:
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
注意:
你只能使用队列的基本操作 —— 也就是push to back、peek/pop from front、size 和is empty这些操作。
你所使用的语言也许不支持队列。你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列, 只要是标准的队列操作即可。
示例:
输入:
[“MyStack”, “push”, “push”, “top”, “pop”, “empty”]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]
解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False
分析
这道题的关键在于每次入队时,如何保证入队后新入队的元素排在队首,题目要求使用两个队列实现。
首先我们创建两个队列,python操作为from collections import deque
元素入队时,将元素加入q1
判断q2是否存在元素,如果存在元素,则将元素依次出队并加入q1的队尾
交换q1与q2
至于出队、查询top、是否为空,都在q2上操作即可
解题:
from collections import deque
class MyStack:
    def __init__(self):
        “””
        Initialize your data structure here.
        “””
        self.q1 = deque()
        self.q2 = deque()
    def push(self, x: int) -> None:
        “””
        Push element x onto stack.
        “””
        self.q1.append(x)
        while self.q2:
            self.q1.append(self.q2.popleft())
        self.q1, self.q2 = self.q2, self.q1
    def pop(self) -> int:
        “””
        Removes the element on top of the stack and returns that element.
        “””
        return self.q2.popleft()
    def top(self) -> int:
        “””
        Get the top element.
        “””
        return self.q2[0]
    def empty(self) -> bool:
        “””
        Returns whether the stack is empty.
        “””
        return not self.q2

服务端编写API总结

1.服务端返回的数据都是*终都是经过json_encode处理的,格式基本上是

$response = [
‘code’=> 200,//状态码
‘msg’=> ‘请求成功’,//提示信息
‘data’=> $data//返回数据
];

其中$data可以是数组,如果$data为关联数组或者无序数组这会返回为对象

关联数组
$data = [
‘name’=>’bread’,
‘price’=>’8.05’,
‘attr’=> ‘都是感受到三个’,
‘date’=> ‘2018-05-01′
];
无序数组
$data = [
0=>’test1′,1=>’test2′,3=>’test3′,4=>’test4’
];

是有序数组就返回为数组

$data = [‘www.sdsf.com/sdf2334.png’,’www.sdsf.com/sdf24334.png’,’www.sdsf.com/df234.png’,’www.sdsf.com/srw34.png’];

json_encode递归循环格式化也是这个方式
2.$data中千万不要有json_encode的字符串,否则客户端接受时无法还原.就算数据库保存的为json字符串,也应该还原成数组再返回

在服务器上创建数据的api接口(json格式)

在tomcat服务器上创建数据的api接口(json格式)

简介:
即把数据传到服务器,以后需要使用数据,就直接用HttpURLConnection的相关类进行调用就好了。

效果图:
输入url地址,得到相关数据

%title插图%num

api接口创建的步骤
1.新建一个json文件夹。创建一个json格式的文件
2.将json格式的文件放入webapps的ROOT文件下。
3.启动tomcat的bin目录下点击startup.bat(Window系统下。如果是linux,点击startuo.sh)来启动服务器。
4.输入localhost:8080\NewsInfo.json,即可查看数据的json的格式。

我的服务器API接口文档

API接口文档
一:域名
https://xxx.com
二:请求方式 get/post

三:api前缀:/api

四:接口路径:

1:/banner (获取首页轮播图)
@parame:无参数
@method: get/post

2:/nav (获取首页菜单)
@parame:无参数
@method:get/post

3:/get_good (获取首页商品推荐)
@parame: add string 首页位置
@method: post

4: /get_good_class (获取商品分类)
@parame:无参数
@method: get

5:/get_good_box (获取商品货柜)
@parame : 无参数
@method : get

6:/get_good_box_id (获取货柜中对应的商品数据)
@parame:box_id string 货柜id
@method: post

7:/get_good_detail (获取商品详情数据)
@parame:good_id string 商品id
@method:post

8:/get_good_class_detail (获取某一商品分类下的所有商品)
@parame:class_id string 商品分类id
@method:post

9:/getOpenId (获取用户getOpenId)
@parame:code string 小程序wx.login()登录时获取的code
@method:post

10:/updateWechat (更新用户微信信息)
@parame:
nickName string 用户名
avatarUrl string 头像
Openid string openid
@method:post

11:/good_box_kai (打开货柜柜门)
@parame: box_id string 货柜id
@method:post

12:/good_box_normal_status_guanbi (关闭货柜柜门)
@parame: box_id string 货柜id
@method:post

13:/add_good_collect (添加收藏商品)
@parame:
User_id string 用户id
good_id string 商品id
@method:post

14:/delete_good_collect (取消收藏商品)
@parame:
User_id string 用户id
good_id string 商品id
@method:post

15:/add_good_cart (添加购物车)
@parame:
User_id string 用户id
good_id string 商品id
good_num number 商品数量
good_price number 商品价格
@method:post

16:/delete_good_cart (删除购物车)
@parame:
Cart_id string 购物车id
@method:post

17:/get_good_cart (获取购物车数据)
@parame:user_id string 用户id
@method:post

18:/get_index_good_cart (获取购物车详情数据)
@parame: user_id string 用户id
cartId string 购物车id
@method:post

19:/upload_good_cart_num (修改购物车数据)
@parame:
cartNum number 数量
cartId string 购物车id
user_id string 用户id
@method:post

20:/getUserOrder (获取用户订单)
@parame: user_id string 用户id
@method:post

21:/getOrderDetail (获取用户订单详情数据)
@parame: order_id string 订单id
@method:post

22:/get_user_info (获取用户基本信息)
@parame:
User_id string 用户id
@method:post
23:/create_address (添加用户收货地址)
@parame:
user_name string 姓名
user_phone string 电话
user_id string 用户id
@method:post

24:/get_address (获取用户地址)
@parame: user_id string 用户id
@method:post

25:/get_index_address (获取地址详情)
@parame: user_id string 用户id
address_id string 地址id
@method:post

26:/delete_address (删除地址)
@parame: user_id string 用户id
address_id string 地址id
@method:post

27:/userSign (用户签到)
@parame: user_id string 用户id
@method:post

28:/getUserSign (获取用户签到信息记录)
@parame: user_id string 用户id
@method:post

29:/getUserPoint (用户积分)
@parame: user_id string 用户id
@method:post

30:/mobileRegister (更新用户手机号)
@parame: user_id string 用户id
session_key string 微信自动返回的session_key
@method:post

31:/preprocessOrder (支付)
@parame: user_id string 用户id
good string 商品id
amount string 金额
address string 地址id
@method:post

32:/wxNotify (微信支付的回调地址)
@parame:微信回调的请求参数
@method:post

五:请求数据返回格式:json

六:数据状态
Status:
2 表示成功
1 表示失败
其他表示异常,会有提示自动返回

什么是API接口,具体是什么意思?

说到API,往往是和SDK放在一起的。什么叫API,看一下餐厅里怎么点餐的就行了。
1
到了饭店,喊一场服务员,点餐。服务员拿出来菜单给你看,你点什么,她在小本本上记什么。点好了之后,再把菜单送到后厨去。这里服务员就是提供服务的(不然也不叫服务员),提供什么服务呢?点餐服务。
点餐服务需要什么呢?谈一个服务,通常就是要谈输入是什么,输出又是什么。从眼下这个例子来看,输入就是一道道菜品的名字(或者是ID,不知道你们见过菜品上面有编号,服务员只记编号的?),输出的结果就是端过来的一道道菜。有了输入和输出,服务员就可以提供了点餐的功能,这就是API,顾客就是调用者,服务员就是服务的提供者。
你可以在这里把服务员替换成猫猫,假设女王大人猫猫来给你提供服务,只要输出是菜品的名字,输出是菜品,这个API就是能够正常使用的。而且,所有的顾客都可以用这种方式来点菜 的再想想 ,是不是有的服务员手里拿的是点餐机? 想想一个漂亮的小姑娘,拿着一个和手机大小差不多的点餐机,这个点餐机,就是需要和后厨删除线格式 系统有交互,这种交互,就需要一种约束,来声明点菜功能的输入是什么,输出是什么。比如说,如果用户点了一道已经估清的菜,是不是服务员要告诉顾客一下?
API通常是以Http的形式提供,它隐藏的含义就是,只要你符合我定义的标准,你就

可以来使用我。比如说,服务员是中国姑娘,顾客是美国人,没关系,只要美国人能说中国话,这套API就可以使用。如果美国人只会说英语,怎么办?让和美国人一起来吃饭的中国朋友翻译成中文,就可以了~~~~
那么什么是SDK呢?当美国人不会说中文的时候,饭店里的大堂经理来了,他来给美国佬当翻译。这就是SDK,SDK一般都是和语言相关,是官方提供的各种不同语言的实现版本。同样的,我们再把思维模式扩大一点。除了Http这种API,内部系统集成的组件,是否也是有API?你会发现,确实是这样的,比如说,JDK本身提供的各种API,在这里,API和SDK的概念没有那么清楚了,但是API本身的含义就是,当服务的提供方对外提供服务的时候,应该声明输入和输出和功能的明确含义。而一组组明确声明了的输入,输出和功能描述,就是服务方提供的各种API。比如说数组对外暴露的方法,链表对外暴露的方法等等。那么,API和方法之间有没有明显的区别呢?暴露出去的,可被公开使用的方法,统称为API~~~以上解释不够严谨,但是对于初学者来说,理解起来应该够了。如果你在理解API的时候有困难,大概问题并不是在API上,而是你有没有理解清楚什么叫做封装,什么叫做服务?

什么是接口服务器

接口服务器:与第三方系统接口, 但是原理是什么,上面安装何种程序,与应用服务器和数据库服务器关系?

%title插图%num

接口服务器,我是这么理解的:
假设系统A,这个系统A必须与另外一个单位的系统B做数据交互。但是两个系统的数据库结构甚至数据库软件都不一样,这个时候就必须做一个数据接口来进行两个系统的数据互导。
比如说在某种触发条件下,把系统A数据库表格1第二个字段里的数据,导入到系统B数据库表格2第三个字段中。
以上工作就交给接口服务器来做,既可以防止双方数据库服务器直接互联造成的数据外泄风险,也可以减少双方数据库服务器的负担。
至于接口服务器上装什么软件,一般是数据库(ORACLE、MYSQL等等)和数据接口程序。

服务器分几种

服务器分几种
服务器英文名称为“Server”,指的是网络环境下为客户机(Client)提供某种服务的专用计算机,服务器安装有网络操作系统(如Windows 2000 Server、Linux、Unix等)和各种服务器应用系统软件(如Web服务、电子邮件服务)的计算机。这里的“客户机”指安装有DOS、Windows 9x等普通用户使用的操作系统的计算机。
服务器的处理速度和系统可靠性都要比普通PC要高得多,因为服务器是在网络中一般是连续不断工作的。普通PC死机了大不了重启,数据的丢失损失也仅限于单台电脑。服务器则完全不同,许多重要的数据都保存在服务器上,许多网络服务都在服务器上运行,一旦服务器发生故障,将会丢失大量的数据,造成的损失是难以估计的,而且服务器提供的功能如代理上网、安全验证、电子邮件服务等都将失效,从而造成网络的瘫痪,对服务器可靠性的要求可见一斑。
服务器的种类
按照不同的分类标准,服务器分为许多种,主要有按网络规模、按架构(芯片)、按用途、按外观
1、按网络规模划分
按网络规模划分,服务器分为工作组级服务器、部门级服务器、企业级服务器。
工作组级服务器
用于联网计算机在几十台左右或者对处理速度和系统可靠性要求不高的小型网络,其硬件配置相对比较低,可靠性不是很高。
部门级服务器
用于联网计算机在百台左右、对处理速度和系统可靠性中等的中型网络,其硬件配置相对较高,其可靠性居于中等水平。
企业级服务器
用于联网计算机在数百台以上、对处理速度和数据安全要求*高的大型网络,硬件配置*高,系统可靠性要求*高。
需要注意的是,这三种服务器之间的界限并不是*对的,而是比较模糊的,比如工作组级服务器和部门级服务器的区别就不是太明显,有的干脆统称为“工作组/部门级”服务器。
2、按架构划分(芯片)
按照服务器的结构,可以分为CISC(复杂指令集)架构的服务器和RISC(精简指令集)架构的服务器:
IA架构服务器(Intel Architecture Server)-即通常所讲的PC服务器,采用x86(CISC)芯片并且主要采用Windows NT/Windows2000、Linux、FreeBSD等操作系统的服务器,如Intel PentiumIII(P4)和Intel (P4)Xeon(至强)等。
RISC架构的服务器指采用非英特尔架构技术的服务器,使用RISC芯片并且主要采用UNIX操作系统的服务器,如SUN公司的SPARC、HP公司的PA-RISC、DEC的Alpha芯片、SGI公司的MIPS等;
由于RISC架构服务器的性能和价格比CISC架构的服务器高得多。近几年来,随着PC技术的迅速发展,IA架构服务器与RISC架构的服务器之间的技术差距已经大大缩小,用户基本上倾向于选择IA架构服务器,但是RISC架构服务器在大型、关键的应用领域中仍然居于非常重要的地位。
3、按用途划分
按照使用的用途,服务器又可以分为通用型服务器和专用型(或称“功能型”)服务器,如实达的沧海系列功能服务器。
通用型服务器是没有为某种特殊服务专门设计的可以提供各种服务功能的服务器,当前大多数服务器是通用型服务器。
专用型(或称“功能型”)服务器是专门为某一种或某几种功能专门设计的服务器,在某些方面具有与通用型服务器有所不同。如光盘镜像服务器是用来存放光盘镜像的,那么需要配备大容量、高速的硬盘以及光盘镜像软件。
4、按外观划分
按照服务器的外观,可以分为台式服务器和机架式服务器以及刀片服务器
1.台式服务器有的采用大小与立式PC台式机大致相当的机箱,有的采用大容量的机箱,像一个硕大的柜子一样,主要分为单塔式和双塔式,
2.机架式服务器的外形看起来不像计算机,而是像交换机,有1U(1U=1.75英寸)、2U、4U等规格,如下图所示。机架式服务器安装在标准的19英寸机柜里面。
刀片服务器
刀片服务器是一种称之为“HAHD(High Availability High Density,高可用高密度)”的低成本服务器平台,是专门为特殊应用行业和高密度计算机环境设计的。在结构上它比前面介绍的机架式服务器更紧凑,因为它像刀片一样非常薄,而且可以根据需要选择是否插入整个服务器系统的机柜中,所以称之为“刀片服务器”,如下图。主要应用集群服务。

有什么可以经过 HTTP 代理来反代网站的工具?

用于反代的机器需要通过一个 HTTP 代理服务器才能连接反代的目标服务器,有什么可以经过 HTTP 代理来反代网站的工具?
反代 代理 服务器 工具14 条回复 • 2021-06-24 16:50:02 +08:00
wengych 1
wengych 2 天前 via iPhone
nginx….
wengych 2
wengych 2 天前 via iPhone
privoxy
Rocketer 3
Rocketer 2 天前 via iPhone
nginx,还能附加 ssl
est 4
est 2 天前
cloudflared (旧称 argo ) 试试
theklf4 5
theklf4 2 天前 via iPhone
@wengych
@Rocketer
nginx 文档看了很多遍,没找到使用 HTTP 代理服务器连接目标的方法
hongdaworks 6
hongdaworks 2 天前
nginx ssl 。
谷歌 Http 反向代理 Https 反向代理
NSAgold 7
NSAgold 2 天前 via Android
B 在一个需要 http 代理才能访问 A 的环境下
现在希望 C 通过直接访问 B 的反代来实现访问 A

是不是这个意思
theklf4 8
theklf4 2 天前 via iPhone
@NSAgold 是的
lx0758 9
lx0758 2 天前 via Android
fd or charles
no1xsyzy 10
no1xsyzy 2 天前
https://stackoverflow.com/q/46803431/6202760
其实你想要的东西叫做『 HTTP 代理转换成(特定目标的)透明代理』

如果该网站有 HTTPS,而你不需要解包的话甚至可以直接做「 SNI 代理」

lbp0200 11
lbp0200 2 天前
你搜一下,NGINX 配合 Tomcat
wengych 12
wengych 1 天前
我有个疑问,这种需求是不是透过 tcp 端口转发就能实现了?然后在局域网内覆盖一下 dns 记录
zanelee 13
zanelee 1 天前
就是反代理和 http 代理网络是通的,http 代理和目标网络是一个?这样直接在 http 代理上的机器做个 nginx 反代不就可以了
theklf4 14
theklf4 20 小时 58 分钟前 via iPhone
@zanelee #13 http 代理的机器我动不了,而且只连内网。

GET 方法有没办法传递 token

有个网站,需要校验是否有权限,判断头部的 token 参数。

但是,直接在浏览器上输入网址后,能否自动头部添加 token 呢?

是不是只有 session+cookie 的方式了。

第 1 条附言 · 19 小时 2 分钟前
网页是服务端渲染,*次 get 请求就需要判断是否有权限,没权限就读取不到数据。
token 不能放在 url 后面,因为这样复制网址给别人就泄漏 token 了。

想到的一个方法是 Get 请求后如果发现没 token,则跳转到一个登录页面,在登录页面判断 localstroge 中是否有存储着 token,有的话把 token 设置到 header 中,然后重新发起请求。
第 2 条附言 · 3 小时 27 分钟前
场景是:网页是文档页面 https://easydoc.net/s/17790664
当前是 vue 做的,要做 SEO,所以准备改为服务端渲染了。
第 3 条附言 · 3 小时 25 分钟前
文档链接随时都可能复制给别人,所以 token 不能在链接中
token 用的是 jwt 生成的,所以有加密。
另外不要说加密了 token 就不会泄露了。
第 4 条附言 · 2 小时 1 分钟前
我一下没反应过来,应该是登录后把 token 存放到 cookie 就好了,对吧各位。
第 5 条附言 · 1 小时 50 分钟前
感谢各位,我想应该是 cookie 中多存一份 token 就可以搞定了。

不过我有还个特殊情况:
文档可以分享,可以设置密码分享,所以每个分享链接都有一个独立的分享 token,如果也是把 token 放入 cookie 中,打开的分享链接多了,token 也会很多,还会每次请求都自动带入到头部,不知道有没更好的解决方法。
token 头部 校验 Session80 条回复 • 2021-06-25 12:28:59 +08:00
lambdaq 1
lambdaq 22 小时 21 分钟前
再发明一个浏览器插件就可以实现了。。。
FaiChou 2
FaiChou 22 小时 21 分钟前
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Authentication
gefranks 3
gefranks 22 小时 19 分钟前
类似 ModHeader 这样的浏览器插件或者代理,用代理往请求里面塞 header
IvanLi127 4
IvanLi127 22 小时 10 分钟前 ❤️ 2
你没见过尾巴有个 ?token=xxxx 之类的 url 嘛?
kop1989 5
kop1989 22 小时 9 分钟前
没太懂。
1 、手动输入网址?那这个 token 哪来的?
2 、如果是 token 预先就知道,直接写在 url 里传参不就 ok 了?
wanguorui123 6
wanguorui123 22 小时 5 分钟前
header 、URL
malaohu 7
malaohu 21 小时 46 分钟前
整一个中间页 处理一下?
balabalaguguji 8
balabalaguguji 20 小时 50 分钟前
@kop1989 #5 token 在 localstorage 里面,如果是 post,就可以拦截请求,然后插入一个 token 到头部了,但是 get 就没办法了
balabalaguguji 9
balabalaguguji 20 小时 48 分钟前
@IvanLi127 #4 这样会泄漏自己的 token,复制链接给别人就知道 token 了
Yourshell 10
Yourshell 20 小时 10 分钟前
直接用 HTTP 验证不好吗

darknoll 11
darknoll 20 小时 3 分钟前
直接在地址栏里面输入的话只有作为查询参数带过去了,没有其他方法了
RangerWolf 12
RangerWolf 20 小时 3 分钟前
GET 请求也可以带有 header 啊。。。
RangerWolf 13
RangerWolf 20 小时 3 分钟前
请忽视我刚才的发言。。。 没看清题目
balabalaguguji 14
balabalaguguji 19 小时 56 分钟前
@Yourshell #10 能具体说一下吗?
yitingbai 15
yitingbai 19 小时 56 分钟前
有这样的浏览器插件, 可以加 header, 还可以改变 UA
Yourshell 16
Yourshell 19 小时 51 分钟前
@Yourshell 详看二楼的链接
KisekiRemi 17
KisekiRemi 19 小时 46 分钟前
axios 的请求拦截器把 token 塞进去
THESDZ 18
THESDZ 19 小时 46 分钟前
类似 S3 的签名可以吗?
就如果需要访问某一个地址,根据这个地址生成一个有时效的签名?
KisekiRemi 19
KisekiRemi 19 小时 45 分钟前
抱歉没注意看详细需求
TomVista 20
TomVista 19 小时 28 分钟前
token 存进 cookies
yeqizhang 21
yeqizhang 19 小时 18 分钟前 via Android
这标题取的,你这种情况和 get post 没关系啊,只是浏览器地址栏只能 get,是接口就放尾巴上,不过打开一个接口这是什么需求??如果打开网页,还可以将这个网页放行,里边的接口再用 js 加上吧
balabalaguguji 22
balabalaguguji 19 小时 16 分钟前
@yeqizhang #21 是服务端渲染页面,*次 get 请求时就需要知道是否有权限访问,没 token 就没法判断
yeqizhang 23
yeqizhang 19 小时 13 分钟前 via Android
@balabalaguguji 那只能加尾巴或者 cookie 了
balabalaguguji 24
balabalaguguji 19 小时 6 分钟前
@malaohu #7 嗯,整个中间页应该是可以的
balabalaguguji 25
balabalaguguji 19 小时 5 分钟前
@yitingbai #15 面对所有用户的网页,不能依赖插件
balabalaguguji 26
balabalaguguji 19 小时 0 分钟前
@Yourshell #16 这个方式好像是弹出系统的登录框?怎么设置 token 到头部还是没看懂
iceheart 27
iceheart 18 小时 56 分钟前 via Android
cookie 被设计出来就是干这个的
baobao1270 28
baobao1270 15 小时 55 分钟前
jwt?
hjiang 29
hjiang 14 小时 33 分钟前
在古代,cookie 还没有被发明的时候,程序员就是在 URL 后面加上 sid=xxxxxxxxx 这样的方式记录登录状态的。

当然,这样是安全性*差的。
dangyuluo 30
dangyuluo 13 小时 19 分钟前
GET 请求也是可以有 body 的,不过默认浏览器不会用。你写个浏览器就可以了。。
xiadong1994 31
xiadong1994 11 小时 49 分钟前 ❤️ 1
你倒是说为啥不用 session+cookie 啊
nvkou 32
nvkou 11 小时 2 分钟前 via Android
等等…就算是服务器渲染也可以加脚本吧。现在还有不用 xhr 的网站?
ThomasTrainset 33
ThomasTrainset 5 小时 48 分钟前 via iPhone
让用户装插件不现实,我觉得你可以把 token 拆成几部分,混淆到 url 里,取的时候按照一定规则取就好了,有需要的话,再将这种 token 失效时间搞的短一点。
ladypxy 34
ladypxy 5 小时 42 分钟前
URL 里加参数啊
liuidetmks 35
liuidetmks 5 小时 4 分钟前
我也很烦在 head 里面设置 token 的接口,

每次出问题,想调试起来非常不方便。

但是后端大佬定的,没得法
Quarter 36
Quarter 4 小时 51 分钟前 via iPhone
感觉这种自动添加的浏览器打开 URL 的好像只有 cookie 的方式,cookie 会每次请求自动添加到 header,其他的好像都需要处理
LiuJiang 37
LiuJiang 4 小时 49 分钟前
@balabalaguguji 不能做加密操作?
Quarter 38
Quarter 4 小时 43 分钟前 via iPhone
然后至于 token 的放在 URL 里面被窃取,我觉得有两种方式

一种,加上 token 和 IP 绑定,这样如果 token 被窃取,但是网络环境不一样可以防御一些,但是无法防御在同一公网出口的情况

另一种就是 vue 的方式,加载统一入口,然后通过 ajax 获取动态路由或者其他的路由方法鉴别权限,这样不用拦截前端界面,由前端自行判断拦截,后端主要做接口拦截,前端在统一做接口处理,如果未授权就跳转无权限界面,如果未登录跳转登录界面
JKeita 39
JKeita 4 小时 34 分钟前
我们公司有个后台就是需要在浏览器插件里面添加 header,应该是一个样。
balabalaguguji 40
balabalaguguji 4 小时 27 分钟前
@xiadong1994 #31 因为网站一早就是用的 token 现在某些页面改为服务端渲染才遇到这个问题,另外 token 更好做负载均衡等
liyunyang 41
liyunyang 4 小时 27 分钟前
连接后面加 jwt 认证,token 加密在里面
balabalaguguji 42
balabalaguguji 4 小时 26 分钟前
@liyunyang #41 没看清题目哦,不能放链接后面,不管有没加密。
Felldeadbird 43
Felldeadbird 4 小时 25 分钟前
我一般丢 URL 。简单粗暴,确保 SSL 环境即可。时效一般不长。如果要提高安全性,就结合唯一指纹,时间,拆分伪装。
balabalaguguji 44
balabalaguguji 4 小时 24 分钟前
@Felldeadbird #43 如果已经登录过了,第二天用户输入 url 后还要自己输入自己的 token,多不现实。
dbpe 45
dbpe 4 小时 20 分钟前
@balabalaguguji session 是基于 cookie 的..早期一些移动设备不支持 cookie 的,那么 tooken 就诞生了…

PS:没登录不应该是提示没权限么..怎么就白屏了..
falcon05 46
falcon05 4 小时 14 分钟前 via iPhone
用不用 token 跟用不用 cookie 是两码事,token 可以存放在 cookie,也可以存放在 local storage 。
lusi1990 47
lusi1990 4 小时 10 分钟前
听大家的 先搞懂 cookie , session, token 的概念
balabalaguguji 48
balabalaguguji 4 小时 5 分钟前
@lusi1990 #47 你先读懂题目
xwayway 49
xwayway 4 小时 0 分钟前
你的 url 是直接走的接口?不是的话,应该是前端页面吧,到了你页面,你在页面内 js 去处理就行了啊。虽然不太熟悉现在 vue 什么的的逻辑。但是写过老式的 jq 那套,可以在页面 load 的时候,去读取 localstorage,判断有没有 token 啊。拿到了 token 再去请求后端接口。没有去登录页面,难道不都是这么做的?
balabalaguguji 50
balabalaguguji 3 小时 54 分钟前
@xwayway #49 是服务端渲染的页面,所以*步是到了服务端,得判断是否有权限然后才决定是否渲染数据。
pkoukk 51
pkoukk 3 小时 53 分钟前
token 为啥不能放进链接里?放哪儿不都会泄露?我们理解的 token 是用户输入自己的秘钥之后,服务端返回的有时效性的一个 Id.
如果你要限制 token 的使用范围,不希望复制就会泄露,那很简单啊,服务端对 token 做管理,ip mac 限定这个 token 必须和申请时相同就行。
cloverzrg2 52
cloverzrg2 3 小时 48 分钟前
业务场景是啥,你这可能是 XY 问题
balabalaguguji 53
balabalaguguji 3 小时 46 分钟前
@pkoukk #51 复制页面地址给别人后,是不是 token 就泄露了,地址是可以方便复制分享的。
NillSpake 54
NillSpake 3 小时 42 分钟前
服务器点对点访问,代理一波,nginx 开放访问,通过 lua 或者手动修改 header 请求头,追加参数
Anshi 55
Anshi 3 小时 39 分钟前
这是要获取页面的那个 get 请求也能携带身份信息吧,这个请求一般是浏览器自己发出的吧,不用 cookie 还真不知道有啥办法。。。
balabalaguguji 56
balabalaguguji 3 小时 39 分钟前
@NillSpake #54 没了解过,但是这样你怎么拿到 token,特别是用过了几天后再来访问,localstorage 里面是还有 token 的,nginx 里面你怎么拿到
balabalaguguji 57
balabalaguguji 3 小时 38 分钟前
@Anshi #55 直接输入地址要在头部带东西,似乎只有 cookie 了。不然就做中间页做判断。
SmiteChow 58
SmiteChow 3 小时 34 分钟前
Basic Auth
passerbytiny 59
passerbytiny 3 小时 31 分钟前 via Android
你*好补充一个说明,目前不知道你的问题是哪一种。是通过地址栏输入 URL *次访问的时候 Header 中没有 Token,还是因为服务器端渲染每个 GET 请求都没 TOKEN 。
balabalaguguji 60
balabalaguguji 3 小时 22 分钟前
@passerbytiny #59 已经补充了,看上面 append 。已经登录过了,后面手动输入地址在浏览器访问时如何自动设置 token 到头部。
Rheinmetal 61
Rheinmetal 3 小时 21 分钟前
需求的核心逻辑不清楚 没法给可用方案
Felldeadbird 62
Felldeadbird 3 小时 16 分钟前
@balabalaguguji 肯定不用用户手动输入了。以小程序为例,我是放在 local storage 。里面有时效和设备信息。然后和小程序官网的设备信息校验。

在鉴权方面,根据接口的情况,选用 GET OR POST 形式把 TOKEN 从 local storage 带过去。一般来说,会封装好一个请求方法,里面自带鉴权 TOKEN 提交。
feifeichen 63
feifeichen 3 小时 6 分钟前
浏览器里域名对应的储存不就是 cookie 和 storage 数据库,但是只有 cookie 是浏览器自动添加的,你不想用 cookie 。用户浏览器输入的域名又不会走脚本,不就只有访问到的这个地址去进行操作。判断跳转中间页那个实现方法比较现实点
NillSpake 64
NillSpake 3 小时 5 分钟前
@balabalaguguji 中间件,redis 等等。。,你可以后台操作 token 时效
jsq2627 65
jsq2627 3 小时 4 分钟前
有一说一,拦截 get 请求、附加 header 用 service worker 能实现
只是这需求,放着 cookie 不用干嘛
xwayway 66
xwayway 3 小时 1 分钟前
@balabalaguguji 非要这么搞的话,我觉得可以用 cookie 了,后端加个兼容逻辑就行了,header 取不到 token,再取 cookie 中的嘛,都没有才走认证逻辑
xwayway 67
xwayway 2 小时 59 分钟前
@balabalaguguji 也不一定是后端做,在 nginx 做就行了,如果 header 中没有 token,从 cookie 中取出来,放 header 里面就行了
passerbytiny 68
passerbytiny 2 小时 58 分钟前 via Android
@balabalaguguji 你的真实问题是不是:GET 时,怎么将 localstorage 中保存的 Token,带到 Header 上。

地址栏输入地址的 GET,跟代码调起来的 GET,大概也就这一点区别。而且这问题不只发生在地址栏访问上,点击超链接的跳转同样会发生该问题。
fgk 69
fgk 2 小时 57 分钟前
@xwayway 我也觉得这个业务场景,cookie 就可以满足了,不用 token 了
ysc3839 70
ysc3839 2 小时 54 分钟前 via Android
把 token 放在 cookie 里不行吗?一样是在 header 里面传给后端。
no1xsyzy 71
no1xsyzy 2 小时 48 分钟前 ❤️ 2
一个 SPA 改 SSR ?

服务器在浏览器上存数据,就是 cookies localstorage idb 三剑客,后面两个只能 js 访问

没权限就白屏,还 SEO,那搜索引擎的 spider 哪来的权限呢?
你就当没权限的渲染,然后渐进地提供需要 token 的部分啊?
beichenhpy 72
beichenhpy 2 小时 31 分钟前
套一个 iframe 行吗
zhaol 73
zhaol 2 小时 31 分钟前
@no1xsyzy #71 按他这么说,就必须一开始就有 token,不然这网页没得玩。我实在没理解他的需求。难道本不应该就存在没权限情况下的判断嘛,按那个逻辑继续处理不就行了?
balabalaguguji 74
balabalaguguji 2 小时 3 分钟前
@zhaol #73 没登录过就直接跳转到登录页面了,这个没什么争论所以不讨论。只讨论已登录情况
balabalaguguji 75
balabalaguguji 2 小时 2 分钟前
@falcon05 #46 之前是放在 localstorage 里的,嗯,我应该把它改为放在 cookie 就可以了。
balabalaguguji 76
balabalaguguji 1 小时 56 分钟前
@xwayway #66 嗯,cookie 中多存一份 token,这种方式感觉挺好。不过还有个问题,我分享项目时用的是分享 token 每个项目都会有一个,如果也用 cookie 来存储这些分享 token,打开很多个项目的分享页面后 token 就会很多了。
balabalaguguji 77
balabalaguguji 1 小时 55 分钟前
@ysc3839 #70 嗯,你点醒了我,我之前一直想着 cookie 是配合 session 用的,用来存储 session id 的,怎么就没想到可以存 token 呢(哭)
no1xsyzy 78
no1xsyzy 1 小时 47 分钟前
@balabalaguguji #74 根据附言 2,你不是在做 SEO 吗?
可是搜索引擎的 spider 访问你,你直接跳转登录界面了,那不是白瞎?也就是说实际情况,如果我猜的没错的话,是「部分页面需要权限,则跳转登录页,部分页面公开访问,需要做 SEO 」
那我还是推荐一下渐进式体验。

#76 你可以把所有的项目分二级域名或者子目录,cookies token 存到对应下面。
pluvet 79
pluvet 1 小时 32 分钟前
用 url 传也可以,但是 token 做成动态的,类似 2fa
balabalaguguji 80
balabalaguguji 1 小时 18 分钟前
@no1xsyzy #78 是的,部分页面是完全公开不需要授权的