Memperbaiki Masalah React dan Spring Boot CORS: Permintaan GET yang Diblokir

Temp mail SuperHeros
Memperbaiki Masalah React dan Spring Boot CORS: Permintaan GET yang Diblokir
Memperbaiki Masalah React dan Spring Boot CORS: Permintaan GET yang Diblokir

Memahami Kesalahan CORS di Spring Boot dan Aplikasi React

Saat mengembangkan aplikasi web menggunakan Bereaksi untuk bagian depan dan Sepatu Musim Semi untuk backend, masalah umum yang dihadapi pengembang adalah kesalahan CORS yang terkenal. Kesalahan ini terjadi ketika browser memblokir permintaan karena alasan keamanan, terutama ketika mencoba menyambung ke layanan backend yang dihosting di port atau domain berbeda. Dalam hal ini, Anda menghadapi masalah CORS saat membuat a DAPATKAN permintaan dari React ke Spring Boot API.

Pesan kesalahan biasanya menunjukkan bahwa browser memblokir permintaan Anda karena Akses-Kontrol-Izinkan-Asal header hilang atau tidak dikonfigurasi dengan benar. Perlu dicatat bahwa alat-alat seperti itu Tukang pos jangan terapkan batasan keamanan ini, itulah sebabnya permintaan Anda mungkin berfungsi dengan baik di Postman tetapi gagal di browser.

Dalam skenario Anda, pesan kesalahan menunjukkan bahwa permintaan preflight tidak lolos pemeriksaan kontrol akses. Hal ini biasanya terjadi ketika header atau metode tertentu tidak diizinkan atau dikonfigurasi dengan benar dalam kebijakan CORS server. Meskipun konfigurasi CORS tampaknya diterapkan di sisi server, mungkin ada masalah khusus dalam cara menangani permintaan browser.

Artikel ini akan membantu Anda memahami akar penyebab masalah dan memandu Anda melalui kemungkinan solusi untuk mengatasinya kesalahan CORS di aplikasi React dan Spring Boot Anda.

Memerintah Contoh Penggunaan
@WebMvcConfigurer Anotasi Spring Boot yang digunakan untuk mengonfigurasi pengaturan web seperti CORS, interseptor, dan pemformat. Dalam konteks masalah ini, ini digunakan untuk menentukan aturan pemetaan CORS yang mengizinkan asal dan metode tertentu.
allowedOrigins() Metode ini adalah bagian dari konfigurasi CORS dan menentukan asal mana yang diizinkan untuk mengakses server. Dalam hal ini, ini memastikan bahwa frontend yang berjalan di 'http://localhost:8081' dapat berkomunikasi dengan backend.
withCredentials() Konfigurasi Axios yang memungkinkan permintaan lintas asal menyertakan kredensial seperti cookie dan autentikasi HTTP. Hal ini penting ketika menangani permintaan aman yang memerlukan data khusus pengguna.
MockMvcRequestBuilders.options() Sebuah metode dalam kerangka MockMvc Spring Boot yang digunakan untuk mensimulasikan permintaan HTTP OPTIONS. Ini biasanya digunakan untuk menangani permintaan preflight di CORS, memeriksa izin server sebelum permintaan sebenarnya dikirim.
HttpHeaders.ORIGIN Header ini digunakan di CORS untuk menentukan asal permintaan. Dalam skenario lintas asal, ini dikirim dari frontend ke server untuk memverifikasi apakah asal diizinkan.
MockMvcResultMatchers.header() Ini adalah metode yang digunakan dalam pengujian unit untuk memeriksa header HTTP tertentu dalam respons. Ini memastikan bahwa header 'Access-Control-Allow-Origin' dikembalikan dengan benar sebagai respons terhadap permintaan preflight.
Authorization: Bearer Dalam permintaan Axios, header ini meneruskan token Pembawa untuk autentikasi. Ini memastikan bahwa backend dapat memverifikasi identitas klien yang membuat permintaan.
useEffect() React Hook yang dijalankan setelah komponen dirender. Dalam hal ini, ini digunakan untuk memicu panggilan API ke backend, mengambil data proyek saat komponen dipasang.
axios.get() Sebuah metode yang disediakan oleh Axios untuk membuat permintaan HTTP GET. Dalam skenario ini, ini digunakan untuk mengirim permintaan ke Spring Boot API dan mengambil data proyek.

Menangani Error CORS pada Aplikasi React dan Spring Boot

Script yang disediakan di atas bertujuan untuk menyelesaikan masalah kesalahan CORS dalam pengaturan frontend React dan backend Spring Boot. Kesalahan terjadi ketika frontend, yang dihosting di 'http://localhost:8081', mencoba membuat permintaan GET ke Spring Boot API yang dihosting di 'http://localhost:8080'. Browser menerapkan aturan keamanan yang ketat untuk mencegah permintaan lintas asal yang tidak sah, itulah sebabnya kebijakan CORS ini ada. Itu WebMvcConfigurer kelas dalam konfigurasi backend Spring Boot membantu menentukan aturan CORS yang mengizinkan asal dan metode tertentu, yang pada akhirnya menyelesaikan masalah.

Di backend, file `CorsConfig.java` mendefinisikan kelas konfigurasi Spring Boot. Itu @Kacang Dan @Mengesampingkan anotasi digunakan untuk memasukkan dan menyesuaikan konfigurasi CORS. Dalam metode `addCorsMappings()`, fungsi `allowedOrigins()` secara eksplisit mengizinkan permintaan dari 'http://localhost:8081', memastikan bahwa browser mengenali asal ini sebagai sumber tepercaya. Penyertaan `allowedMethods()` memastikan bahwa semua metode HTTP, termasuk GET, POST, dan OPTIONS, diizinkan. Hal ini penting karena browser biasanya mengirimkan permintaan OPTIONS sebelum penerbangan untuk memeriksa apakah permintaan GET yang sebenarnya diperbolehkan.

Di frontend, React menangani permintaan menggunakan aksio, klien HTTP yang populer. Dalam fungsi `fetchData` pada file `ProjectPage.tsx`, fungsi `axios.get()` mengirimkan permintaan GET ke backend Spring Boot. Opsi `withCredentials` disetel ke true, memungkinkan cookie dan kredensial autentikasi dikirim bersama permintaan. Selain itu, header Otorisasi disertakan untuk meneruskan token pengguna, memastikan bahwa permintaan diautentikasi dengan benar. Tanpa konfigurasi ini, browser akan memblokir permintaan tersebut karena alasan keamanan.

Terakhir, file pengujian unit, `CorsTest.java`, memvalidasi bahwa konfigurasi CORS berfungsi seperti yang diharapkan. Pengujian ini menyimulasikan permintaan HTTP OPTIONS ke API backend, yang meniru permintaan preflight nyata yang dibuat oleh browser. Pengujian memeriksa apakah respons berisi header yang benar, seperti Akses-Kontrol-Izinkan-Asal, yang memungkinkan permintaan lintas asal dari frontend. Metode `MockMvcResultMatchers.header()` memastikan bahwa server merespons permintaan preflight dengan benar. Dengan menyertakan pengujian unit, pengembang dapat memastikan bahwa konfigurasi CORS mereka dapat diandalkan dan berfungsi di berbagai lingkungan.

Mengatasi Kesalahan CORS di React + Spring Boot dengan Konfigurasi Tweaks

Pendekatan 1: Menggunakan Konfigurasi Spring Boot CORS di Backend

// CorsConfig.java
@Configuration
public class CorsConfig implements WebMvcConfigurer {
   @Override
   public void addCorsMappings(CorsRegistry registry) {
      registry.addMapping("/")
              .allowedOrigins("http://localhost:8081")
              .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
              .allowedHeaders("*")
              .allowCredentials(true);
   }
}

Menggunakan Axios untuk Penanganan CORS yang Benar dengan Cookies di React

Pendekatan 2: Konfigurasi React Frontend Axios untuk Permintaan Lintas Asal

// ProjectPage.tsx
const ProjectsPage = () => {
   const [projectsData, setProjectsData] = useState<ProjectsData[]>([]);
   const projectsUrl = 'http://localhost:8080/api/projects/admin/toinspection';
   useEffect(() => { fetchData(); }, []);
   const fetchData = async () => {
      const token = Cookies.get('token');
      try {
         const response = await axios.get<ProjectsData[]>(projectsUrl, {
            headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}` },
            withCredentials: true
         });
         setProjectsData(response.data);
      } catch (error) {
         console.error("Error fetching projects:", error);
      }
   };
   return (
      <div>
         <AdminPageTemplate type="projects" children=<AdminModContent data={projectsData} />/>
      </div>
   );
};
export default ProjectsPage;

Menguji Kebijakan CORS dengan Tes Unit di Spring Boot

Pendekatan 3: Tes Unit Penulisan untuk Memvalidasi Kebijakan CORS

// CorsTest.java
@RunWith(SpringRunner.class)
@WebMvcTest
public class CorsTest {
   @Autowired
   private MockMvc mockMvc;
   @Test
   public void testCorsHeaders() throws Exception {
      mockMvc.perform(MockMvcRequestBuilders.options("/api/projects/admin/toinspection")
              .header(HttpHeaders.ORIGIN, "http://localhost:8081")
              .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET"))
              .andExpect(MockMvcResultMatchers.status().isOk())
              .andExpect(MockMvcResultMatchers.header().exists("Access-Control-Allow-Origin"))
              .andExpect(MockMvcResultMatchers.header().string("Access-Control-Allow-Origin", "http://localhost:8081"));
   }
}

Menjelajahi CORS dalam Konteks Keamanan dan Desain API

Saat berhadapan dengan CORS (Berbagi Sumber Daya Lintas Asal) dalam aplikasi web modern, penting untuk memahami implikasi keamanan di baliknya. CORS diterapkan sebagai tindakan keamanan oleh browser untuk mencegah situs web jahat membuat permintaan API tidak sah atas nama pengguna. Hal ini sangat penting dalam skenario ketika data sensitif dipertukarkan antara layanan frontend dan backend, seperti token autentikasi dan kredensial pengguna. Saat menyiapkan CORS di backend Spring Boot, penting untuk hanya mengizinkan sumber tepercaya yang mengakses sumber daya yang dilindungi, sehingga menjadikan konfigurasi keamanan sebagai elemen kunci arsitektur sistem.

Aspek penting lainnya adalah menangani permintaan preflight, yang merupakan permintaan otomatis yang dibuat oleh browser sebelum permintaan GET atau POST sebenarnya. Hal ini terjadi ketika klien perlu mengonfirmasi apakah server mengizinkan permintaan lintas asal dan mendukung header atau metode tertentu. Dalam beberapa kasus, kesalahan konfigurasi dalam penanganannya permintaan sebelum penerbangan dapat menyebabkan masalah, mengakibatkan kesalahan CORS meskipun permintaan sebenarnya berfungsi dengan baik di alat seperti Tukang Pos. Mengonfigurasi `CorsRegistry` Spring Boot dengan header dan metode yang tepat memastikan bahwa permintaan preflight diproses dengan benar, memungkinkan interaksi yang lancar antara frontend dan backend.

Selain itu, penanganan CORS tidak boleh bersifat statis atau bersifat universal. Dalam lingkungan dinamis seperti yang dikelola dengan layanan mikro, API yang berbeda mungkin memiliki persyaratan keamanan yang berbeda. Beberapa API mungkin hanya perlu mengekspos metode tertentu, sementara API lainnya mungkin memerlukan kontrol yang lebih ketat terhadap asal. Di sinilah penyempurnaan konfigurasi CORS untuk setiap titik akhir menjadi penting. Manajemen CORS yang tepat juga membantu mengoptimalkan kinerja API dengan mengurangi permintaan preflight yang tidak perlu dan memastikan kelancaran interaksi pengguna.

Pertanyaan Umum Tentang CORS di React dan Spring Boot

  1. Apa itu CORS dan mengapa saya memerlukannya?
  2. CORS adalah mekanisme keamanan yang diterapkan oleh browser untuk mengizinkan atau memblokir permintaan lintas asal. Anda memerlukannya untuk memastikan bahwa hanya asal tepercaya yang dapat mengakses API Anda.
  3. Bagaimana cara mengaktifkan CORS di Spring Boot?
  4. Di Spring Boot, Anda dapat mengaktifkan CORS dengan mengonfigurasi @WebMvcConfigurer antarmuka dan menentukan asal, metode, dan header yang diizinkan menggunakan allowedOrigins Dan allowedMethods.
  5. Mengapa permintaan saya berfungsi di Tukang Pos tetapi gagal di browser?
  6. Tukang pos mengabaikan kebijakan keamanan browser seperti CORS, namun browser menerapkannya dengan ketat. Pastikan server Anda mengirimkan header CORS yang tepat ke browser.
  7. Apa itu permintaan sebelum penerbangan?
  8. Permintaan pra-penerbangan bersifat otomatis OPTIONS permintaan yang dikirim oleh browser untuk memeriksa apakah permintaan sebenarnya diizinkan oleh server, khususnya untuk permintaan HTTP yang tidak sederhana.
  9. Bagaimana cara menguji pengaturan CORS saya?
  10. Anda dapat menguji konfigurasi CORS Anda menggunakan MockMvcRequestBuilders.options() dalam pengujian unit untuk mensimulasikan permintaan pra-penerbangan dan memverifikasi respons server.

Pemikiran Terakhir tentang CORS di React dan Spring Boot

Menyelesaikan kesalahan CORS dalam aplikasi dengan React dan Spring Boot melibatkan pemahaman yang jelas tentang kebijakan keamanan yang diterapkan oleh browser. Dengan mengonfigurasi asal dan metode yang diizinkan di backend Spring Boot dengan benar, sebagian besar masalah ini dapat dicegah.

Selain itu, menangani token dengan aman dalam permintaan dan memastikan header yang tepat dikirim akan memastikan kelancaran komunikasi antara sistem frontend dan backend. Panduan ini membantu mengatasi tantangan umum yang dihadapi pengembang, memastikan permintaan lintas asal yang aman dan berfungsi.

Sumber dan Referensi Solusi CORS di React dan Spring Boot
  1. Informasi lengkap mengenai penanganannya KOR kesalahan dalam aplikasi Spring Boot tersedia di dokumentasi resmi Spring. Dokumentasi CORS Kerangka Musim Semi
  2. Untuk memahami cara mengelola CORS di aplikasi React menggunakan Axios, Anda dapat merujuk ke panduan ini. Konfigurasi Permintaan Axios
  3. Artikel dari Baeldung ini memberikan wawasan tentang konfigurasi CORS di lingkungan Spring Boot. Baeldung - Panduan CORS Boot Musim Semi
  4. Mozilla Developer Network (MDN) menawarkan penjelasan komprehensif tentang CORS dan pentingnya keamanan web. Dokumen Web MDN - CORS