尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Delphi WebService 使用 HTTP Header 管理 Session
背景知识使用 Delphi 的 WebBroker 框架可以开发标准的 Web Server 程序。使用 Delphi 的 SOAP 框架可以开发支持 SOAP 标准的 WebService 服务端程序。此框架建立的 WebBroker 框架之上。使用 Delphi 可以开发客户端程序去调用 WebService 服务器提供的 SOAP 函数。同时也可以去调用 WebBroker 开发的 Web Server 提供的 RESTfull 的 URL 接口。问题WebBroker 的架构下客户端和服务器端没有长连接是无状态的。也就是服务器端并不能记住客户端的上一次访问。因此需要一个 Session 机制。因为是 Web 访问可以采用 HTTP Cookie 来让客户端和服务器端之间维护一个 Session。这个方式的好处是客户端基本上不需要写代码。但是如果应用程序的代码框架比较复杂比如同一个客户端可能需要访问多个不同的 WebService 服务器端甚至同时还要访问多个 WebBroker 的 WebServer 服务器端。此时Cookie 因为不能跨域从一个 WebService 服务器端程序获得的 HTTP Cookie 无法让另外一个服务器端程序读到。如果要在多个 WebService 服务器端程序之间保持同一个 Session则需要考虑使用另外两种方式1. 在 URL 里面加上 Session 有关的参数2. 在 HTTP Header 里面加上 Session 有关的参数使用 HTTP Header 来维护 Session 的代码实现客户端客户端如果使用 HTTRIO 去调用服务器端的函数设计期选中 HTTPRIO1属性面板里面事件标签页HTTPWebNode 下拉开找到OnBeforePost事件双击产生事件方法代码uses Soap.SOAPHTTPTrans; procedure TForm2.HTTPRIO1HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp; Client: THTTPClient); begin Client.CustomHeaders[ABC] : abcdexyz; end;则每次使用这个 httpRIO1 来调用服务器端方法时都会为 HTTP 加上一个名字为 abc 的 HeaderSoapConnection 的问题是它内部的 RIO 不是一直存在的。为它设置了 URL 以后需要设置它的 Connected 属性为 True这个 RIO 才会被创建出来。因此代码可能需要显示地执行 SoapConnection1.Connected : True; 然后再判断是否有 RIO如果有则执行以下代码绑定事件SoapConnection1.RIO.HTTPWebNode.OnBeforePost : TForm2.HTTPRIO1HTTPWebNode1BeforePost;这样绑定后SoapConnection 和 HTTPRIO 应该就能共享同一个 HTTP Header 的代码了。以下代码测试通过procedure TForm2.Button2Click(Sender: TObject); begin SoapConnection1.Connected : True; if Assigned(SoapConnection1.RIO) then begin SoapConnection1.RIO.HTTPWebNode.OnBeforePost : HTTPRIO1HTTPWebNode1BeforePost; end; ClientDataSet1.Close; ClientDataSet1.Open; end;服务器端服务器端在接口方法的实现里面直接读取 HTTP Header: 的代码uses SOAP.WebBrokerSOAP, web.HttpApp; { TtestHeader } function TtestHeader.testHeader: string; begin Result : GetSOAPWebModule.Request.GetFieldByName(abc); end;服务器端的 Soap Data Module对应客户端的 SoapConnection 当客户端的 ClientDataSet.Open 的时候服务器端的 DataSetProvider.BeforeGetRecords 事件里面写代码读 Header 是否正确代码如下uses SOAP.WebBrokerSOAP, web.HttpApp; {$R *.DFM} procedure TMyDataCreateInstance(out obj: TObject); begin obj : TMyData.Create(nil); end; function TMyData.CheckHeader: Boolean; begin Result : abcdexyz GetSOAPWebModule.Request.GetFieldByName(abc); end; procedure TMyData.DataSetProvider1BeforeGetRecords(Sender: TObject; var OwnerData: OLEVariant); begin if not CheckHeader then raise Exception.Create(身份验证没通过); end;总之服务器端不管是接口方法的实现部分还是 SoapDataModule 里面都是调用GetSOAPWebModule.Request.GetFieldByName(abc);去读取 Header 来获得客户端提交的 Session ID 或者说 Token客户端使用 IdHTTPprocedure TForm2.Button3Click(Sender: TObject); var S: string; begin IdHTTP1.Request.CustomHeaders.Values[abc] : abcde; S : IdHTTP1.Get(http://localhost:8080/MyHeader); Log(S); end;上述代码使用 TIdHTTP 作为 HTTP 客户端去请求一个 WebBroker 服务器端的 MyHeader 路径。请求之前添加了一个自定义的 CustomHeader然后WebBroker 服务器端对应的代码通过以下方法读客户端传过来的 HTTP Headerprocedure TWebModule1.WebModule1MyHeaderAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var S: string; begin S : Request.GetFieldByName(abc); Response.Content : S; end;
RELATED

相关推荐

YOLO室内手势识别手目标检测数据集-10896张

YOLO室内手势识别手目标检测数据集-10896张

YOLO室内手势识别手目标检测数据集 握拳目标检测:YOLO26 大规模训练实践 📊 数据集基本信息 目标类别: [‘Fist’, ‘Four’, ‘Hand’]中文类别:[‘握拳’, ‘四指’, ‘手’]训练集:10035 张验证集:575 …

📅 2026/10/7 17:31:10
小说创作进阶:从三要素到六要素的实战指南

小说创作进阶:从三要素到六要素的实战指南

1. 从“三要素”到“六要素”:小说创作的底层逻辑演进写小说,尤其是刚开始动笔的时候,很多人会陷入一个误区:要么沉迷于构思一个惊天动地的宏大世界观,要么执着于设计一个离奇曲折的复杂情节。结果往往是,世…

📅 2026/10/7 10:23:25
单片机毕业设计-基于 STM32 单片机的心率血氧检测及无线传输系统设计 基于 STM32 的 MAX30102 生理信号采集与声光报警系统(013203)

单片机毕业设计-基于 STM32 单片机的心率血氧检测及无线传输系统设计 基于 STM32 的 MAX30102 生理信号采集与声光报警系统(013203)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

📅 2026/9/17 15:46:58
MORE NEWS

更多资讯

📰

DeskcommCRM实战:轻量级客户管理与销售跟进全流程落地指南

1. 项目概述:DeskcommCRM 到底是什么,以及为什么值得关注这两年市面上叫 CRM 的产品多得数不过来,但绝大多数都陷入了一个怪圈:功能越做越重,权限越加越细,你要是只为了管好手头几百个客户,得先…

📰

以沟通为核心的轻量级CRM系统设计与实践

一个叫 DeskcommCRM 的项目,听起来有点像某个内部系统的代号,但实际上它代表了一类特别值得聊的东西:以“沟通”为核心的客户关系管理工具。我一开始接触这个项目名的时候,第一反应是“Deskcomm”可能是 Desk Communication 的缩写…

📰

从线程池失控到全局限流:高并发系统稳定性实战指南

1. 并发失控的第一现场:线程池是怎么被击穿的先说一个我实际排查过的案例场景。某公司核心交易链路的订单服务,平时性能表现很稳定,高峰期单机支撑上千QPS没有任何压力。但一次大促活动中,下游的库存服务因为数据库连接池被打满&a…

📰

STC单片机范例程序实战指南:从点灯到多外设工程搭建

简介:这是一份面向嵌入式初学者与单片机开发者的STC单片机C语言范例程序合集,围绕ADC采样、串口通信、EEPROM读写、ISP在系统编程、时钟中断、端口测试及优化编程思想等核心功能展开,适合用于课程实验、自学练手与项目参考。资源包共612个文件…

📰

Kafka全链路性能调优:吞吐量与延迟的实战权衡

前阵子业务告警群里又炸了——消费延迟从平时的几百毫秒一路飙到分钟级,P99 延迟曲线在监控面板上直接拉成一条陡坡。接手这套 Kafka 系统两年,类似的戏码每隔一阵就重演一次。与其每次都临时救火,不如把全链路参数优化这件事系统捋一遍。这篇…

📰

ZXing.Net 0.16.8.0 条码识别实战:从解码链路到性能调优

简介:ZXing.Net.0.16.8.0 是面向 C# 与 Unity 开发者的开源条码处理库,基于 Zebra Crossing 项目,可在 .NET 框架与 Unity 引擎中实现 QR 码、Aztec、Code 128、EAN 等多种条码的读取与生成。开发者只需调用少量 API 即可为桌面应用、移动端或…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬