xhr请求有两个sessionid_接口测试:A06_HttpRunner关联_01_SessionID 问题引入

介绍HTTP无状态特性及如何使用SessionID确保用户身份唯一性。通过提取并管理SessionID,实现跨请求的身份验证。

A06_HttpRunner关联_01_关于SessionID问题的引入

HTTP 是一个无状态的协议,每次请求之后不会留下任何痕迹。就像是有一个失忆的家伙,从来记不住是谁到过他家里,客人必须每来一次都重新告诉他姓名。如果碰到这么一个傻服务器,这就麻烦了,每访问一个页面都要重新输入一次用户名和密码,这肯定要让人崩溃的。

9867e0bfe32f44fb1f4d9c59ba3d3051.png

于是为了避免这种问题的发生,就需要一个机制来记忆每个用户的身份,即给每个客户发放一个凭证,因此 Cookie、Session、Token、JWT、OAuth2 等这些技术应运而生。那么我们在进行接口测试的时候,就需要把服务器第一次发给我们的这些凭证拿到,在后续请求中再把这些凭证传给服务器来验明正身。

这个过程主要涉及两个操作:

  1. 发送第一个请求(可以带上用户名密码等信息),从服务器的响应中提取凭证信息。
  2. 发送后续请求,请求中要附带前面取得的凭证信息,从而模拟前一个的用户身份。

案例分析

浏览器和服务器之间,通过一种 Cooke + Session 的技术,可以保证记住访问的用户及其身份,这样访问一个系统的时候,只要输入一次用户名和密码就可以了:

  • 浏览器首次访问服务器的时候,服务器返回一个唯一的 SessionID 编号(见图中红线部分)
  • 该 SessionID 对应于服务器中的某块存储空间(内存或数据库中),称之为 Session
  • 该 SessionID 通过响应头域“Set-Cookie”传递给浏览器端
  • 该 SessionID 被浏览器保存于临时“cookie”中
  • 后续该浏览器向该服务器发起的所有请求,都会把这个 SessionID 附带上
  • 一般登录成功后,服务器会将用户信息(如用户ID)保存到 Session 中
  • 服务器通过请求附带的“SessionID”找到对应的“Session空间”,再读取里面的用户信息,就可以判断用户身份了。

综上,在进行测试的时候,我们要模拟一个用户的请求,就要获取到该用户的 SessionID

3a84cfbd82e4ab60b6a10bcd3cf018be.png

访问登录页面,第一次请求,服务器返回的响应信息中,包括了需要提取的 sessionid

注意:

1. 在本被测系统中, SessionID 是保存在临时 Cookie 中的一个“键-值对”

2. 每次会话都会生成一个新的 SessionID(此会话期间各请求的SessionID不变),其中:

  • “键”的名称,前面部分是固定不变的,后面部分是可能会改变的
  • “值”的部分,每次会话都会不同
bef7ba74f15c4fb8c939c46210ff3a82.png

服务器返回的 SessionID 图解

需要解决的问题:

1. 从响应中提取 SessionID,为后续请求做准备

思路:将提取出来的 SessionID 保存到一个变量中,后续请求直接调用即可

2. 该系统中的 SessionID 名称是不固定的

思路:通过正则表达式的方式解决名称变化

<think> 我们正在讨论如何通过F12开发者工具查看特定网页元素(id为"num_-188")对应的SQL ID。这里的关键点在于:SQL ID通常不会直接存储在HTML元素的属性中,而是通过JavaScript事件或网络请求与后端交互时传递的参数。我们需要追踪该元素触发的事件(如点击事件)所发送的网络请求,从请求参数中提取可能作为SQL查询条件的值(如数据库主键ID)。 以下是具体步骤: 1. **定位元素并检查属性**: - 打开F12开发者工具(快捷键F12或右键“检查”)。 - 在Elements面板中使用Ctrl+F搜索`id="num_-188"`,定位该元素。 - 检查该元素是否有自定义数据属性(如`data-id`、`data-key`等),这些属性可能存储与SQL ID相关的值。例如: ```html <div id="num_-188" data-sql-id="1001">...</div> ``` 如果存在类似属性,其值(如1001)可能是SQL查询使用的ID[^2][^5]。 2. **检查事件监听器**: - 在Elements面板中右键点击该元素,选择“Break on” → “subtree modifications”或“attribute modifications”(可选,用于调试动态变化)。 - 切换到Console面板,输入`getEventListeners(document.getElementById('num_-188'))`查看绑定的事件(需在Chrome中执行)。 - 如果存在点击事件,记录其调用的函数名(如`handleClick`)以便在Sources面板中查找源码。 3. **监控网络请求**: - 切换到Network面板,勾选“Preserve log”(防止页面跳转请求丢失)。 - 触发该元素的交互(如点击),观察新出现的网络请求(通常为XHR或Fetch类型)。 - 点击请求查看详情: - **Headers选项卡**:检查请求URL中的查询参数(如`?id=1001`)或请求体(Payload中的JSON字段如`{"id":1001}`)。 - **Response选项卡**:查看返回数据是否包含SQL ID(例如返回的JSON数据为`{"id": 1001, "value": "..."}`)。 4. **关联后端SQL映射**: - 若请求的URL为`/api/data/1001`,则`1001`可能直接作为SQL查询条件(如`SELECT * FROM table WHERE id = 1001`)。 - 若项目使用MyBatis等框架,可通过请求路径推测对应的Mapper方法(如`DataMapper.selectById`)进而找到XML中的SQL ID(如`<select id="selectById">`)[^5]。 ### 注意事项 - **动态生成ID**:类似`num_-188`的ID可能由前端框架动态生成(如Vue组件实例ID),此时需查找更稳定的数据属性(如`data-user-id`)。 - **负数ID处理**:`-188`可能表示临时数据标识而非真实数据库ID,需结合业务逻辑判断。 - **安全限制**:若请求需认证,需确保开发者工具打开时已登录。 若上述步骤无法直接获取SQL ID,可能需要结合后端日志或源码进一步分析(如查看控制器方法参数绑定)[^1][^5]。 §§相关问题§§ 1. 如何通过Chrome开发者工具监听特定元素的JavaScript事件? 2. 在MyBatis框架中,如何根据HTTP请求参数定位Mapper文件中的SQL语句? 3. 前端动态生成的元素ID(如`num_-188`)在调试时有哪些替代追踪方法? 4. 如何确保从网络请求中提取的ID参数与数据库主键正确映射? </think> ### 查看`id="num_-188"`网页元素对应SQL ID的方法 针对您查询的特定元素(ID为`num_-188`),以下是结合引用内容和F12工具的实操步骤: --- #### 1. **检查元素属性(Elements面板)** - 右键点击`num_-188`元素 → 选择"检查"(或按`Ctrl + Shift + C`直接定位) - 在**Elements面板**中查看其属性: - **关键属性**: ```html <div id="num_-188" data-sql-id="USER_001"> <!-- 类似data-sql-id的自定义属性 --> </div> ``` - 若存在`data-*`属性(如`data-id`、`data-key`),其值可能是SQL ID(例如`USER_001`),这类属性常存储数据库标识[^2]。 - 若属性值为负数(如`-188`),需检查JavaScript是否动态转换(步骤2)。 #### 2. **追踪事件绑定(Console面板)** - 在**Elements面板**右键元素 → 选择"Copy" → "Copy selector"(获取CSS选择器`#num_-188`) - 在**Console面板**输入: ```javascript // 查看绑定的事件监听器 getEventListeners(document.querySelector('#num_-188')) ``` - 观察输出中的`click`或`change`事件: ```javascript // 示例输出 { click: [{ listener: function(e) { fetch(`/api/data?id=${this.dataset.sqlId}`) // 提取SQL ID } }] } ``` 这里的`this.dataset.sqlId`可能包含SQL ID(如`USER_001`)[^5]。 #### 3. **分析网络请求(Network面板)** - 触发元素操作(如点击),在**Network面板**过滤XHR/Fetch请求 - 检查请求参数: - **URL参数**:如`/api/data?id=USER_001` - **请求体**:如JSON `{"id": "USER_001"}` - 结合引用[1]中的SQL模式: ```sql SELECT ... FROM user_id_info_new WHERE user_id = 'USER_001' -- 匹配请求参数[^1] ``` #### 4. **处理特殊ID值(如`-188`)** - **负数ID的可能含义**: - 临时生成的测试数据(如引用[3]的`Data`类中的`m/n`数值)[^3] - 数据库中的特殊标记(如冻结账户) - **转换逻辑**: 通过**Sources面板**调试关联的JavaScript文件,搜索`num_-`: ```javascript // 示例:将负数转换为正数ID const elementId = "num_-188"; const sqlId = elementId.split('_')[1].replace('-', 'ABS_'); // 输出"ABS_188" ``` --- ### 关键排查点 1. **属性优先**:检查`data-sql-id`等自定义属性(最快定位) 2. **动态生成**:若ID含负号,需调试JS转换逻辑(如`ABS()`函数) 3. **参数匹配**:网络请求中的参数值通常直接对应SQL WHERE条件[^1][^2] > 如果元素无显式属性,需结合后端日志验证:在Network面板复制请求cURL命令,模拟请求并比对数据库日志中的SQL ID执行记录[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值