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:
sumber
Jawaban:
Ada cara sederhana untuk menggunakan JSONP:
... ENABLE_JSONP true ... 2. Mulai ulang geoserver Anda. Sekarang untuk permintaan GetFeatureInfo , geoserver akan mengirim parseResponse (data JSON) ke klien
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);
};
sumber
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:
Berikut langkah-langkah terperinci:
( 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.
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.
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.
( 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>
.Tutorial ini bekerja untuk saya dan saya harap ini berhasil untuk siapa saja yang menghadapi masalah yang sama.
sumber
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:
masalah serupa, tetapi tidak terkait geo: /programming/5549068/json-how-do-i-make-cross-domain-json-call
sumber
Saya mengalami kesalahan CORS saat menggunakan permintaan GetFeatureInfo untuk mendapatkan info dari lapisan geoserver WMS di peta OpenLayers saya.
Jawaban per Mei 2020:
https://docs.geoserver.org/latest/en/user/production/container.html#enable-cors
sumber
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.
sumber
Masalah CORS saya diselesaikan oleh http://2carto.com/enable-cors-domain-geoserver-2-8/#comment-53 untuk GeoServer 2.8. (tidak berguna untuk GeoServer 2.9)
sumber