没有JSONP的跨站点呼叫

时间:2013-07-25 20:41:33

标签: javascript gwt cross-site

我正在使用HTML,CSS和Javascript代码构建前端的应用程序。后端将使用核心java,Restlet创建。

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

现在我将通过Ajax Request或jQuery Ajax从前端发送服务器或休息调用,然后我得到了跨端脚本问题(SOP - 同源策略)。我没有得到如何解决这个问题。

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

有谁能请解释我如何解决这个问题?

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

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

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

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

答案 2 :(得分:0)

如果您正在使用PHP并且可以使用php_culr库,那么您可能希望利用交叉源到服务器。您可以在此处查看示例:http://davidwalsh.name/curl-post 或者您可以使用file_get_contents函数并序列化已发布的参数,或者只传递您想要的get参数(如果需要)。

希望这有帮助。

答案 3 :(得分: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复制的,但它只是代码的一部分。它说明了解决方案。

答案 4 :(得分: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