![]() |
沉稳的手链 · ps cs6 英文语言包 - CSDN文库· 1 月前 · |
![]() |
温柔的人字拖 · 完全卸载photoshop教程 - CSDN文库· 1 月前 · |
![]() |
朝气蓬勃的木瓜 · stata中的数据类型 - CSDN文库· 1 月前 · |
![]() |
开心的山羊 · 哥布林洞窟百度云 - 百度· 1 月前 · |
![]() |
踢足球的围巾 · oreo大师作品合集百度网盘 - 抖音· 3 周前 · |
![]() |
鬼畜的薯片 · 嵌套json,获取json参数 - CSDN文库· 4 月前 · |
![]() |
想出国的勺子 · VUE绑定多个点击事件_HarryHY的博客 ...· 1 年前 · |
![]() |
寂寞的手术刀 · sql 该列值为空时,则显示另一列 ...· 1 年前 · |
![]() |
大力的枕头 · jMeter 打开项目时遇到错误消息 ...· 1 年前 · |
![]() |
率性的砖头 · 单层LSTM和多层LSTM的输入与输出_LS ...· 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
扫码关注腾讯云开发者
领取腾讯云代金券
![]() |
沉稳的手链 · ps cs6 英文语言包 - CSDN文库 1 月前 |
![]() |
温柔的人字拖 · 完全卸载photoshop教程 - CSDN文库 1 月前 |
![]() |
朝气蓬勃的木瓜 · stata中的数据类型 - CSDN文库 1 月前 |
![]() |
开心的山羊 · 哥布林洞窟百度云 - 百度 1 月前 |
![]() |
踢足球的围巾 · oreo大师作品合集百度网盘 - 抖音 3 周前 |
![]() |
鬼畜的薯片 · 嵌套json,获取json参数 - CSDN文库 4 月前 |