冲动的楼梯 · ASP.NET Core で HTTPS ...· 1 周前 · |
坚韧的闹钟 · Traccar记录足迹-服务搭建及使用-CS ...· 1 周前 · |
完美的鸡蛋面 · 无法激活 conda 环境。请打开 ...· 6 天前 · |
谈吐大方的汽水 · 一次HTTPS访问慢的案例分析-阿里云开发者社区· 5 天前 · |
长情的台灯 · 年假小 Plan - ZhuGaochao ...· 14 小时前 · |
重感情的伤疤 · 【已解决】Windows11系统显示语言改为 ...· 3 周前 · |
果断的水龙头 · 从“堵塞”到“变堵为疏” ...· 6 月前 · |
温柔的大葱 · 日本陆上自卫队成立陆上总队 ...· 11 月前 · |
英姿勃勃的黄豆 · 防贝热烈 高冷影帝又为我破防了-知乎结局全文后续· 1 年前 · |
强悍的蘑菇 · 少儿主题书写的家国视野 _光明网· 1 年前 · |
我还不太擅长delphi,但根据一些例子,我已经成功地创建了一个简单的http服务器,用户不超过10个。
有两个主要的问题,我还不知道如何解决。
我发现的任何与idhttpserver和openssl有关的例子,都不是很完整,也不是很老版本的Indy。
我目前正在与德尔菲XE2与Indy 10组件。
验证、管理用户会话的正确方法
如果您将
TIdHTTPServer
属性设置为true (默认情况下为false ),则
TIdHTTPServer.SessionState
将为您管理HTTP会话。
TIdHTTPServer
使用cookie进行会话管理,因此您的客户端需要启用cookies。
身份验证必须手动执行,但如何执行取决于客户端是使用基于HTTP的身份验证还是基于HTML的身份验证。
对于HTTP身份验证,有可用的
ARequestInfo.UserName
和
ARequestInfo.Password
属性。如果无效,请将适当的401响应发送回客户端(如果将
AResponseInfo.AuthRealm
属性设置为非空字符串,
TIdHTTPServer
将为您发送401响应)。默认情况下,
TIdHTTPServer
只支持
BASIC
身份验证。如果您希望支持其他身份验证方案,则必须使用
TIdHTTPServer.OnParseAuthentication
事件,并手动发送401回复,以便返回适当的
WWW-Authenticate
头。无论哪种方式,如果客户端被验证,您可以使用HTTP会话在请求之间保持客户端登录。
AResponseInfo.Session
和
AResponseInfo.Session
属性指向当前会话。如果
TIdHTTPServer.AutoStartSession
为true (默认为false ),则
TIdHTTPServer
将自动创建新会话。否则,您可以在需要时自己调用
TIdHTTPServer.CreateSession()
。
TIdHTTPSession
有一个
Content
属性,您可以将会话特定的数据存储在其中。或者可以从
TIdHTTPSession
派生一个新类,然后使用
TIdHTTPServer.OnCreateSession
事件创建该类的实例。
对于HTML身份验证,您有两个选择,这取决于您如何配置HTML:
<form>
标记没有
enctype
属性,或者设置为
application/x-www-webform-urlencoded
,
TIdHTTPServer
将将原始webform数据存储在
ARequestInfo.FormParams
属性中,如果
TIdHTTPServer.ParseParams
为true (默认情况下为
ARequestInfo.FormParams
),则数据也将被解析为
ARequestInfo.Params
属性。
<form>
属性设置为
multipart/form-data
,则必须手动解析
ARequestInfo.PostStream
的内容,因为
TIdHTTPServer
还没有为您解析该数据(以前在许多不同的论坛上都有关于如何使用Indy的
TIdMessageDecoderMIME
类手动解析数据的示例)。默认情况下,
ARequestInfo.PostStream
指向
TMemoryStream
对象。如果需要,可以使用
TIdHTTPServer.OnCreatePostStream
事件创建不同
TStream
-derived类的实例。
主要问题是,连接必须是安全的,所以需要SSL加密,如何实现?
激活服务器之前:
TIdServerIOHandlerSSLBase
-derived组件(如
TIdServerIOHandlerSSLOpenSSL
)分配给
TIdHTTPServer.IOHandler
属性,并根据需要配置它(证书、对等验证、SSL版本等)。在OpenSSL的情况下,如果应用程序尚未在目标操作系统上预装,或者希望确保应用程序使用特定版本的OpenSSL,则必须使用应用程序部署2 OpenSSL库二进制文件
libeay32.dll
和
ssleay32.dll
(或非Windows平台等效程序)。此时,OpenSSL是Indy本机支持的唯一加密,但是有一些与Indy兼容的第三方解决方案,比如
EldoS SecureBlackbox
。
TIdHTTPServer.Binding
属性(443是默认的HTTPS端口)。通常,您应该创建2个绑定,一个用于HTTP端口80,一个用于HTTPS端口443。在
OnCommand...
处理程序中,如果收到要求SSL/TLS加密的请求,则可以检查请求所在的端口(
AContext.Binding.Port
),如果没有HTTPS,则可以重定向(
AResponseInfo.Redirect()
)客户端,以便在HTTPS端口上重试请求。
TIdHTTPServer.OnQuerySSLPort
事件分配一个处理程序,并让它在其
VUseSSL
参数与HTTPS端口匹配时将其
APort
参数设置为True。
更新
,从SVN 5461开始,如果您的HTTPS端口只有443,则为
OnQuerySSLPort
处理程序
不再需要
。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
扫码关注腾讯云开发者
领取腾讯云代金券
坚韧的闹钟 · Traccar记录足迹-服务搭建及使用-CSDN博客 1 周前 |
谈吐大方的汽水 · 一次HTTPS访问慢的案例分析-阿里云开发者社区 5 天前 |
长情的台灯 · 年假小 Plan - ZhuGaochao - 博客园 14 小时前 |
英姿勃勃的黄豆 · 防贝热烈 高冷影帝又为我破防了-知乎结局全文后续 1 年前 |
强悍的蘑菇 · 少儿主题书写的家国视野 _光明网 1 年前 |