Apa itu Cross-Origin Resource Sharing (CORS) – Bagaimana cara menambahkannya ke Server Web Java Jersey Anda?
Diterbitkan: 2014-07-19 Bagaimana cara memperbaiki kesalahan ini selama komunikasi client-server
? Server mengirimkan data dalam format JSON atau XML dan klien melempar di bawah pengecualian.
1 2 3 |
XMLHttpRequest cannot load https : //crunchify.com/api/test. No 'Access-Control-Allow-Origin' header is present on the requested resource . Origin 'null' is therefore not allowed access . |
Halaman web biasa dapat menggunakan objek XMLHttpRequest untuk mengirim dan menerima data dari server jauh, tetapi dibatasi oleh kebijakan asal yang sama. Ekstensi tidak begitu terbatas. Ekstensi dapat berbicara dengan server jarak jauh di luar asalnya, selama ekstensi meminta izin lintas-asal terlebih dahulu.
Juga, jika Anda memiliki pertanyaan di bawah ini maka Anda berada di lokasi yang benar:
- Memahami Berbagi Sumber Daya Lintas Asal (Filter CORS)
- Dapatkah saya menggunakan Berbagi Sumber Daya Lintas-Asal
- Cara Mengaktifkan Berbagi Sumber Daya Lintas Asal
- Apa itu Cross-domain Ajax dengan Cross-Origin Resource Sharing
- Apa itu kontrol akses HTTP (CORS)
CORS (Cross Origin Resource Sharing) adalah mekanisme yang didukung oleh W3C untuk mengaktifkan permintaan lintas asal di browser web. CORS membutuhkan dukungan dari browser dan server untuk bekerja. Ini adalah implementasi filter Java Jersey Web Server dari CORS sisi server untuk wadah web seperti Apache Tomcat dan Server Web Tertanam lainnya.
Langkah 1:
Respons dapat menyertakan header Access-Control-Allow-Origin, dengan asal dari mana permintaan berasal sebagai nilai, untuk mengizinkan akses ke konten sumber daya. Agen pengguna memvalidasi bahwa nilai dan asal tempat permintaan berasal cocok.
Langkah 2:
Agen pengguna dapat mengetahui melalui permintaan preflight apakah sumber daya lintas asal disiapkan untuk menerima permintaan, menggunakan metode yang tidak sederhana, dari asal tertentu. Ini sekali lagi divalidasi oleh agen pengguna.
Langkah-3:
Aplikasi sisi server diaktifkan untuk menemukan bahwa permintaan HTTP dianggap sebagai permintaan lintas asal oleh agen pengguna, melalui header Asal. Ekstensi ini memungkinkan aplikasi sisi server untuk menerapkan batasan (misalnya tidak mengembalikan apa pun) pada permintaan lintas asal yang bersedia mereka layani.
Sekarang mari kita mulai dengan Contoh.
Contoh-1: Server Web Java Jersey
Beberapa minggu yang lalu saya menulis artikel tentang Cara Memulai Server HTTP Jersey Tertanam selama Startup Aplikasi Java. Posting ini akan membahas langkah-langkah tentang cara menambahkan Filter CORS ke Server Jersey yang sama.
Kita perlu memperluas ContainerResponseFilter. Antarmuka diimplementasikan oleh filter respons penampung. Secara default, yaitu jika tidak ada pengikatan nama yang diterapkan ke kelas implementasi filter, instance filter diterapkan secara global ke respons keluar apa pun.
Untuk memperbaikinya, mari coba tambahkan 4 header di bawah ini ke respons server:
- Akses-Kontrol-Izinkan-Asal
- Akses-Kontrol-Izinkan-Metode
- Akses-Kontrol-Maks-Usia
- Akses-Kontrol-Izinkan-Header
Kode Filter CORS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package com . crunchify . tutorial ; /** * * @author Crunchify.com */ import com . sun . jersey . spi . container . ContainerRequest ; import com . sun . jersey . spi . container . ContainerResponse ; import com . sun . jersey . spi . container . ContainerResponseFilter ; import javax . ws . rs . core . Response ; import javax . ws . rs . core . Response . ResponseBuilder ; public class CrunchifyCORSFilter implements ContainerResponseFilter { public ContainerResponse filter ( ContainerRequest req , ContainerResponse crunchifyContainerResponse ) { ResponseBuilder crunchifyResponseBuilder = Response . fromResponse ( crunchifyContainerResponse . getResponse ( ) ) ; // *(allow from all servers) OR https://crunchify.com/ OR http://example.com/ crunchifyResponseBuilder . header ( "Access-Control-Allow-Origin" , "https://crunchify.com/" ) // As a part of the response to a request, which HTTP methods can be used during the actual request. . header ( "Access-Control-Allow-Methods" , "API, CRUNCHIFYGET, GET, POST, PUT, UPDATE, OPTIONS" ) // How long the results of a request can be cached in a result cache. . header ( "Access-Control-Max-Age" , "151200" ) // As part of the response to a request, which HTTP headers can be used during the actual request. . header ( "Access-Control-Allow-Headers" , "x-requested-with,Content-Type" ) ; String crunchifyRequestHeader = req . getHeaderValue ( "Access-Control-Request-Headers" ) ; if ( null ! = crunchifyRequestHeader && !crunchifyRequestHeader.equals(null)) { crunchifyResponseBuilder.header("Access-Control-Allow-Headers", crunchifyRequestHeader); } crunchifyContainerResponse . setResponse ( crunchifyResponseBuilder . build ( ) ) ; return crunchifyContainerResponse ; } } |
Modifikasi JerseyEmbeddedHTTPServerCrunchify.java dari tutorial sebelumnya.

Cukup tambahkan baris di bawah ini di createHttpServer() dan restart server.
1 |
crunchifyResourceConfig . getContainerResponseFilters ( ) . add ( CrunchifyCORSFilter . class ) ; |
Hasil:
http://localhost:8085/api
Berikut adalah detail Header.
Contoh-2: Server HTTP Apache
Untuk mengekspos header, Anda dapat menambahkan baris berikut di dalam bagian <Directory>, <Location>, dan <Files>, atau di dalam file .htaccess
.
1 2 3 |
< IfModule mod_headers . c > Header set Access - Control - Allow - Origin "*" < / IfModule > |
Contoh-3: .NET server dapat mengkonfigurasi ini di web.config seperti di bawah ini
1 2 3 4 5 6 |
< system . webServer > < httpProtocol > < customHeaders > < add name = "Access-Control-Allow-Origin" value = "your_clientside_websiteurl" / > < / customHeaders > < system . webServer > |
Contoh-4: Untuk Jetty (7 ke atas)
Sertakan JAR jetty-servlet ke dalam WEB-INF/lib Anda dan gabungkan ini ke dalam WEB-INF/web.xml Anda
1 2 3 4 5 6 7 8 |
< 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 > |
Contoh-5: Apache Tomcat Server (v 7.0.41 +)
1 2 3 4 5 6 7 8 |
< filter > < filter - name > CorsFilter < / filter - name > < filter - class > org . apache . catalina . filters . CorsFilter < / filter - class > < / filter > < filter - mapping > < filter - name > CorsFilter < / filter - name > < url - pattern > /* < / url - pattern > < / filter - mapping > |
Contoh-6: Dalam PHP
1 2 3 |
<?php header ( "Access-Control-Allow-Origin: *" ) ; ?> |
Tolong beri tahu saya jika Anda memiliki pertanyaan lebih lanjut tentang ini. Daftar semua Tutorial Java akan ditemukan di sini.