1. Gambaran keseluruhan
Dalam artikel ringkas ini, kita akan belajar bagaimana mengaktifkan CORS ( Cross-Origin Resource Sharing ) dalam sistem berasaskan JAX-RS . Kami akan menyediakan aplikasi di atas JAX-RS untuk mengaktifkan mekanisme CORS .
2. Cara Mengaktifkan Mekanisme CORS
Terdapat dua cara yang membolehkan kita mengaktifkan CORS di JAX-RS. Cara pertama dan paling asas adalah dengan membuat saringan untuk menyuntikkan header respons yang diperlukan pada waktu berjalan dalam setiap permintaan. Yang lain adalah dengan menambahkan header yang sesuai secara manual di setiap titik akhir URL.
Sebaik-baiknya, penyelesaian pertama harus digunakan; namun, jika itu bukan pilihan, pilihan yang lebih manual adalah teknikal juga.
2.1. Menggunakan Penapis
JAX-RS mempunyai antara muka ContainerResponseFilter - dilaksanakan oleh penapis tindak balas kontena. Biasanya, contoh penapis ini digunakan secara global untuk sebarang respons HTTP.
Kami akan melaksanakan antara muka ini untuk membuat penapis tersuai yang akan memasukkan header Access-Control-Allow- * ke setiap permintaan keluar dan mengaktifkan mekanisme CORS :
@Provider public class CorsFilter implements ContainerResponseFilter { @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { responseContext.getHeaders().add( "Access-Control-Allow-Origin", "*"); responseContext.getHeaders().add( "Access-Control-Allow-Credentials", "true"); responseContext.getHeaders().add( "Access-Control-Allow-Headers", "origin, content-type, accept, authorization"); responseContext.getHeaders().add( "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); } }
Beberapa perkara di sini:
- Penapis yang melaksanakan ContainerResponseFilter mesti dijelaskan secara eksplisit dengan @Provider untuk ditemui oleh JAX-RS runtime
- Kami menyuntik header ' Access-Control-Allow- * ' dengan '*', itu bermaksud mana-mana titik akhir URL ke contoh pelayan ini dapat diakses melalui domain apa pun; jika kita mahu menyekat akses merentas domain secara eksplisit, kita harus menyebutkan domain tersebut dalam tajuk ini
2.2. Menggunakan Pengubahsuaian Header ke Setiap Titik Akhir
Seperti yang dinyatakan sebelumnya, kami dapat memasukkan header ' Access-Control-Allow- * ' secara eksplisit pada tahap titik akhir juga:
@GET @Path("/") @Produces({MediaType.TEXT_PLAIN}) public Response index() { return Response .status(200) .header("Access-Control-Allow-Origin", "*") .header("Access-Control-Allow-Credentials", "true") .header("Access-Control-Allow-Headers", "origin, content-type, accept, authorization") .header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD") .entity("") .build(); }
Yang perlu diperhatikan di sini adalah jika kita berusaha mengaktifkan CORS dalam aplikasi besar, kita tidak boleh mencuba kaedah ini kerana dalam hal ini, kita harus memasukkan header secara manual ke setiap titik akhir URL yang akan memperkenalkan overhead tambahan.
Namun, teknik ini dapat digunakan dalam aplikasi, di mana kita perlu mengaktifkan CORS hanya di beberapa titik akhir URL.
3. Menguji
Setelah aplikasi habis, kita dapat menguji header menggunakan perintah curl. Contoh output header adalah seperti di bawah:
HTTP/1.1 200 OK Date : Tue, 13 May 2014 12:30:00 GMT Connection : keep-alive Access-Control-Allow-Origin : * Access-Control-Allow-Credentials : true Access-Control-Allow-Headers : origin, content-type, accept, authorization Access-Control-Allow-Methods : GET, POST, PUT, DELETE, OPTIONS, HEAD Transfer-Encoding : chunked
Lebih-lebih lagi, kita boleh membuat fungsi AJAX mudah dan memeriksa fungsi merentas domain:
function call(url, type, data) { var request = $.ajax({ url: url, method: "GET", data: (data) ? JSON.stringify(data) : "", dataType: type }); request.done(function(resp) { console.log(resp); }); request.fail(function(jqXHR, textStatus) { console.log("Request failed: " + textStatus); }); };
Sudah tentu untuk benar-benar melakukan pemeriksaan, kita harus menjalankannya dengan asal yang berbeza daripada API yang kita gunakan.
Anda boleh melakukannya dengan mudah dengan menjalankan aplikasi pelanggan pada port yang berasingan - kerana port tersebut menentukan asal usulnya.
4. Kesimpulan
Dalam artikel ini, kami menunjukkan tentang menerapkan mekanisme CORS dalam aplikasi berbasis JAX-RS.
Seperti biasa, kod sumber penuh boleh didapati di GitHub.