Menangani Cookies dan Sesi di Java Servlet

1. Ikhtisar

Dalam tutorial ini, kami akan membahas penanganan cookie dan sesi di Java, menggunakan Servlets .

Selain itu, kami akan menjelaskan secara singkat apa itu cookie, dan mempelajari beberapa contoh kasus penggunaan untuk itu.

2. Dasar-dasar Cookie

Sederhananya, cookie adalah bagian kecil dari data yang disimpan di sisi klien yang digunakan server saat berkomunikasi dengan klien .

Mereka digunakan untuk mengidentifikasi klien saat mengirim permintaan berikutnya. Mereka juga dapat digunakan untuk meneruskan beberapa data dari satu servlet ke servlet lainnya.

Untuk lebih jelasnya, silakan merujuk ke artikel ini.

2.1. Buat Cookie

Kelas Cookie didefinisikan dalam paket javax.servlet.http .

Untuk mengirimkannya ke klien, kita perlu membuatnya dan menambahkannya ke respon :

Cookie uiColorCookie = new Cookie("color", "red"); response.addCookie(uiColorCookie); 

Namun, API-nya jauh lebih luas - mari kita jelajahi.

2.2. Setel Tanggal Kedaluwarsa Cookie

Kita dapat mengatur usia maksimal (dengan metode maxAge (int) ) yang menentukan berapa detik cookie tertentu harus valid untuk:

uiColorCookie.setMaxAge(60*60); 

Kami menetapkan usia maksimal menjadi satu jam. Setelah itu, cookie tidak dapat digunakan oleh klien (browser) saat mengirim permintaan dan juga harus dihapus dari cache browser.

2.3. Setel Domain Cookie

Metode berguna lainnya di Cookie API adalah setDomain (String) .

Ini memungkinkan kami untuk menentukan nama domain yang harus dikirimkan oleh klien. Itu juga tergantung pada apakah kita menentukan nama domain secara eksplisit atau tidak.

Mari tetapkan domain untuk cookie:

uiColorCookie.setDomain("example.com");

Cookie akan dikirimkan ke setiap permintaan yang dibuat oleh example.com dan subdomainnya.

Jika kami tidak menentukan domain secara eksplisit, itu akan disetel ke nama domain yang membuat cookie .

Misalnya, jika kita membuat cookie dari example.com dan membiarkan nama domain kosong, maka itu akan dikirimkan ke www.example.com (tanpa subdomain).

Bersama dengan nama domain, kami juga dapat menentukan jalur. Mari kita lihat selanjutnya.

2.4. Setel Jalur Cookie

Path menentukan di mana cookie akan dikirim.

Jika kami menentukan jalur secara eksplisit, Cookie akan dikirim ke URL yang diberikan dan semua subdirektorinya:

uiColorCookie.setPath("/welcomeUser");

Secara implisit, ini akan disetel ke URL yang membuat cookie dan semua subdirektorinya.

Sekarang mari kita fokus pada bagaimana kita dapat mengambil nilainya di dalam Servlet .

2.5. Baca Cookies di Servlet

Cookie ditambahkan ke permintaan oleh klien. Klien memeriksa parameternya dan memutuskan apakah dapat mengirimkannya ke URL saat ini.

Kita bisa mendapatkan semua cookie dengan memanggil getCookies () pada permintaan ( HttpServletRequest ) yang diteruskan ke Servlet .

Kita dapat melakukan iterasi melalui array ini dan mencari yang kita butuhkan, misalnya dengan membandingkan namanya:

public Optional readCookie(String key) { return Arrays.stream(request.getCookies()) .filter(c -> key.equals(c.getName())) .map(Cookie::getValue) .findAny(); }

2.6. Hapus Cookie

Untuk menghapus cookie dari browser, kita harus menambahkan yang baru ke respons dengan nama yang sama, tetapi dengan nilai maxAge disetel ke 0 :

Cookie userNameCookieRemove = new Cookie("userName", ""); userNameCookieRemove.setMaxAge(0); response.addCookie(userNameCookieRemove);

Contoh kasus penggunaan untuk menghapus cookie adalah tindakan logout pengguna - kami mungkin perlu menghapus beberapa data yang disimpan untuk sesi pengguna aktif.

Sekarang kita tahu bagaimana kita bisa menangani cookie di dalam Servlet .

Selanjutnya, kita akan membahas objek penting lainnya yang sering kita akses dari Servlet - objek Session .

3. Objek HttpSession

The HttpSession adalah pilihan lain untuk menyimpan data-terkait pengguna di seluruh permintaan yang berbeda. Sesi adalah penyimpanan sisi server yang menyimpan data kontekstual.

Data tidak dibagikan antara objek sesi yang berbeda (klien dapat mengakses data dari sesinya saja). Ini juga berisi pasangan nilai kunci, tetapi dibandingkan dengan cookie, sesi dapat berisi objek sebagai nilai. Mekanisme implementasi penyimpanan bergantung pada server.

Sesi dicocokkan dengan klien oleh cookie atau parameter permintaan. Info lebih lanjut dapat ditemukan di sini.

3.1. Mendapatkan Sesi

Kita bisa mendapatkan HttpSession langsung dari permintaan:

HttpSession session = request.getSession(); 

Kode di atas akan membuat sesi baru jika tidak ada. Kita dapat mencapai hal yang sama dengan menelepon:

request.getSession(true)

Jika kita hanya ingin mendapatkan sesi yang ada dan tidak membuat yang baru, kita perlu menggunakan:

request.getSession(false) 

If we access the JSP page for the first time, then a new session gets created by default. We can disable this behavior by setting the session attribute to false:

In most cases, a web server uses cookies for session management. When a session object is created, then a server creates a cookie with JSESSIONID key and value which identifies a session.

3.2. Session Attributes

The session object provides a bunch of methods for accessing (create, read, modify, remove) attributes created for a given user session:

  • setAttribute(String, Object) which creates or replaces a session attribute with a key and a new value
  • getAttribute(String) which reads an attribute value with a given name (key)
  • removeAttribute(String) which removes an attribute with a given name

We can also easily check already existing session attributes by calling getAttributeNames().

As we already mentioned, we could retrieve a session object from a request. When we already have it, we can quickly perform methods mentioned above.

We can create an attribute:

HttpSession session = request.getSession(); session.setAttribute("attributeKey", "Sample Value"); 

The attribute value can be obtained by its key (name):

session.getAttribute("attributeKey"); 

We can remove an attribute when we don't need it anymore:

session.removeAttribute("attributeKey"); 

A well-known use case for a user session is to invalidate whole data it stores when a user logs out from our website. The session object provides a solution for it:

session.invalidate(); 

This method removes the whole session from the web server so we cannot access attributes from it anymore.

Objek HttpSession memiliki lebih banyak metode, tetapi metode yang kami sebutkan adalah yang paling umum.

4. Kesimpulan

Pada artikel ini, kami membahas dua mekanisme yang memungkinkan kami untuk menyimpan data pengguna antara permintaan berikutnya ke server - cookie dan sesi.

Perlu diingat bahwa protokol HTTP tidak memiliki kewarganegaraan, sehingga mempertahankan status di seluruh permintaan adalah suatu keharusan.

Seperti biasa, potongan kode tersedia di Github.