先说调研的结果
url的参数是hash形式,比如state={user_id: 2, sign='hello'},如果写到url里应该写成:
http://root/path?state[user_id]=2&state[sign]=%2Fhello(注:引号需要编码)
下面找到这个答案的过程:
1、查url参数:URL 参数是追加到 URL 上的一个名称/值对,参数以问号"?"开始并采用 name=value 的格式。多个参数时参数之间用“&”符号隔开。如:http://server/path/document?name1=value1&name2=value2;
1.1value常用的类型是string,也可以是数组,对象
1.2如果是数组,就写成name[1,2],数组的元素之间不要用空格,如果真的需要就对参数编码。如:http://server/path/document?name=[1,2]或者http://server/path/document?name=%5b2%2c+3%5d
1.3如果是对象,不要写成name={key_1: value_1, key_2: value_2}的形式,直接写成key-value形式,即使进行编码也会报baduri的错误,正确的写法应该是:name[key_1]=value_1&name[key_2]=value_2.如:http://server/path/document?name[key_1]=value_1&name[key_2]=value_2
2、因为用request测试,发现get方法传的第二个参数即是url的参数,但是这个参数是原味的hash,如下:
写了一个request测试用例A:
it "should login" do
state = {user_id: user.id, redirect_url: '/mobile'}
get "/mobile/login", {state: state, code: code}
expect(response).to redirect_to('/mobile')
end
state是所传的参数,是个hash形式,如果url写成:get "/mobile/login?{state: {user_id: user.id, redirect_url: '/mobile}, code: '123’}”就报错了:bidder。
刚开始对baduri的错误信息不知道如何打log看更多信息,就直接查baduri的错误,没有找到参数是hash的url,所以也就不知道参数是hash的url到底哪不对;然后尝试将hash参数进行encode编码,依然报baduri的 错误;
之前对引入的第三方库的代码,也就是源码,很少去看,更不会想到通过源码去调试。经前辈循序渐进的指点,才去看源码,尝试在源码的get方法里打log,发现打不出log,但是确实跟踪到get方法的源码了,就想当然地认为无法在控制台打印出第三方库的信息;然后只好老实地读代码,但是发现源码的方法一个套一个,这也无所谓,我只要知道url组成的方法就行,所以找到build_url的方法,里面同样套了很多方法,而且看不懂的代码也不少,实在读不下去了,最后想硬着头皮去查,打算弄懂所有的代码,可是这样做很不现实,等弄明白的时候都不知道何年何月了。在尝试在源码里打log的做法失败后,只好继续去读源码,可能是资料看得多了,最关键词有一定敏感度了,再看源码,居然注意到了request和response变量,reponse实在request请求之后得到的响应,那么排除response,也就是request了,最后在build_request_uri方法里发现了四行行很有用的代码:
line1: url, query_string = @routes.url_for(options).split("?", 2)
line2: @request.env["SCRIPT_NAME"] = @controller.config.relative_url_root
line3: @request.env["PATH_INFO"] = url
line4: @request.env["QUERY_STRING"] = query_string || “"
猜测line1是将url通过“?”分成两部分分别赋值给url喝query_string, 那么query_string就是url所带的参数,跟着看到line4中将query_string赋值给@request.env["QUERY_STRING”],所以我猜测要的url参数就是@request.env["QUERY_STRING”]了,然后就试着在测试用例A的get请求之后打印出@request.env["QUERY_STRING”]:
it "should login" do
state = {user_id: user.id, redirect_url: '/mobile'}
get "/mobile/login", {state: state, code: code}
p @request.env["QUERY_STRING”]
expect(response).to redirect_to('/mobile')
end
打印的结果是:“state[user_id]=2&state[redirect_url]=%2Fmobile&code=123”,现在结果已经出来了,hash参数是可以传的,但是需要将每个元素单独拿出来做参数放在url里。
在调试的过程中,前辈提醒我去读源码,但是一看源码那么多,就读不下去了,放弃读源码后,又是一阵瞎猜乱试,甚至到最后都忘了自己是为了找出hash的参数是如何组装的,而变成否定url中的参数不能是hash形式的。调试不能单纯地靠猜,靠瞎调试;读源码要抓住关键信息,不必弄明白所有的源码。
相关推荐
网址哈希为防篡改 url 添加哈希参数的节点库注意:此模块不适用于涉及敏感数据的应用程序。 它提供了一个简单的限制,以避免篡改 url 参数,或为链接添加基本的到期时间。基本用法将哈希添加到 url // require ...
**Nginx与url_hash插件** Nginx是一个高性能的HTTP和反向代理服务器,以其轻量级、高并发处理能力以及丰富的模块扩展性而闻名。然而,Nginx本身并不内置支持url_hash功能,这是一个用于负载均衡的策略,通过将特定...
在本文中,我们将深入探讨如何在Nginx服务器上配置URL哈希(url_hash)转发方式,这是一种负载均衡策略,用于将特定的URL请求路由到特定的后端服务器。这种配置适用于需要根据URL保持会话状态的应用场景,比如动态...
RS-Hash Function Value: " + ghl.RSHash(key)); System.out.println(" 2. JS-Hash Function Value: " + ghl.JSHash(key)); System.out.println(" 3. PJW-Hash Function Value: " + ghl.PJWHash(key)); System....
代码重点是hash_table,附加std::map与其做对比,实现的是一条sql语句:select c_nationkey, c_mktsegment, count(*), max(c_acctbal) from aaa_customer_1g group by c_nationkey, c_mktsegment order by c_...
hash_param hash_param是一个库,可将带有单个“数据”参数Hash的函数转换为带有命名形式参数的函数。 这样可以使ActionCable之类的API更加易于使用。 例如,它可以将其变为: class ChatChannel < ...
React自定义钩子以从URL获取哈希值。 目录 安装 npm: npm install react-hash 纱: yarn add react-hash 用法 import React from 'react' ; import { useHash } from 'react-hash' ; const App = ( ) => { ...
它可以使用PBKDF2 hmac SHA1 ...下载Maven: < dependency> < groupId>com.amdelamar</ groupId> < artifactId>jhash</ artifactId> < version>2.2.0</ version></ dependency> Gradle: dependencies { compile ' ...
关于如何使用jQuery获取URL及URL参数的知识点,可以从以下几个方面进行详细解读: 1. 获取URL的基本方法 在网页中,可以通过JavaScript的基础window对象直接获取当前页面的完整URL。具体代码如下: ```javascript ...
### JavaScript 添加 URL 参数知识点详解 在 Web 开发中,经常需要动态地修改 URL 地址中的查询参数。本文档详细介绍了如何使用 JavaScript 来添加或更新 URL 的查询参数,并提供了完整的示例代码。 #### 一、核心...
在复合材料领域,Hashin失效准则是一个非常重要的理论模型,尤其在分析三维层合板的强度和稳定性时。Hashin准则由Stanley Hashin在20世纪60年代提出,用于预测多向复合材料的破坏行为。这个准则考虑了内部微裂纹的...
网格哈希网格给定一个边界框,流出哈希网格npm install geohash-grid -g用法geohash - grid 53.639554 - 113.654585 53.440018 - 113.349715 并且输出将是NDJSON像{"hash":"c3x25bw","row":145,"col":199}{"hash":...
1. **材料参数的定义**:首先需要确定材料的各种参数,如纤维和基体的弹性模量、剪切模量、断裂强度等,以及界面的粘合强度等。 2. **能量释放率计算**:根据Hashin准则,需要计算各个失效机制的能量释放率,这是...
useHashParam React挂钩可让您的状态与URL参数保持同步。安装npm install --save use-hash-param用法import React from 'react' ;import useHashParam from 'use-hash-param' ;function ControlledInput ( ) { const...
5. **整合进业务逻辑**:将`geohash`与你的应用程序结合,例如在用户注册时记录他们的位置,然后在搜索或推荐场景中使用`geohash`进行高效的定位服务。 总的来说,`geohash`为PHP开发者提供了一种强大的工具,它...
var hash:String = ExternalInterface.call("eval", "window.location.hash"); ``` 这段代码将返回片段标识符部分,例如`#love`。 #### 获取URL参数的实例 为了更好地理解如何处理查询字符串中的参数,下面提供了...
内容描述:用于crypto中hash爆破的强大工具。 优势:相较于其他hash工具,具有更快的算力,使用方便简洁。 适用:适用于md5,sha256等典型hash加密方式,反推出所需的源码。
安装将此添加到应用程序的shard.yml : dependencies : hash_ring : github : TobiasGSmollett/hash_ring用法require " hash_ring "# Register 3 servershash_ring = HashRing :: HashRing .new([ " one " , " two ...
1. **编码地理位置**:将经纬度转化为Geohash字符串,这一步是将实际的地理位置数据转换为适合存储和查询的形式。 2. **解码Geohash**:将Geohash字符串转换回经纬度,以便获取具体的位置信息。 3. **范围查询**:...
hashcat is the world’s fastest and most advanced password recovery tool. This version combines the previous CPU-based hashcat (now called hashcat-legacy) and GPU-based oclHashcat. Hashcat is ...