【问题标题】:How to filter requests on Delphi datasnap rest server?如何过滤 Delphi datasnap rest 服务器上的请求?
【发布时间】:2014-11-24 21:26:02
【问题描述】:

我是这个 delphi datasnap 的新手,几乎没有任何有用的文档。

我已经按照this guide 设置了一个简单的休息服务器。现在我想定义自己的身份验证协议。

据我所知。所有来自远程客户端的请求都将在调用服务器类方法之前通过 WebModule 方法进行处理。到目前为止,我能够像这样捕获客户端 IP 地址和请求 URL 路径:

procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
ShowMessage(request.RemoteAddr); // adress where request came from
ShowMessage(request.PathInfo); // url path
  Response.SetCustomHeader('access-control-allow-origin','*');
  if FServerFunctionInvokerAction <> nil then
    FServerFunctionInvokerAction.Enabled := AllowServerFunctionInvoker;
end;

我怎么能:

拒绝请求依赖于特定的IP地址,并在到达类方法之前向客户端返回401状态码?

将客户端重定向到其他方法?例如:重定向此请求:

request = new XMLHttpRequest();
request.open('GET', 'http://localhost:8080/datasnap/rest/TServerMethods1/ReverseString/blah', true);

到另一个方法而不是 ReverseString。

【问题讨论】:

  • 您向 HTTP 响应添加了 CORS 标头 (access-control-allow-origin)。知道这是否按预期工作会很有趣,允许跨域请求。

标签: delphi rest http authentication datasnap


【解决方案1】:

可以使用 Apache HTTP 服务器作为带有 mod_rewrite 模块的反向代理来处理复杂的重定向场景。

例如,此答案表明客户端 IP 地址可用于触发重定向。

https://stackoverflow.com/a/1073877/80901

RewriteCond %{REMOTE_ADDR} !^10\.0\.1\.1$
RewriteRule ^ /maintenance.html

这会将所有请求发送到维护页面,但有一些例外。

使用 Apache(或不同的 HTTP 代理服务器)还允许在应用 Apache 配置更改的同时保持 DataSnap 服务器持续运行。这将使您的服务器停机时间几乎为零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2023-03-12
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多