Moi
Työskentelen tässä Leaflet kirjaston kanssa ja haluaisin tallentaa kulloinkin näkyvän kartan palvelimelle (pelkän taustakartan).
Tähän löytyy oma lisäosakin, mutta ilmeisesti se aiheuttaa tietoturvaongelman (CORS), jolloin selain ei suostu enää "hyväksymään dataa". Ja tämä liittynee taustakarttarajapinnan tarjoavaan verkkopalveluun.
Data on siis dirtyä, jolloin html canvas ei sitä enää ns. niele.
Uusimmat selaimet tukee tuota CORSia, mutta tässä tapauksessa ei liene kyse siitä.
Mietinkin tässä, että ilmeisesti header data määrittelee tässä selaimen käyttäytymisen ja koska kyse on clientissä tapahtuasta toiminnasta, niin siihenhän ei vaikuta oman palvelimen/palvelun asetukset?
Toinen lähestymistapa, jota mietin, on esim. palvelinpään js käyttö esim. node. Vaikkakin käyttöönotto ainoastaan tätä toimintoa varten on ehkä hieman liikaa.
Tai muutoin kulloinkin näkyvien taustakarttakuvien id toimitus pannulle, joka sitten noutaa ne ja muodostaa ison kuvan.
Voit toki omalle palvelimellesi CORS:in sallia. Kysehän on siis siitä, että sallitaanko palvelimellesi toisesta domainista tuleva kama. Mikäli kutsu palvelimellesi saapuu toisesta domainista, esim https://karttapalvelin.com/kartta, voit sallia tämän palvelimesi päässä missä tallennuksen sinulle postatulle kartalle suoritat.
Access-Control-Allow-Origin: https://karttapalvelin.com tai sallia kaikki Access-Control-Allow-Origin: *
Eli siis
-mun oma palvelin lähettää sen JS:n mukana allow-* headerit, jolloin
-CORS tuettu selain sallii JS:n hyödyntää muista domaineista tulevaa dataa?
Kuten tästä verrattain havainnollisesta postauksesta voisi päätellä?
Ja tarttis vissiin jonku polyfillin väliin, että toimii laajemmalti.
Muutamaa sorttia näyttäs löytyvän, joskaan ei ihan plug'n'play ratkaisuja...
Ei,vaan cors lupa annetaan palvelimelle. Selain lähettää Options tiedossa originin, jota verrataan palvelimelle määriteltyihin lupiin. Eli jos sivustosi www.abc.com lähettää tiedoston tai hakee vaikka fontteja resurssiksi www.foo.com domainissa sijaitsevasta palvelimesta, pitää Foo.comin palvelimelle antaa cors lupa abc.comille.
Eli kun
-omassa palvelussa abc.com client kutsuu foo.com karttapalvelun taustakuvia, niin
-foo.com palvelun käyttämään palvelimeen tulee olla asetettu vähintään Access-Control-Allow-Origin: abc.com?
Eli esimerkiksi ns. avoimet rajapinnat on CORS tuettuja * arvolla ja vastaavasti suljetut konfiguraation mukaan joko tunnuksilla tai domain tmv.
Esimerkki avoimista ovat nuo esittämäsi fonttipalvelut.
Vai vieläkö tässä on puurot ja vellit sekaisin?
Kyllä, juuri noin.
Multibyte kirjoitti:
Toinen lähestymistapa, jota mietin, on esim. palvelinpään js käyttö esim. node.
Jäi ihmetyttämään, millä tavalla kysyjän mielestä palvelinpuolen JS ratkaisisi ongelman ja mihin vaihtoehtoon verrattuna. Eihän sillä pysty tekemään sen enempää tai vähempää kuin vaikka PHP:llä.
Sanon vain, ettei jäisi tuostakin asiasta puurot ja vellit sekaisin.
Ei millään tavalla. Viimeisin viesti oli oikein. Mikäli palvelin joka karttoja tarjoaa ei corsia tue, ei niitä voi crossdomain resursseina käyttää. Ihan sama millä niitä hakee. Joko Ajax palauttaa cors virheen, tai selain, miten haun sitte haluaakaan toteuttaa.
Itse oletin alussa että on itse toteutettu rajapinta kartoille, ja sitä kutsuttaessa sai cors virheen aikaiseksi, joka olisi voitu korjaamalla oman rajapinnan määreet
Vielä tässä ihmetyttää se, että kun taustakartta/karttalohkot on jo kertaalleen ladattu clientiin, niin miksei niitä voisi käyttää uudelleen?
Siis ikään kuin samaa resurssia?
Muutoin asia on kyllä harvinaisen selvä :)
Niin, miten saat tuon cors virheen aikaiseksi?
Mikäli lataat kartan esimerkiksi IFramella, saattaa vastapuoli sallia IFramet X-Frame-Options määreellä, mutta ei itse resurssin suorakäyttöä (Access-Control-Allow-Origin)
Tässä on esimerkki palvelinpään JSstä ja samalla myös tavoitetilasta.
Toinen vastaava, mutta clientissa tehtynä.
Mutta kuten todettua, niin ilmeisesti käyttämäni karttapalvelu ei tue CORSia.
Kysymys koski lähinnä sitä että miten näytät kartat sivuillasi nyt, jos se kerran toimii
MultiByte kirjoitti:
Vielä tässä ihmetyttää se, että kun taustakartta/karttalohkot on jo kertaalleen ladattu clientiin, niin miksei niitä voisi käyttää uudelleen?
Tähän vastasin, että jos IFramella niin se voi olla sallittu erikseen. Jos CORS on taasen muuten estetty, on ihan sama miten yrität resurssia hakea (client puolella js:llä tai backendissä)
Tässä käytetään ihan normaaliin tapaa avointa karttakirjastoa vaikkapa Leaflet. Kartta toimii normaalisti.
Se ei kuitenkaan toimi, että exporttaisin sen.
Siksi jäin siis ihmettelmään, että eikö niitä samoja "kuvaresursseja" voisi käyttää ilman uusia pyyntöjä ts. estoja?
Jos kuva on jo clientissa, niin lyhyellä matikalla sen voisi olettaa olevan "käytettävissä"?
Tuo standarditapa hakee siis ne kuvat aina uudestaan, kun pelataan canvas elementin kanssa, jolloin selaimen rajoitteet tulee vastaan.
Tätä silmällä pitäen viittasin palvelinpään JSään eli sehän voi siellä luoda sen kartan yhtälailla ja tehdät temput, jolloin siihen ei liity CORS ongelmaa.
Eli käytännössä pyynnön kierrättäminen oman palvelimen kautta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.