我还不擅长使用 delphi,但是根据一些示例,我已经成功创建了不超过 10 个用户的简单 http 服务器。
有两个主要问题我还不知道如何解决。
- 验证、管理用户的正确方法 - 会话
- 主要问题是,连接必须安全,所以需要SSL加密,如何实现?
我发现的与 idhttpserver 和 openssl 相关的任何示例都不太完整,或者与旧版本的 Indy 相关。
我目前正在使用 Delphi XE2 和 Indy 10 组件。
验证、管理用户的正确方法 - 会话
TIdHTTPServer
如果您设置了,则为您管理 HTTP 会话TIdHTTPServer.SessionState
属性为 true(默认为 false)。TIdHTTPServer
使用 cookie 进行会话管理,因此您的客户端需要启用 cookie。
身份验证必须手动执行,但如何执行取决于您的客户端是使用基于 HTTP 还是基于 HTML 的身份验证。
对于 HTTP 身份验证,有ARequestInfo.UserName
and ARequestInfo.Password
可用的属性。如果无效,则将适当的 401 响应发送回客户端(如果您设置了AResponseInfo.AuthRealm
属性为非空字符串,TIdHTTPServer
将为您发送 401 响应)。默认情况下,TIdHTTPServer
只支持BASIC
验证。如果您想支持其他身份验证方案,则必须使用TIdHTTPServer.OnParseAuthentication
事件,并手动发送 401 回复,以便您可以发回适当的WWW-Authenticate
标头。无论哪种方式,如果客户端经过验证,您都可以使用 HTTP 会话来使客户端在请求之间保持登录状态。这AResponseInfo.Session
and AResponseInfo.Session
属性指向当前会话。如果TIdHTTPServer.AutoStartSession
为 true(默认为 false),TIdHTTPServer
自动创建新会话。否则,您可以致电TIdHTTPServer.CreateSession()
需要时自己。TIdHTTPSession
has a Content
您可以在其中存储特定于会话的数据的属性。或者您可以从中派生一个新类TIdHTTPSession
然后使用TIdHTTPServer.OnCreateSession
创建该类的实例的事件。
对于 HTML 身份验证,您有两种选择,具体取决于您配置 HTML 的方式:
如果你的 HTML<form>
标签没有enctype
属性,或者设置为application/x-www-webform-urlencoded
, TIdHTTPServer
将原始网络表单数据存储在ARequestInfo.FormParams
财产,并且如果TIdHTTPServer.ParseParams
为 true(默认情况下),数据也将被解析为ARequestInfo.Params
为您提供财产。
如果你的 HTML<form>
标签有一个enctype
属性设置为multipart/form-data
,你必须解析的内容ARequestInfo.PostStream
手动,如TIdHTTPServer
尚未为您解析该数据(示例已在许多不同的论坛上发布过多次,介绍如何使用 Indy 手动解析该数据TIdMessageDecoderMIME
班级)。默认情况下,ARequestInfo.PostStream
指向一个TMemoryStream
目的。您可以使用TIdHTTPServer.OnCreatePostStream
事件来创建不同的实例TStream
- 派生类(如果需要)。
主要问题是,连接必须安全,所以需要SSL加密,如何实现?
激活服务器之前:
分配一个TIdServerIOHandlerSSLBase
-派生组件,例如TIdServerIOHandlerSSLOpenSSL
,到TIdHTTPServer.IOHandler
属性并根据需要进行配置(证书、对等验证、SSL 版本等)。对于 OpenSSL,您必须部署 2 个 OpenSSL 库二进制文件libeay32.dll
and ssleay32.dll
(或非 Windows 平台等效项)与您的应用程序一起使用,如果它们尚未预安装在目标操作系统上,或者如果您想确保您的应用程序使用特定版本的 OpenSSL。目前,OpenSSL 是 Indy 原生支持的唯一加密,但也有与 Indy 兼容的第三方解决方案可用,例如EldoS SecureBlackbox.
填写TIdHTTPServer.Binding
属性与所需 HTTPS 端口的绑定(443 是默认 HTTPS 端口)。通常,您应该创建 2 个绑定,一个用于 HTTP 端口 80,一个用于 HTTPS 端口 443。OnCommand...
处理程序,如果您收到需要 SSL/TLS 加密的请求,您可以检查发出请求的端口(AContext.Binding.Port
),如果不是 HTTPS,则重定向(AResponseInfo.Redirect()
) 客户端在 HTTPS 端口上重试请求。
分配一个处理程序到TIdHTTPServer.OnQuerySSLPort
事件并设置它的VUseSSL
当其参数为 True 时APort
参数与您的 HTTPS 端口匹配。UPDATE从 SVN rev 5461 开始,OnQuerySSLPort
处理程序不再需要如果您唯一的 HTTPS 端口是 443。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)