Mengendalikan Kuki dan Sesi di Servlet Java

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan membahas pengendalian kuki dan sesi di Java, menggunakan Servlets .

Selain itu, kami akan segera menerangkan apa itu kuki, dan meneroka beberapa contoh contoh penggunaannya.

2. Asas Kuki

Ringkasnya, kuki adalah sekeping kecil data yang tersimpan di sisi pelanggan yang digunakan pelayan ketika berkomunikasi dengan pelanggan .

Mereka digunakan untuk mengenal pasti pelanggan ketika mengirim permintaan berikutnya. Mereka juga dapat digunakan untuk mengirimkan beberapa data dari satu servlet ke servlet lain.

Untuk maklumat lebih lanjut, sila rujuk artikel ini.

2.1. Buat Kuki

The Cookie kelas ditakrifkan dalam javax.servlet.http pakej.

Untuk menghantarnya kepada pelanggan, kami perlu membuatnya dan menambahkannya pada respons :

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

Walau bagaimanapun, APInya jauh lebih luas - mari kita menerokainya.

2.2. Tetapkan Tarikh Luput Cookie

Kita boleh menetapkan usia maksimum (dengan kaedah maxAge (int) ) yang menentukan berapa saat cookie yang diberikan harus sah untuk:

uiColorCookie.setMaxAge(60*60); 

Kami menetapkan usia maksimum hingga satu jam. Setelah waktu ini, kuki tidak dapat digunakan oleh klien (penyemak imbas) ketika mengirim permintaan dan juga harus dikeluarkan dari cache penyemak imbas.

2.3. Tetapkan Domain Cookie

Kaedah lain yang berguna dalam Cookie API adalah setDomain (String) .

Ini membolehkan kami menentukan nama domain yang harus dihantar oleh klien. Itu juga bergantung pada apakah kita menentukan nama domain secara eksplisit atau tidak.

Mari tetapkan domain untuk kuki:

uiColorCookie.setDomain("example.com");

Kuki akan dihantar ke setiap permintaan yang dibuat oleh example.com dan subdomainnya.

Sekiranya kita tidak menentukan domain secara eksplisit, domain akan ditetapkan ke nama domain yang membuat kuki .

Sebagai contoh, jika kita membuat kuki dari example.com dan membiarkan nama domain kosong, maka itu akan dihantar ke www.example.com (tanpa subdomain).

Bersama dengan nama domain, kami juga dapat menentukan jalan. Mari kita lihat seterusnya.

2.4. Tetapkan Laluan Cookie

Laluan menentukan di mana kuki akan dihantar.

Sekiranya kita menentukan jalan secara eksplisit, maka Kuki akan dihantar ke URL yang diberikan dan semua subdirektorinya:

uiColorCookie.setPath("/welcomeUser");

Secara tersirat, ia akan ditetapkan ke URL yang membuat kuki dan semua subdirektorinya.

Sekarang mari kita fokus pada bagaimana kita dapat mengambil nilai-nilai mereka di dalam Servlet .

2.5. Baca Kuki di Servlet

Kuki ditambahkan pada permintaan oleh pelanggan. Pelanggan memeriksa parameternya dan memutuskan apakah ia dapat menyampaikannya ke URL semasa.

Kita boleh mendapatkan semua kuki dengan memanggil getCookies () atas permintaan ( HttpServletRequest ) yang dihantar ke Servlet .

Kita boleh melakukan lelaran melalui tatasusunan ini dan mencari yang kita perlukan, 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. Keluarkan Kuki

Untuk membuang kuki dari penyemak imbas, kita harus menambahkan yang baru pada respons dengan nama yang sama, tetapi dengan nilai maxAge ditetapkan ke 0 :

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

Contoh kes penggunaan untuk membuang kuki adalah tindakan log keluar pengguna - kita mungkin perlu membuang beberapa data yang disimpan untuk sesi pengguna aktif.

Sekarang kita tahu bagaimana kita boleh mengendalikan kuki di dalam Servlet .

Seterusnya, kita akan membahas objek penting lain yang sering kita akses dari Servlet - objek Session .

3. Objek HttpSession

The HttpSession adalah satu lagi pilihan untuk menyimpan data pengguna berkaitan di seluruh permintaan yang berbeza. Sesi adalah storan sisi pelayan yang menyimpan data kontekstual.

Data tidak dikongsi antara objek sesi yang berbeza (klien dapat mengakses data dari sesinya sahaja). Ini juga mengandungi pasangan nilai-kunci, tetapi dibandingkan dengan kuki, sesi dapat berisi objek sebagai nilai. Mekanisme pelaksanaan penyimpanan bergantung kepada pelayan.

Sesi dipadankan dengan pelanggan dengan parameter kuki atau permintaan. Maklumat lanjut boleh didapati di sini.

3.1. Mendapat Sesi

Kami dapat memperoleh HttpSession terus dari permintaan:

HttpSession session = request.getSession(); 

Kod di atas akan membuat sesi baru sekiranya tidak ada. Kita boleh mencapainya dengan memanggil:

request.getSession(true)

Sekiranya 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 mempunyai lebih banyak kaedah, tetapi yang kami sebutkan adalah yang paling biasa.

4. Kesimpulan

Dalam artikel ini, kami membahas dua mekanisme yang membolehkan kami menyimpan data pengguna antara permintaan berikutnya ke pelayan - kuki dan sesi.

Perlu diingat bahawa protokol HTTP tidak bernegara, dan menjaga keadaan di seluruh permintaan adalah suatu keharusan.

Seperti biasa, coretan kod boleh didapati di Github.