OpenLayers 3: Permintaan Lintas-Asal Diblokir: Kebijakan Asal-usul yang Sama Dilarang [duplikat]


8

Menggunakan OpenLayers 3, saya tidak bisa menghapus pesan ini:

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.

Ini kodenya:

// 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
        });

Saya telah mencoba mengatur pengaturan crossOrigin ke:

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

Saya hanya melihat kontrol zoom in / out tetapi layer tersebut tidak ditampilkan.


Saya pergi dengan opsi 3 simon di bawah ini. Saya mengaktifkan CORS di GeoServer dengan menyalin file jar jetty-servlets yang diperlukan dan mengaktifkannya di \ WEB-INF \ web.xml:

<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>

Setelah saya melakukannya, saya menguji halaman itu lagi dan menerima kesalahan yang sama:

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.

Sepertinya saya masih kehilangan sesuatu. Apakah saya harus melakukan sesuatu dari Sisi OpenLayers?


Saya akhirnya menyingkirkan Jetty dan mencopot GeoServer sepenuhnya. Masalahnya adalah ketika Anda menginstal installer windows geoserver, itu menginstal versi dermaga yang berusia 4 tahun! (Jetty versi 6.1.8) Meskipun saya telah menyalin file jar untuk CORS, itu hanya didukung di Jetty 7+.

Saya menemukan bahwa Anda dapat menginstal file PERANG. Saya memutuskan untuk menggunakan Tomcat karena itulah yang sebagian besar diuji oleh GeoServer berdasarkan catatan ini dari situs web GeoServer:

Catatan GeoServer sebagian besar telah diuji menggunakan Tomcat, dan karena itu instruksi ini mungkin tidak berfungsi dengan aplikasi kontainer lainnya.

Ini adalah instruksi untuk menginstal file WAR:

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

Ini juga cara video yang bagus:

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

Setelah Anda selesai menginstal, Anda kemudian mengaktifkan CORS:

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


saya tidak bisa mengujinya, alamat yang Anda berikan tidak berfungsi.
Simon Zyx

Sayangnya, semuanya ada di intranet. Dua server saya (geoserver dan server OL) keduanya ada di intranet.
user3657279

Saya berhasil mengambil jalur "Perbarui # 2" yang dijelaskan di atas. Jika Anda berencana untuk melakukan hal yang sama, perlu diingat bahwa file web.xml terletak di bawah folder GeoServer yang baru digunakan, misalnya: \ xampp \ tomcat \ webapps \ geoserver \ WEB-INF \ web.xml
Lauden

Jawaban:


4

Ada cara sederhana untuk menggunakan JSONP:

  1. Anda harus mengaktifkan JSONP di geoserver. Untuk mengaktifkan JSONP, Anda perlu menambahkan yang berikut di web.xml Anda (mis. C: \ Program Files (x86) \ GeoServer 2.4.4 \ webapps \ geoserver \ WEB-INF \ web.xml)

... ENABLE_JSONP true ... 2. Mulai ulang geoserver Anda. Sekarang untuk permintaan GetFeatureInfo , geoserver akan mengirim parseResponse (data JSON) ke klien

  1. Bagaimana JSONP bekerja dari klien (JavaScript)? Panggilan JSONP sederhana. Anda perlu menambahkan skrip dengan src = url ( url adalah GetFeatureInfo url) ke dalam header

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

Setelah skrip ditambahkan, ia akan memanggil jsonp dari server. menjalankan fungsi parseRespose. Jadi, Anda perlu mendefinisikan fungsi parseResponse sebagai berikut. Ruang lingkup fungsi ini harus bersifat global.

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


ini adalah posting lama tapi saya merasa dalam masalah yang sama, saya berhasil mengatasinya dengan JSONP tetapi hanya berguna untuk mendapatkan fitur dari Geoserver namun jika Anda bermaksud menggunakan WFS-T maka Anda macet, saya menulis beberapa skrip php untuk operasi CRUD sebagai rencana B dan masih mencari cara untuk mengaktifkan CORS di geoserver 2.9
Hicham Zouarhi

3

Saya menghadapi masalah yang sama sendiri dan saya mencoba banyak solusi yang dibahas di sini atau di forum lain dan akhirnya saya berhasil memecahkan masalah mengaktifkan Cross Origin di Geoserver.

Setelah banyak percobaan saya menemukan bahwa solusinya cukup sederhana mengikuti langkah-langkah tepat yang ditemukan di halaman web Jetty Jetty Cross Origin Filter .

Tetapi dengan perubahan kecil, halaman tersebut mengatakan bahwa kita harus menyalin filter Cross-Origin berikut ke file konfigurasi ( Web.xml ), tetapi solusi yang bekerja dengan saya adalah menyalin konfigurasi filter xml ini ke ( webdefault.xml ) file konfigurasi, ketika menerapkan perubahan ini geoserver bekerja seperti pesona dan saya bisa menjalankan WFS, WMS GetFeatureInfoRequest dalam format JSON menggunakan AJAX alih-alih menggunakan IFrame soultion.

Saya menggunakan versi perangkat lunak berikut:

  • OpenGeo Tanpa Batas v4.5.
  • Geoserver v 2.6.2.
  • Jetty v 7.6.13.v20130916.

Berikut langkah-langkah terperinci:

  1. Unduh versi yang cocok dari servlets Jetty sesuai dengan versi jetty Anda dari halaman ini Jetty Servlets .
  2. Dalam contoh ini saya menggunakan jetty v7.6.13.v20130916 sehingga file jar harus dinamai
    ( jetty-servlets-7.6.13.v20130916.jar ) nama file akan berbeda sesuai dengan versi jetty - jangan ubah namanya karena jetty mencocokkan nama servlet dengan versinya seperti:
    jetty-servlets - <% JETTY_VERSION%> .jar, jadi jangan ganti namanya.
  3. Hentikan layanan (GeoServer, Postgres) dan Ambil salinan dari direktori OpenGeo yang terletak di
    ( C: \ Program Files (x86) \ tak terbatas \ OpenGeo ) dan juga Salin direktori OpenGeo yang terletak di
    ( C: \ ProgramData \ tak terbatas \ OpenGeo ) sebelum memulai tutorial ini, sebagai langkah pencegahan.

  4. Salin file ( jetty-servlets-7.6.13.v20130916.jar ) (As-is) ke dalam direktori jetty Lib
    ( * C: \ Program Files (x86) \ tak terbatas \ OpenGeo \ jetty \ lib * ) juga direktori mungkin ubah sesuai direktori instalasi Anda.

  5. Salin dan tempel baris xml berikut ke dalam ( webdefault.xml ) yang terletak di
    ( C: \ Program Files (x86) \ tak terbatas \ OpenGeo \ jetty \ ect \ webdefault.xml ), saya tidak yakin lokasi untuk baris-baris ini untuk menempatkan dalam file itu penting atau tidak tetapi saya tempel mereka mulai dari baris # 306 setelah </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. Mulai layanan ( GeoServer , Postgres ), tunggu beberapa detik dan ramban ke halaman geoserver, geoserver akan mulai dengan benar.

Tutorial ini bekerja untuk saya dan saya harap ini berhasil untuk siapa saja yang menghadapi masalah yang sama.


Ini adalah pertanyaan ketiga yang Anda kirimi jawaban yang sama. Apakah Anda dapat meninjau masing-masing dari tiga jawaban Anda untuk memutuskan apakah mereka benar-benar menjawab pertanyaan yang diajukan atau hanya saran umum?
PolyGeo

Saya hanya tidak tahu bagaimana cara menjawab pertanyaan saya yang lain, jadi saya menyalinnya lagi di sini
Ahmed GIS

di pengemis saya sedang mencari solusi untuk masalah Cross-Origin dengan Geoserver dan Openlayers, setelah saya mencari solusi saya ingin membaginya dengan orang lain yang menghadapi masalah yang sama, jadi saya mencari di sini untuk kata kunci ini (CORS , Openlayers, Geoserver) dan saya menjawab pertanyaan yang sama untuk masalah saya, tetapi saya tidak tahu bagaimana harus merujuk pada jawaban saya yang lain, jadi saya menyalinnya lagi di sini. Saya tidak bermaksud mengulangi jawaban saya, saya ingin membantu orang lain seperti situs luar biasa ini membantu saya dalam masalah lain.
Ahmed GIS

Saya tidak memiliki akses ke geoserver layer sumber dan tidak tahu apa yang telah dilakukan pemilik server.
Magno C

@ Magnagno Anda harus memeriksa dengan pemilik server terlebih dahulu mungkin dia mengubah nama lapisan atau sesuatu yang lain.
Ahmed GIS

1

Pengaturan crossOrigin hanya (?) Ada untuk ol.source.TileImage. ( http://openlayers.org/en/master/apidoc/ol.source.TileImage.html - hapus centang "Stable only" di sudut kanan atas). ol.source.GeoJSON tidak memiliki pengaturan crossOrigin, karena Anda tidak dapat mengakses JSON melalui permintaan lintas situs.

Anda memiliki cara berbeda dalam hal ini:

  1. gunakan proxy web untuk panggilan ajax jika Anda tidak memiliki akses ke server, dari mana json berasal. (Cari misalnya untuk proksi ajax)
  2. Anda bisa menggunakan jsonp jika Anda memiliki akses ke server. Ini biasanya adalah solusi yang disukai tetapi saya tidak tahu apakah itu berfungsi dengan geojson dan Anda mungkin harus menimpa fungsi loader ( http://en.wikipedia.org/wiki/JSONP - Cara mendapatkan JSON dari Geoserver menggunakan Permintaan AJAX - http://openlayers.org/en/master/examples/vector-osm.js <- contoh untuk menggunakan fungsi pemuat khusus)
  3. aktifkan permintaan lintas-asal di server. ( http://en.wikipedia.org/wiki/Cross-origin_resource_sharing )
  4. jika datanya statis, unduh dan letakkan di server Anda sendiri (sebutkan untuk kelengkapan)

masalah serupa, tetapi tidak terkait geo: /programming/5549068/json-how-do-i-make-cross-domain-json-call


Simon, silakan lihat Pembaruan # 1 di atas sesuai saran Anda. Terima kasih.
user3657279


0

Periksa tajuk respons Geoserver di tab Firebug / Chrome Dev Tools Network untuk melihat apakah Acces-Control-Allow-Origin: * header benar-benar ada. Jika tidak, masalahnya ada di sisi wadah servlet. Atau mungkin, jika aplikasi bersifat internal, atur proxy pada server web utama daripada mengaktifkan CORS? Yang terakhir akan lebih masuk akal jika Geoserver Anda akan tersedia untuk umum.


Saya memeriksa header respons dengan membuka Firebug -> tab "Net" lalu mengklik tab "Headers". Ini menunjukkan 3 subbagian: Header Respons, Header Permintaan dan Header Respons dari Cache. Tidak disebutkan "Akses-Kontrol-Izinkan-Asal".
user3657279

Header Access-Control-Allow-Origin harus berada di subbagian Header Respons. Jika tidak, coba konfigurasi ulang wadah servlet Anda.
Michal Mackiewicz

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.