7

我有一个使用 HTML、CSS 和 Javascript 代码构建前端的应用程序。后端将使用核心 java、Restlet 创建。

现在真正的问题是前端和后端都将在具有差异端口的差异服务器上。比如,前端打开:(http://clientLookup仅举例)后端打开,http://lcgrke:8080

现在,由于我将通过 Ajax 请求或 jQuery Ajax 从前端发送服务器或休息调用,因此我遇到了跨端脚本问题(SOP - 同源策略)。我不知道如何解决这个问题。

JSONP 可以是选项之一,但它仅适用于 GET 类型调用,但在我的应用程序中,我将有 GET/POST 请求。此外,服务器的某些 url 不会启用 JSONP(不要问我为什么,只要接受它们是不可编辑的),所以 JSONP 似乎不是更好的选择。

谁能解释一下我将如何解决这个问题?

4

5 回答 5

1

不久前我遇到了同样的问题。您可以在您的前端服务器上安装 PHP,并对该服务器上的 PHP 脚本进行 AJAX 调用。有几个用于 PHP 的 HTTP 库(cURL 是最流行的),然后您可以使用它们向后端服务器发出 HTTP 请求。基本上,您可以在前端服务器上编写一个 PHP 脚本来充当中间人。

于 2013-09-19T14:35:57.387 回答
0

Ben Alman 有一个简单的代理脚本,我用它作为这种情况的临时解决方法。

基本上,它使用 curl 转发 GET 和 POST 请求。

http://benalman.com/projects/php-simple-proxy/

$url = $_GET['url'];
$ch = curl_init( $url );
curl_setopt($ch, CURLOPT_VERBOSE, true);
if ( strtolower($_SERVER['REQUEST_METHOD']) == 'post' ) {
  curl_setopt( $ch, CURLOPT_POST, true );
  //curl_setopt( $ch, CURLOPT_POSTFIELDS, $_POST );

  $vin = $_POST["vin"];
  $subscriberProgramXML = $_POST["subscriberProgramXML"];

  $data = array("vin" => $vin, "subscriberProgramXML" => $subscriberProgramXML);
  $data_string = json_encode($data);

  $httpHeader = array('Content-Type: application/json', 'Content-Length: ' .strlen($data_string));

  curl_setopt( $ch, CURLOPT_POSTFIELDS, $data_string);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeader);
}

curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $ch, CURLOPT_HEADER, true );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );

curl_setopt( $ch, CURLOPT_USERAGENT, $_GET['user_agent'] ? $_GET['user_agent'] : $_SERVER['HTTP_USER_AGENT'] );


list( $header, $contents ) = preg_split( '/([\r\n][\r\n])\\1/', curl_exec( $ch ), 2 );

$status = curl_getinfo( $ch );

curl_close( $ch );

// Set the JSON data object contents, decoding it from JSON if possible.
$decoded_json = json_decode( $contents );
$data['contents'] = $decoded_json ? $decoded_json : $contents;

// Generate appropriate content-type header.
$is_xhr = strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';
header( 'Content-type: application/' . ( $is_xhr ? 'json' : 'x-javascript' ) );

// Get JSONP callback.
$jsonp_callback = $enable_jsonp && isset($_GET['callback']) ? $_GET['callback'] : null;

// Generate JSON/JSONP string
$json = json_encode( $data );

print $jsonp_callback ? "$jsonp_callback($json)" : $json;

该代码是从原始 php 复制粘贴的,但它只是代码的一部分。它说明了解决方案。

于 2013-09-10T16:22:29.207 回答
0

如果您使用 PHP 并且有 php_culr 库可用,您可能希望利用跨源到服务器。您可以在这里看到一个示例:http: //davidwalsh.name/curl-post 或者您可以使用file_get_contents函数并序列化发布的参数,或者只传递您想要的获取参数(如果需要)。

希望这可以帮助。

于 2013-08-06T14:57:08.837 回答
0

处理跨站点请求的现代方法是使用CORS而不是JSONP,尽管您必须了解哪些浏览器支持 CORS。

您可以在几乎现代的浏览器(IE10、FF、Chrome、Safari、Opera)上使用 CORS,但不能在 IE9/8 上使用。

对于 IE9/8,您可以使用另一种称为XDomainRequest的技术,但您必须通过 JSNI 实现它。

使用 CORS 与 JSONP 的目标是,在您的服务器端,您只需添加一个过滤器,一切都应该开箱即用(RPC、RF 等)。

要在 gwt 中使用 CORS,您可以在gwtquery站点中阅读此页面,其中有一个过滤器示例。在该页面中,您还可以获得有关 jsonp 的有用信息,以及如何使用 gwtquery ajax 来简化 gwt RequestBuilder 方式。

于 2013-07-26T08:57:28.220 回答
0

正如@Manolo 所说,要走的路是使用 CORS(您可以在此处查看更多详细信息:http: //blogs.mulesoft.org/cross-domain-rest-calls-using-cors/ - 免责声明:我写了那篇文章,但是为了不让这个答案成为自我推销,你可以搜索 CORS,你会找到类似的文章)。

我可以添加到 Manolo 响应的唯一内容是,如果您使用 jQuery,则不必担心 IE 的 XDomainRequest,因为 jQuery 会考虑那些浏览器兼容性细节。

此外,由于您使用的是 Restlet,这篇文章会有所帮助: http: //kodemaniak.de/2010/07/cross-domain-ajax-with-restlet-and-jquery/

我从未使用过 Restlet,但由于基于 Java,添加 CORS 的其他简单选项是创建或使用过滤器,这是一个 Apache 许可证过滤器实现:https ://bitbucket.org/thetransactioncompany/cors-filter/src

于 2013-09-14T05:31:19.757 回答