我还不熟悉delphi,但基于一些例子,我设法创建了简单的http服务器,用户不超过10个。
有两个主要问题我不知道如何解决。
我发现与idhttpserver和openssl有关的任何例子都不完整或者版本较旧的Indy。
我目前正在使用带有Indy 10组件的Delphi XE2。
答案 0 :(得分:3)
如果设置验证,管理用户的正确方法 - 会话
TIdHTTPServer
属性为true,则 TIdHTTPServer.SessionState
为您管理HTTP会话(默认情况下为false)。 TIdHTTPServer
使用Cookie进行会话管理,因此您的客户需要启用Cookie。
身份验证必须手动执行,但是如何执行此操作取决于您的客户端是使用基于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
为真(默认情况下为false),则TIdHTTPServer
会自动创建新会话。否则,您可以在需要时自己致电TIdHTTPServer.CreateSession()
。 TIdHTTPSession
具有Content
属性,您可以在其中存储特定于会话的数据。或者,您可以从TIdHTTPSession
派生新类,然后使用TIdHTTPServer.OnCreateSession
事件创建那个班。
对于HTML身份验证,您有两种选择,具体取决于您配置HTML的方式:
如果您的HTML <form>
标记没有enctype
属性,或者设置为application/x-www-webform-urlencoded
,则TIdHTTPServer
会将原始网络表单数据存储在ARequestInfo.FormParams
属性,如果TIdHTTPServer.ParseParams
为真(默认为默认值),则数据也将被解析为ARequestInfo.Params
属性。
如果您的HTML <form>
标记的enctype
属性设置为multipart/form-data
,则必须手动解析ARequestInfo.PostStream
的内容,如{{ 1}}还没有为你解析这些数据(以前在很多不同的论坛上已经多次发布了关于如何使用Indy的TIdHTTPServer
类手动解析数据的例子)。默认情况下,TIdMessageDecoderMIME
指向ARequestInfo.PostStream
个对象。如果需要,您可以使用TMemoryStream
事件创建不同TIdHTTPServer.OnCreatePostStream
派生类的实例。
主要问题,连接必须是安全的,所以需要SSL加密,如何实现呢?
在激活服务器之前:
将TStream
派生的组件(例如TIdServerIOHandlerSSLBase
)分配给TIdServerIOHandlerSSLOpenSSL
属性,并根据需要进行配置(证书,对等验证,SSL版本,等等)。对于OpenSSL,如果尚未在目标操作系统上预安装2个OpenSSL库二进制文件TIdHTTPServer.IOHandler
和libeay32.dll
(或非Windows平台等价物),则必须使用您的应用程序,或者如果您想确保您的应用使用特定版本的OpenSSL。目前,OpenSSL是Indy本身支持的唯一加密技术,但是有一些与Indy兼容的第三方解决方案,例如EldoS SecureBlackbox。
使用所需HTTPS端口的绑定填充ssleay32.dll
属性(443是默认的HTTPS端口)。通常,您应该创建2个绑定,一个用于HTTP端口80,另一个用于HTTPS端口443.在TIdHTTPServer.Binding
处理程序中,如果您收到需要SSL / TLS加密的请求,则可以检查请求所在的端口on(OnCommand...
),如果不是HTTPS,则重定向(AContext.Binding.Port
)客户端以在HTTPS端口上重试请求。
为AResponseInfo.Redirect()
事件分配处理程序,并在其TIdHTTPServer.OnQuerySSLPort
参数与您的HTTPS端口匹配时将其VUseSSL
参数设置为True。 更新从SVN rev 5461开始,APort
处理程序is no longer needed,如果您唯一的HTTPS端口是443。