RAD Studio/Delphi及RAD Server技术问询:添加JSON键值对与会话令牌跟踪
问题2:RAD Server中跟踪REST客户端的会话令牌
RAD Server的内置认证生成的会话令牌,其实是由TRestSessionManager统一管理的,完全不需要依赖Sencha/ExtJS,纯HTML/JS客户端就能实现,我给你梳理下具体步骤:
1. 服务器端如何跟踪会话令牌
在你的RAD Server REST资源方法中,可以直接获取当前请求的会话令牌,并通过会话管理器获取会话详情:
procedure TUserResource.GetUserProfile(const AContext: TRESTContext; const ARequest: TRESTRequest; const AResponse: TRESTResponse); var LSession: TRestSession; begin // 从请求中自动解析Authorization头里的Bearer令牌 if Assigned(ARequest.SessionToken) then begin LSession := RESTSessionManager.GetSession(ARequest.SessionToken); if Assigned(LSession) then begin // 返回当前登录用户的基本信息 AResponse.Content := Format('当前用户:%s,登录时间:%s', [LSession.Username, LSession.CreationTime.ToString]); // 还可以往会话中存储自定义数据,比如上次访问时间 LSession.Data['last_access'] := Now.ToString; end else AResponse.StatusCode := 401; // 令牌无效 end else AResponse.StatusCode := 401; // 请求未携带令牌 end;
如果需要做更复杂的跟踪(比如会话日志、超时提醒),可以继承TRestSessionManager,重写CreateSession、DestroySession方法,在这些钩子中加入自定义逻辑,比如把会话创建记录写入业务数据库。
2. HTML客户端如何携带令牌
登录成功后,服务器会返回会话令牌(通常在响应体或者X-RAD-Session-Token响应头里),客户端需要把这个令牌存在本地(比如localStorage),之后每次请求都带上:
// 登录成功后保存令牌到本地 fetch('https://your-rad-server/api/auth/login', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({username: 'test_user', password: 'your_password'}) }) .then(res => res.json()) .then(data => { localStorage.setItem('rad_session_token', data.token); }); // 后续请求携带令牌访问资源 fetch('https://your-rad-server/api/user/profile', { method: 'GET', headers: { 'Authorization': 'Bearer ' + localStorage.getItem('rad_session_token'), 'Content-Type': 'application/json' } });
如果你的RAD Server配置了自定义令牌头,也可以用X-Session-Token: <token>这种方式,服务器端通过ARequest.Headers.Values['X-Session-Token']获取令牌后,再调用RESTSessionManager.GetSession查找会话。
3. 关键配置提醒
- 在RAD Server管理控制台中,确保
Session Manager的配置正确,比如会话超时时间、存储方式(内存或数据库),生产环境建议用数据库存储会话,避免服务器重启丢失会话数据。 - 一定要用HTTPS传输令牌,防止被中间人窃取。
内容的提问来源于stack exchange,提问作者cryophoenix
相关产品推荐
相关产品推荐

