Delphi XE4与CORS的数据快递

3

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

那么我该怎么办呢?由于DataSnap没有OPTIONS REST请求,我该如何处理呢?


客户端位于不同的域并不是问题。当提供JavaScript的服务器和提供REST Web服务的服务器的域不同时,CORS就会发挥作用。 - mjn
@mjn 不仅限于JavaScript,还包括任何ajax xmlhttprequest。CORS对于任何严肃的RESTful过程都是必需的。如果datasnap不支持它,那将是一个非常严重的限制。 - Arnaud Bouchez
你尝试过为DataSnap提交错误报告/功能请求吗? - mjn
2个回答

2
您可以在WebModule BeforeDispatch事件中设置您的Datasnap服务器以应对任何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;

0

解决方法:使用反向代理服务器处理HTTP请求(如Apache HTTP),并配置Apache使得OPTIONS请求由另一个HTTP服务器来响应。从外部看,客户端将无法看到任何区别,因为所有通信都是在客户端和Apache之间进行的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接