我还不太擅长delphi,但根据一些例子,我已经成功地创建了一个简单的http服务器,用户不超过10个。
有两个主要的问题,我还不知道如何解决。
我发现的任何与idhttpserver和openssl有关的例子,都不是很完整,也不是很老版本的Indy。
我目前正在与德尔菲XE2与Indy 10组件。
发布于 2015-12-22 18:19:40
验证、管理用户会话的正确方法
如果您将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
处理程序不再需要。https://stackoverflow.com/questions/34415978
复制相似问题