我正在开发一个使用REST技术的DataSnap服务器。当客户端尝试使用POST请求时,浏览器首先会尝试执行OPTIONS请求,而我的服务器无法响应。经过搜索,我发现这是一个名为CORS(跨域资源共享)的浏览器安全问题,因为我的客户端与DataSnap服务器不在同一个域中。
那么我该怎么办呢?由于DataSnap没有OPTIONS REST请求,我该如何处理呢?
我正在开发一个使用REST技术的DataSnap服务器。当客户端尝试使用POST请求时,浏览器首先会尝试执行OPTIONS请求,而我的服务器无法响应。经过搜索,我发现这是一个名为CORS(跨域资源共享)的浏览器安全问题,因为我的客户端与DataSnap服务器不在同一个域中。
那么我该怎么办呢?由于DataSnap没有OPTIONS REST请求,我该如何处理呢?
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;
解决方法:使用反向代理服务器处理HTTP请求(如Apache HTTP),并配置Apache使得OPTIONS请求由另一个HTTP服务器来响应。从外部看,客户端将无法看到任何区别,因为所有通信都是在客户端和Apache之间进行的。