OpenLayers 3:ブロックされたクロスオリジンリクエスト:同一生成元ポリシーで許可されていません


8

OpenLayers 3を使用すると、このメッセージが表示されなくなります。

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://myserver:8085/geoserver/sf/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=sf:view1&maxFeatures=1&outputFormat=JSON. This can be fixed by moving the resource to the same domain or enabling CORS.

これはコードです:

// Ol3 only supports Projections "EPSG:4326" and "EPSG:3857". For every other projection you need proj4js
        proj4.defs("EPSG:2236", "+proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs");

        // Leases Layer
        var myLayer = new ol.layer.Vector({
            source: new ol.source.GeoJSON({
                projection: 'EPSG:2236',
                url: 'http://myserver:8085/geoserver/sf/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=sf:view1&maxFeatures=1&outputFormat=JSON',
                crossOrigin: null
            })
        });

// View
        var view = new ol.View({
            projection: 'EPSG:2236',
            center: [0, 0],
            zoom: 4
        });

        // Map
        var map = new ol.Map({
            target: 'map',
            renderer: 'canvas',
            layers: [myLayer],
            view: view
        });

私はcrossOrigin設定を次のように設定しようとしました:

crossOrigin: null
crossOrigin: 'null'
crossOrigin: 'anonymous'

ズームイン/ズームアウトコントロールしか表示されませんが、レイヤーがレンダリングされません。


以下のサイモンのオプション3を使用しました。必要なjetty-servlets jarファイルをコピーして\ WEB-INF \ web.xmlで有効にすることにより、GeoServerでCORSを有効にしました。

<filter>
    <filter-name>cross-origin</filter-name>
    <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
    <init-param>
        <param-name>allowedOrigins</param-name>
        <param-value>*</param-value>
    </init-param>
    <init-param>
        <param-name>allowedMethods</param-name>
        <param-value>*</param-value>
    </init-param>
    <init-param>
        <param-name>allowedHeaders</param-name>
        <param-value>*</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>cross-origin</filter-name>
    <filter-pattern>/*</filter-pattern>
</filter-mapping>

それを行った後、ページを再度テストしたところ、同じエラーが発生しました。

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://myserver:8085/geoserver/sf/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=sf:view1&maxFeatures=1&outputFormat=JSON. This can be fixed by moving the resource to the same domain or enabling CORS.

まだ何かが足りないようです。OpenLayers側から何かする必要がありますか?


私はJettyを取り除き、GeoServerを完全にアンインストールすることになりました。問題は、ジオサーバーのWindowsインストーラーをインストールすると、4年前のバージョンのjettyがインストールされることです。(Jettyバージョン6.1.8)CORSのjarファイルをコピーしたにもかかわらず、Jetty 7以降でのみサポートされています。

WARファイルをインストールできることがわかりました。TomServerを使用することにしました。これは、GeoServerのWebサイトにあるこのメモに従って、GeoServerが主にテストされているためです。

注GeoServerは主にTomcatを使用してテストされているため、これらの手順は他のコンテナーアプリケーションでは機能しない可能性があります。

WARファイルのインストール手順は次のとおりです。

http://docs.geoserver.org/stable/en/user/installation/war.html

これも素晴らしいハウツービデオです:

https://www.youtube.com/watch?v=YEOA8WWWVCw

インストールが完了したら、CORSを有効にします。

http://enable-cors.org/server_tomcat.html


テストできません。あなたが提供したアドレスは機能しません。
Simon Zyx

残念ながら、そのすべてがイントラネットにあります。私の2台のサーバー(geoserverとOLサーバー)はどちらもイントラネット上にあります。
user3657279 14

上記の「Update#2」のパスに成功しました。同じことを計画している場合は、web.xmlファイルが新しくデプロイされたGeoServerフォルダーの下にあることに注意してください。例:\ xampp \ tomcat \ webapps \ geoserver \ WEB-INF \ web.xml
Lauden

回答:


4

代わりにJSONPを使用する簡単な回避策があります。

  1. ジオサーバーでJSONPを有効にする必要があります。JSONPを有効にするには、web.xmlに以下を追加する必要があります(例:C:\ Program Files(x86)\ GeoServer 2.4.4 \ webapps \ geoserver \ WEB-INF \ web.xml)

... ENABLE_JSONP true ... 2.ジオサーバーを再起動します。今のGetFeatureInfoの要求、geoserverがクライアントにparseResponse(JSONデータ)を送信します

  1. JSONPはクライアント(JavaScript)からどのように機能しますか?JSONP呼び出しは簡単です。src = url(urlはGetFeatureInfo url)を含むスクリプトをヘッダーに追加する必要があります

    var tag = document.createElement( "script"); tag.src = url; document.getElementsByTagName( "head")[0] .appendChild(tag);

スクリプトが追加されると、サーバーからjsonpが呼び出されます。parseRespose関数を呼び出します。したがって、次のようにparseResponse関数を定義する必要があります。この関数のスコープはグローバルでなければなりません。

function parseResponse(data){var feature = data.features [0]; console.log(feature);
};


これは古い投稿ですが、同じ問題を感じたので、JSONPで回避できましたが、Geoserverから機能を取得する場合にのみ役立ちますが、WFS-Tを使用する場合は、行き詰まっています。phpスクリプトをいくつか作成しました。計画BとしてのCRUD操作の場合、ジオサーバー2.9でCORSを有効にする方法を引き続き検索する
Hicham Zouarhi

3

私自身も同じ問題に直面し、ここまたは他のフォーラムで説明されている多くの解決策を試しましたが、最終的にはGeoserverでCross Originを有効にする問題を解決することができました。

多くの試行錯誤の末、JettyのWebページJetty Cross Origin Filterにある正確な手順に従うと、ソリューションがかなり簡単であることがわかりました。

しかし、小さな変更で、ページは次のCross-Originフィルターを(Web.xml)構成ファイルにコピーする必要があると述べましたが、私と一緒に機能した解決策はこのフィルターxml構成を(webdefault.xml)にコピーすることです構成ファイル、この変更を適用すると、ジオサーバーは魅力的なように機能し、IFrame soultionを使用する代わりに、AJAXを使用してJSON形式でWFS、WMS GetFeatureInfoRequestを実行できます。

次のソフトウェアバージョンを使用しています。

  • 無限のOpenGeo v4.5
  • Geoserver v 2.6.2。
  • Jetty v 7.6.13.v20130916。

詳細な手順は次のとおりです。

  1. このページのJettyサーブレットから、Jettyのバージョンに応じて、Jettyサーブレットの一致するバージョンをダウンロードしてください。
  2. この例では、jetty v7.6.13.v20130916を使用しているので、jarファイルに名前を付ける必要があります
    jetty-servlets-7.6.13.v20130916.jar)。ファイル名はjettyのバージョンによって異なります-名前を変更しないでくださいjettyは、次のようにサーブレット名とそのバージョンを一致させるためです:
    jetty-servlets-<%JETTY_VERSION%>。jar。名前を変更しないでください。
  3. (GeoServer、Postgresの)サービスを停止し、に位置OpenGeoディレクトリからコピーしてください
    C:\プログラムファイル(x86の)\無限\ OpenGeo)ともに位置OpenGeoディレクトリをコピーします
    C:\はProgramData \無限\ OpenGeo)予防策として、このチュートリアルを開始する前に。

  4. ファイル(jetty-servlets-7.6.13.v20130916.jar)(現状のまま)をjetty Libディレクトリ
    * C:\ Program Files(x86)\ boundless \ OpenGeo \ jetty \ lib *)にコピーします。インストールディレクトリに応じて変更します。

  5. 次のxml行をコピーして、 (C:\ Program Files(x86)\ boundless \ OpenGeo \ jetty \ ect \ webdefault.xml)にある(webdefault.xml)に貼り付けます。これらの行の場所がわかりませんファイルに配置するかどうかは重要ですが、後の#306行目から貼り付けます。
    </serlet-mapping>
<filter>
    <filter-name>cross-origin</filter-name>
    <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>cross-origin</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  1. GeoServerPostgres)サービスを開始し、数秒待ってジオサーバーページを参照すると、ジオサーバーが正しく起動します。

このチュートリアルは私にとってうまくいきました、そして同じ問題に直面している誰にとってもそれがうまくいくことを願っています。


これは、同じ回答を投稿した3番目の質問です。3つの回答をそれぞれ確認して、質問に対する回答が本当にあるのか、それとも単なる一般的なアドバイスなのかを判断していただけますか?
PolyGeo

私は他の回答をレフェリーする方法を知らなかったので、ここにもう一度コピーしました
Ahmed GIS

物思いにふけって、GeoserverとOpenlayersのクロスオリジン問題の解決策を探していました。解決策を見つけた後、同じ問題に直面している他の人々と共有したいので、これらのキーワード(CORS 、Openlayers、Geoserver)と私は私の問題に同じ質問に答えましたが、他の回答をレフェリーする方法がわからなかったので、ここにもう一度コピーしました。私は私の答えを繰り返すつもりはありません、私はこの素晴らしいサイトのような他の人が他の問題で助けてくれるのを助けたかったのです。
Ahmed GIS

ソースレイヤーのジオサーバーにアクセスできず、サーバーの所有者が何をしたのかわかりません。
マグノC

@MagnoC最初にサーバーの所有者に確認する必要があります。おそらく、彼はレイヤーの名前などを変更しました。
アーメドGIS

1

crossOrigin-settingは、ol.source.TileImageに対してのみ(?)存在します。(http://openlayers.org/en/master/apidoc/ol.source.TileImage.html-右上隅の[Stable only]のチェックを外します)。ol.source.GeoJSONにはcrossOrigin設定がありません。クロスサイトリクエストを介してJSONにアクセスできないためです。

これにはさまざまな方法があります。

  1. jsonの送信元であるサーバーにアクセスできない場合は、ajax呼び出しにWebプロキシを使用します。(ajaxプロキシの例を検索)
  2. サーバーにアクセスできる場合は、jsonpを使用できます。これは通常れる好ましい解決策であるが、それはにGeoJSONで作業を行う場合、私は知らないとあなたはローダ機能を上書きする必要がある場合があります(http://en.wikipedia.org/wiki/JSONP - GeoserverからJSONを取得するためにどのように使用してAJAX要求 - http://openlayers.org/en/master/examples/vector-osm.js < -カスタムローダー機能を使用するための一例)
  3. サーバーでクロスオリジンリクエストを有効にします。(http://en.wikipedia.org/wiki/Cross-origin_resource_sharing
  4. データが静的な場合は、ダウンロードして独自のサーバーに配置します(完全性について言及しているだけです)。

同様の問題ですが、地理関連ではありません:https : //stackoverflow.com/questions/5549068/json-how-do-i-make-cross-domain-json-call


サイモン、あなたの提案ごとに上記のアップデート#1を見てください。ありがとう。
user3657279 14

0

Firebug / Chrome Dev Toolsの[ネットワーク]タブのGeoserver応答ヘッダーをチェックして、Acces-Control-Allow-Origin:*ヘッダーが実際に存在するかどうかを確認します。そうでない場合、問題はサーブレットコンテナ側にあります。あるいは、アプリケーションが内部にある場合、CORSを有効にするのではなく、プライマリWebサーバーにプロキシを設定しますか?後者は、Geoserverが一般公開される予定であれば、より理にかなっています。


Firebug-> [Net]タブに移動して[Headers]タブをクリックし、応答ヘッダーを確認しました。3つのサブセクションが表示されます:応答ヘッダー、要求ヘッダー、およびキャッシュからの応答ヘッダー。「Access-Control-Allow-Origin」についての言及はありません。
user3657279 2014

Access-Control-Allow-Originヘッダーは、応答ヘッダーサブセクションに存在する必要があります。そうでない場合は、サーブレットコンテナーを再構成してみてください。
Michal Mackiewicz 14

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.