【问题标题】:Delphi XE4 Datasnap with CORS带 CORS 的 Delphi XE4 Datasnap
【发布时间】:2016-09-03 08:28:03
【问题描述】:

我正在使用 REST 开发数据快照服务器。当客户端尝试使用 POST 请求时,浏览器首先尝试执行我的服务器无法响应的 OPTIONS 请求。搜索我发现这是一个名为 CORS(跨源资源共享)的浏览器安全问题,因为我的客户端与 datasnap 服务器位于不同的域中。

我该怎么办,因为数据快照没有 OPTIONS 休息请求?

【问题讨论】:

  • 客户端在不同的域中不是问题。当 为 JavaScript 提供服务的服务器为 REST Web 服务提供服务的服务器 的域不同时,CORS 就会发挥作用
  • @mjn 不仅是 JavaScript,还包括任何 ajax xmlhttprequest。对于任何严肃的 RESTful 流程,CORS 都是强制性的。如果datasnap不支持,那将是一个非常严重的限制。
  • 您是否尝试为 DataSnap 提交错误报告/功能请求?

标签: delphi rest http cors datasnap


【解决方案1】:

您可以将 Datasnap 服务器设置为响应 WebModule BeforeDispatch 事件中的任何 CORS 请求。

procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  Response.SetCustomHeader('Access-Control-Allow-Origin','*');        

  if Trim(Request.GetFieldByName('Access-Control-Request-Headers')) <> '' then 
  begin 
    Response.SetCustomHeader('Access-Control-Allow-Headers', Request.GetFieldByName('Access-Control-Request-Headers'));        
    Handled := True;
  end;

  if FServerFunctionInvokerAction <> nil then
    FServerFunctionInvokerAction.Enabled := AllowServerFunctionInvoker;
end;

【讨论】:

    【解决方案2】:

    解决方法:对 HTTP (Apache HTTP) 使用反向代理服务器,并配置 Apache,以便 OPTIONS 请求将由不同的 HTTP 服务器响应。从外部看,客户端将无法看到差异,因为所有通信都是在客户端和 Apache 之间完成的。

    【讨论】:

      猜你喜欢
      • 2016-12-11
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 2012-09-03
      • 1970-01-01
      • 2013-11-04
      相关资源
      最近更新 更多