Perkenalan

Header HTTP sangat penting dalam proses komunikasi antara klien dan server. Mereka memberikan informasi berharga tentang permintaan atau respons, seperti jenis konten, rangkaian karakter, preferensi bahasa, dan banyak lagi. Spring MVC, salah satu kerangka kerja Java yang banyak digunakan, menyediakan cara mudah dan elegan untuk bekerja dengan header HTTP menggunakan anotasi @RequestHeader dan @ResponseHeader. Dalam panduan ini, kita akan mempelajari cara kerja anotasi ini dan bagaimana anotasi tersebut dapat menyempurnakan aplikasi web kita.

Pengantar Header HTTP

Header HTTP telah menjadi bagian integral dalam komunikasi web sejak awal mula web. Header ini, yang merupakan bagian dari setiap permintaan dan respons HTTP, memfasilitasi kelancaran pertukaran informasi dan metadata antara klien dan server. Setiap header terdiri dari pasangan nilai kunci, terstruktur sebagai Name: Value.

Contohnya:

Content-Type: text/html; charset=UTF-8

Di sini, nama headernya adalah “Content-Type”, dan nilainya menunjukkan bahwa konten tersebut adalah dokumen HTML dengan pengkodean UTF-8.

Jenis Header HTTP

Header HTTP secara luas dapat dikategorikan ke dalam tipe berikut:

  • Header Umum: Ini ada dalam pesan permintaan dan respons namun tidak terkait langsung dengan data isi. Contohnya termasuk Cache-Control, Connection, dan Date.
  • Header Permintaan: Header ini memberikan informasi tambahan tentang sumber daya yang akan diambil atau tentang klien itu sendiri. Beberapa header permintaan yang umum adalah User-Agent (memberikan informasi tentang agen pengguna yang membuat permintaan) dan Accept (menunjukkan jenis media apa yang dapat diproses oleh klien).
  • Header Respons:Seperti namanya, header respons memberikan informasi tambahan tentang respons server. Header seperti Location (digunakan dalam pengalihan) dan Server (menjelaskan perangkat lunak yang digunakan oleh server asal) adalah contohnya.
  • Header Entitas:Ini digunakan untuk memberikan informasi tentang isi sumber daya, seperti panjang atau jenisnya. Content-Type (menunjukkan jenis sumber daya) dan Content-Length (menunjukkan ukuran respons) adalah contoh klasik.
  • Header Khusus: Selain header standar, pengembang dapat menentukan header khusus mereka sendiri. Header khusus sering kali dimulai dengan 'X-' (meskipun konvensi ini sudah tidak digunakan lagi), misalnya, X-Frame-Options.

Pentingnya Header HTTP

Header HTTP bukan hanya pembawa metadata pasif; mereka secara aktif mempengaruhi cara aplikasi web berperilaku:

  • Negosiasi: Header dapat digunakan untuk menegosiasikan jenis konten yang disajikan (HTML, JSON, XML) atau pengkodean yang digunakan.
  • Keamanan: Beberapa header memainkan peran penting dalam meningkatkan keamanan web. Header Strict-Transport-Security memastikan bahwa situs web hanya dapat diakses melalui HTTPS, sementara Content-Security-Policy membantu mencegah serangan skrip lintas situs.
  • Kinerja:Header mengontrol perilaku cache dan dapat memengaruhi kinerja aplikasi web secara signifikan. Pemanfaatan header caching yang tepat dapat mengurangi beban server dan meningkatkan waktu muat halaman.

Anotasi @RequestHeader

Di Spring MVC, anotasi menyederhanakan proses pengembangan aplikasi web, memastikan bahwa pengembang dapat fokus pada logika inti daripada boilerplate. Salah satu anotasi yang kuat adalah @RequestHeader. Ini mengikat nilai header HTTP ke parameter metode, memungkinkan integrasi data header dengan lancar dalam metode pengontrol Anda.

Memahami @RequestHeader

Pada intinya, anotasi @RequestHeader adalah cara untuk mengambil detail yang disampaikan oleh klien di header HTTP. Tanpa fitur ini, pengembang harus melalui proses rumit dalam menguraikan permintaan HTTP mentah untuk mengekstrak nilai header secara manual.

Contoh:

@RequestMapping("/fetchContentType")
public String getContentType(@RequestHeader("Content-Type") String contentType) {
    return "Content Type is: " + contentType;
}

Dalam cuplikan kode di atas, metode getContentType secara otomatis mendapatkan nilai header 'Tipe Konten' dari permintaan HTTP yang masuk, berkat @RequestHeader.

Menangani Banyak Header

Mungkin ada skenario ketika Anda perlu mengambil lebih dari satu header. Daripada mendeklarasikan beberapa parameter, Anda dapat menggunakan Map:

@RequestMapping("/fetchHeaders")
public String getHeaders(@RequestHeader Map<String, String> headers) {
    return "Headers are: " + headers.toString();
}

Pendekatan ini mengambil semua header dari permintaan dan menempatkannya di peta.

Menangani Header Opsional

Tidak semua header dijamin ada di setiap permintaan. Untuk kasus seperti ini, atribut required pada anotasi akan berguna:

@RequestMapping("/optionalHeader")
public String getOptionalHeader(@RequestHeader(value = "optional-header", required = false) String headerValue) {
    return headerValue != null ? "Header value is: " + headerValue : "Header not present.";
}

Di sini, jika "header opsional" bukan bagian dari permintaan, tidak ada kesalahan yang akan terjadi, dan metode akan menanganinya dengan baik.

Nilai dasar

Untuk header yang mungkin opsional, Spring menyediakan opsi untuk menetapkan nilai default. Jika header tidak ada dalam permintaan, nilai default akan digunakan:

@RequestMapping("/defaultHeaderValue")
public String getDefaultHeader(@RequestHeader(value = "X-Custom-Header", defaultValue = "default-value") String headerValue) {
    return "Header value is: " + headerValue;
}

Dalam contoh di atas, jika “X-Custom-Header” tidak ditemukan dalam permintaan masuk, headerValue akan disetel ke 'nilai default'.

Jenis Konversi

Kemampuan konversi tipe Spring MVC dapat secara otomatis mengonversi nilai header ke tipe data yang diinginkan:

@RequestMapping("/fetchDate")
public String getDate(@RequestHeader("Date") Date date) {
    return "Date header as a Date object: " + date.toString();
}

Jika header “Tanggal” dikirim dalam format tanggal yang valid, Spring akan secara otomatis mengonversinya menjadi objek Date.

Anotasi @ResponseHeader

Meskipun anotasi @RequestHeader adalah tentang membaca header yang masuk, ketika mengatur header pada respons HTTP, Spring MVC mengadopsi pendekatan yang sedikit berbeda. Bertentangan dengan namanya, tidak ada anotasi @ResponseHeader langsung di Spring MVC. Namun, pengembang dapat menggunakan alat seperti HttpServletResponse dan ResponseEntity yang lebih elegan untuk mencapai hasil yang diinginkan.

Menggunakan HttpServletResponse

Pendekatan Servlet API tradisional untuk menyetel header respons adalah melalui objek HttpServletResponse. Objek ini menyediakan metode untuk mengontrol dan mengubah respons yang dikirim ke klien.

@RequestMapping("/setHeaderUsingServlet")
public void setHeaderUsingServlet(HttpServletResponse response) {
    response.setHeader("X-Custom-Header", "CustomHeaderValue");
    response.getWriter().write("Header has been set!");
}

Dalam contoh ini, “X-Custom-Header” diatur pada respons, dan kemudian pesan sederhana ditulis ke isi respons.

Menggunakan ResponseEntity

Meskipun HttpServletResponse menawarkan cara mudah untuk menyetel header, kelas ResponseEntity menawarkan pendekatan yang lebih canggih dan berorientasi objek, terutama bermanfaat dalam aplikasi RESTful.

@RequestMapping("/setHeaderUsingEntity")
public ResponseEntity<String> setHeaderWithEntity() {
    HttpHeaders headers = new HttpHeaders();
    headers.set("X-Custom-Header", "CustomHeaderValue");
    
    return new ResponseEntity<>("Body with custom header", headers, HttpStatus.OK);
}

ResponseEntity menyediakan cara untuk mewakili keseluruhan respons HTTP, termasuk status, header, dan isi. Dalam contoh di atas, kami membuat respons baru dengan header khusus dan mengembalikannya.

Mengatur Banyak Header

Jika Anda ingin menyetel beberapa header pada suatu respons, HttpServletResponse dan ResponseEntity membuatnya cukup sederhana:

Menggunakan HttpServletResponse:

@RequestMapping("/setMultipleHeadersServlet")
public void setMultipleHeadersServlet(HttpServletResponse response) {
    response.setHeader("X-Custom-Header-1", "Value1");
    response.setHeader("X-Custom-Header-2", "Value2");
    response.getWriter().write("Multiple headers have been set!");
}

Menggunakan ResponseEntity:

@RequestMapping("/setMultipleHeadersEntity")
public ResponseEntity<String> setMultipleHeadersEntity() {
    HttpHeaders headers = new HttpHeaders();
    headers.set("X-Custom-Header-1", "Value1");
    headers.set("X-Custom-Header-2", "Value2");
    
    return new ResponseEntity<>("Body with multiple headers", headers, HttpStatus.OK);
}

Gunakan Kasus Header Respons

Menyetel header respons bukan sekadar pilihan gaya namun dapat memengaruhi perilaku aplikasi secara signifikan:

  • Kontrol Caching: Header seperti Cache-Control dapat memberikan instruksi kepada klien tentang cara menyimpan respons dalam cache, sehingga berpotensi meningkatkan kinerja aplikasi.
  • Keamanan: Header seperti X-Frame-Options atau Strict-Transport-Security dapat menerapkan kebijakan keamanan, sehingga membuat aplikasi web lebih aman.
  • Disposisi Konten:Jika Anda menyediakan download file, header Content-Disposition dapat digunakan untuk menyarankan nama file dan menunjukkan apakah browser harus menampilkan file atau memperlakukannya sebagai lampiran.

Aplikasi Praktis Header HTTP

Header HTTP, meski terkadang diabaikan, memainkan peran penting dalam membentuk perilaku dan karakteristik aplikasi web. Jika digunakan secara efektif, mereka dapat mengubah aplikasi web dasar menjadi platform yang sangat optimal, aman, dan ramah pengguna. Berikut adalah beberapa aplikasi praktis dan contoh bagaimana header HTTP dapat dimanfaatkan dalam Spring MVC.

Negosiasi Konten

Negosiasi konten memungkinkan server untuk menyajikan versi dokumen yang berbeda (atau lebih umum, representasi sumber daya) berdasarkan header permintaan dari klien. Header Accept, misalnya, memungkinkan klien menentukan format respons yang ingin diterimanya.

Di Musim Semi MVC:

@RequestMapping(value = "/negotiateContent", produces = {"application/json", "application/xml"})
public ResponseEntity<User> getUser() {
    User user = new User("John", 30);
    return new ResponseEntity<>(user, HttpStatus.OK);
}

Metode pengontrol di atas dapat menyajikan objek User baik sebagai JSON atau XML, bergantung pada nilai header Accept dalam permintaan masuk.

Meningkatkan Keamanan

Header HTTP dapat meningkatkan postur keamanan aplikasi Anda secara signifikan:

  • X-Frame-Options:Header ini dapat mencegah serangan clickjacking dengan mengontrol apakah browser boleh dibolehkan merender laman dalam format <frame>, <iframe>, <embed>, atau <object>.
response.setHeader("X-Frame-Options", "DENY");
  • Keamanan-Transportasi Ketat: Header ini memastikan bahwa semua komunikasi dari agen pengguna harus dilakukan melalui HTTPS. Ini dapat diatur sebagai:
response.setHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains");

Mengelola Caching Sisi Klien

Header HTTP mengontrol bagaimana, atau bahkan jika, caching diterapkan di sisi klien, sehingga memengaruhi kinerja:

  • Kontrol Cache: Mengarahkan semua mekanisme cache tentang cara menggunakan respons.
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
  • Kedaluwarsa:Menyediakan tanggal/waktu setelah respons dianggap basi.
response.setHeader("Expires", "Tue, 03 Jul 2001 06:00:00 GMT");

Mengaktifkan CORS

Header Cross-Origin Resource Sharing (CORS) memungkinkan Anda menentukan asal mana yang diizinkan untuk membaca sumber daya di halaman web.

Menggunakan anotasi @CrossOrigin Spring:

@CrossOrigin(origins = "https://allowed-origin.com")
@RequestMapping("/corsEnabledEndpoint")
public ResponseEntity<String> handleCORS() {
    return new ResponseEntity<>("CORS-enabled response", HttpStatus.OK);
}

Metode pengontrol di atas hanya akan menerima permintaan dari “'.

Menangani Pengunduhan File

Header HTTP dapat memfasilitasi pengunduhan file:

  • Disposisi Konten: Menunjukkan apakah konten harus ditampilkan sebaris atau diperlakukan sebagai lampiran.
response.setHeader("Content-Disposition", "attachment; filename=\"filename.jpg\"");

Ini akan meminta pengguna untuk mengunduh file dengan nama file yang ditentukan.

Kesimpulan

Header HTTP memainkan peran penting dalam meningkatkan fungsionalitas dan efisiensi aplikasi web. Spring MVC menyediakan cara mudah untuk bekerja dengan header ini menggunakan anotasi @RequestHeader dan mekanisme respons seperti HttpServletResponse dan ResponseEntity. Baik Anda menangani negosiasi konten, preferensi bahasa, atau membangun perilaku khusus berdasarkan header, Spring MVC siap membantu Anda.

  1. Dokumentasi MVC Musim Semi
  2. Header HTTP MDN
  3. @CrossOrigin di Musim Semi