Cách làm chức năng ghi nhớ đăng nhập bằng cookie

Chào cả nhà,
1/ Cho em hỏi có cách nào chỉnh sửa được JsessionID không ? Em định làm chức năng ghi nhớ đăng nhập bằng cách: khi user login vào thì session sẽ tạo 1 JsessionID đã đăng nhập gửi xuống cookie, em định lưu lại đoạn JsessionID này vào cookie VD ["RememberMe","SHFJFURI47390DHFI403UDJAMFPW2483YDH"]
Những lần sau khi người dùng đăng nhập thì tự động ghi đè đoạn JsessionID này. Nhưng vấn đề em gặp phải là không tìm thấy hàm nào trong servlet cho phép overwrite JsessionID cả :disappointed:

2/Mọi người có cách nào ghi nhớ đăng nhập tối ưu hơn tư vấn em với.

Cảm ơn mọi người :heart::heart:

Nó sẽ kiểu như này:

  1. Sau khi user đăng nhập -> server check xem có check vào remember me không -> nếu có thì gửi xuống client 1 token
  2. Ở dưới client phải lưu token này lại. Lưu vào đâu để đóng trình duyệt nó vẫn còn ấy
  3. Khi user truy cập vào site thì gửi kèm token này lên server, kiểm tra xem đúng user không, đã hết hạn token chưa

Token ở trên mình nói có thể là session_id, để lưu vào ở bước 2 thì có thể sử dụng cookie, vì cookie sẽ được tự động gửi kèm theo mỗi request, nên tại bước 3 bạn k phải làm gì, tự động khi vào trang nó đã gửi rồi.

Như bạn thấy thì mình dùng những cái rất chung, nên bạn tự tìm hiểu áp dụng vào ngôn ngữ bạn đang dùng nhé. Ngoài ra nên google thêm về “how remember me work” để đọc sâu hơn về nó

5 Likes

Cảm ơn bạn, ở bước 3 user gửi JsessionID trong cookie lên để đối chiếu với sessionID trong server nhưng điều kiện session của user đó chưa time out. Còn nếu 1 tuần hay 1 tháng thì user gửi token lên thì server cũng không biết so sánh với cái gì cả. Token lưu ở đâu trên server để so sánh với token trong cookie ạ ?

bạn lưu đâu chẳng được, lưu vào file cũng đc; lưu file thì 1 dòng gồm token và thời hạn kết thúc
user gửi token => server nhận token => mở file lên tìm token, kiểm tra ngày kết thúc

Mình chỉ lấy ví dụ token là session id thôi còn bạn gửi gì về cho user chẳng được, miễn là nó unique với user và không bị decode ở phía client (bởi nếu bị giải mã dễ dàng ở trình duyệt thì sẽ dễ bị thay thế, user A có thể giả mạo token user B)

Bạn tìm hiểu về JWT, json-web-token để thêm ý tưởng. Token chẳng qua là cái thuật ngữ để gọi, dùng đúng thuật ngữ thì dễ đi google, còn bản chất nó là gì thì bạn lần ngược lại câu trả lời của mình ở trên, nó là 1 cái để định danh user, để server biết để phân biệt user, k có gì đặc biệt.
Nó chỉ thực sự đặc biệt khi đi sâu vào là làm sao giao tiếp được trên hệ thống nhiều db, bảo mật khi refresh token… cái này học dần sẽ biêt.

4 Likes

Cảm ơn bạn ạ, mình hiểu rồi, thế mình lưu token này vào database có được không ?

Được chứ cậu :smile:
Tuy nhiên, thường thì mọi người hay dùng Redis để lưu trữ thông tin về session này hơn là RDB thông thường, vì cậu thường cần tính năng invalidate token sau 1 khoảng thời gian, và issue token mới thường xuyên.
Nhưng với bài tập nho nhỏ, cậu hoàn toàn có thể sử dụng RDB như MySQL cho việc này. Tuy nhiên, việc implement sẽ hơi lòng vòng 1 chút (khi cậu không có tính năng TTL của Redis, cậu buộc phải implement token expiration logic, hay logic check xem token của cậu đã bị expired chưa), nhưng nó hoàn toàn khả thi.

6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?