Trang chủHướng dẫnQuản lý Session trong Java với HttpServlet, Cookies, và URL Rewriting
Java

Quản lý Session trong Java với HttpServlet, Cookies, và URL Rewriting

CyStack blog 12 phút để đọc
CyStack blog31/05/2025
Reading Time: 12 minutes

Session trong Java Servlet được quản lý qua nhiều cách khác nhau như Cookies, HttpSession API, URL Rewriting, v.v. Bài viết này sẽ giải thích về cơ chế hoạt động cũng như cách sử dụng các kỹ thuật đó để triển khai việc quản lý Session trong Java, kèm theo các ví dụ minh họa.

Session là gì?

Giao thức HTTP và các web server vốn dĩ có tính stateless (phi trạng thái). Nghĩa là đối với web server, mỗi request (truy vấn) đều là một request mới cần xử lý và chúng không thể xác định liệu request đó có đến từ client đã gửi request trước đó hay không. Tuy nhiên, trong một số ứng dụng web, chúng ta cần biết client là ai để xử lý request một cách tương ứng.

Ví dụ, một ứng dụng giỏ hàng cần biết ai đang gửi request thêm một mặt hàng và mặt hàng đó cần được thêm vào giỏ hàng nào, hoặc ai đang gửi request thanh toán để có thể tính tiền cho đúng client.

Session là trạng thái của một phiên làm việc giữa client và server, có thể bao gồm nhiều request và response (phản hồi) qua lại. Vì cả HTTP lẫn web server đều stateless, cách duy nhất để duy trì một session là khi một thông tin định danh duy nhất về session đó (session ID) được truyền qua lại giữa server và client trong mỗi request và response.

Có nhiều cách để cung cấp thông tin định danh duy nhất này trong request và response.

  1. Xác thực người dùng (User Authentication): Người dùng cung cấp thông tin xác thực từ trang đăng nhập, sau đó chúng ta có thể truyền thông tin xác thực này giữa server và client để duy trì session. Phương pháp này không hiệu quả lắm vì nó sẽ không hoạt động nếu người dùng đăng nhập từ nhiều trình duyệt khác nhau.
  2. Trường ẩn HTML (HTML Hidden Field): Ta có thể tạo một trường ẩn duy nhất trong HTML. Khi người dùng bắt đầu di chuyển giữa các trang, ta có thể đặt giá trị của trường này là duy nhất cho người dùng đó và theo dõi session. Phương pháp này không thể sử dụng với các liên kết (link) vì nó đòi hỏi form phải được submit mỗi khi request được gửi từ client đến server kèm theo trường ẩn. Ngoài ra, nó không an toàn lắm vì chúng ta có thể lấy giá trị trường ẩn từ mã nguồn HTML và sử dụng nó để hack session đó.
  3. Viết lại URL (URL Rewriting): Chúng ta có thể nối thêm một tham số định danh session vào mỗi request và response để theo dõi session. Cách này khá bất tiện vì chúng ta cần theo dõi tham số này trong mọi response và đảm bảo nó không xung đột với các tham số khác.
  4. Cookies: Đây là những mẩu thông tin nhỏ được web server gửi trong header của response và được lưu trữ trong cookies của trình duyệt. Khi client thực hiện các request tiếp theo, nó sẽ thêm cookie vào request header và chúng ta có thể tận dụng điều này để theo dõi session. Chúng ta có thể duy trì session bằng cookies, nhưng nếu client tắt cookies thì cách này sẽ không thể hoạt động được.
  5. Session Management API: API này được xây dựng dựa trên các phương pháp theo dõi session đã đề cập. Một số nhược điểm lớn của các phương pháp trên bao gồm:
    • Hầu hết trường hợp, chúng ta không chỉ muốn theo dõi session mà còn cần lưu trữ dữ liệu vào session để sử dụng cho các request trong tương lai. Việc tự triển khai tính năng này sẽ đòi hỏi nhiều công sức.
    • Các phương pháp trên đều không phải là giải pháp toàn diện. Mỗi cách có thể không hoạt động trong một số tình huống nhất định. Do đó, chúng ta cần một giải pháp có thể tận dụng những phương pháp theo dõi session này để quản lý session hiệu quả trong mọi trường hợp.

    Chính vì vậy, chúng ta cần đến Session Management API, và may mắn là Servlet của J2EE có cung cấp sẵn một API như thế để chúng ta sử dụng.

Quản lý Session trong Java với Cookies

Cookies được sử dụng rất nhiều trong các ứng dụng web để cá nhân hóa response dựa trên lựa chọn của người dùng hoặc để theo dõi session. Trước khi tìm hiểu sâu hơn về Session Management API của Servlet, chúng ta sẽ xem xét cách theo dõi session bằng cookies thông qua một ứng dụng web nhỏ.

Ta sẽ tạo một ứng dụng web động có tên ServletCookieExample với cấu trúc project như hình bên dưới.

Hình cấu trúc project ví dụ quản lý session trong Java

File mô tả triển khai (deployment descriptor) web.xml của ứng dụng web này như sau:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="<https://www.w3.org/2001/XMLSchema-instance>" xmlns="<https://java.sun.com/xml/ns/javaee>" xsi:schemaLocation="<https://java.sun.com/xml/ns/javaee> <https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd>" id="WebApp_ID" version="3.0">
  <display-name>ServletCookieExample</display-name>
  <welcome-file-list>
    <welcome-file>login.html</welcome-file>
  </welcome-file-list>
</web-app>

Trang chào mừng của ứng dụng là login.html. Ở đó chúng ta sẽ lấy thông tin xác thực từ người dùng.

<!DOCTYPE html>
<html>
<head>
<meta charset="US-ASCII">
<title>Login Page</title>
</head>
<body>

<form action="LoginServlet" method="post">

Username: <input type="text" name="user">
<br>
Password: <input type="password" name="pwd">
<br>
<input type="submit" value="Login">
</form>
</body>
</html>

Dưới đây là LoginServlet xử lý request đăng nhập.

package com.journaldev.servlet.session;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private final String userID = "Pankaj";
	private final String password = "journaldev";

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// get request parameters for userID and password
		String user = request.getParameter("user");
		String pwd = request.getParameter("pwd");
		
		if(userID.equals(user) && password.equals(pwd)){
			Cookie loginCookie = new Cookie("user",user);
			//setting cookie to expiry in 30 mins
			loginCookie.setMaxAge(30*60);
			response.addCookie(loginCookie);
			response.sendRedirect("LoginSuccess.jsp");
		}else{
			RequestDispatcher rd = getServletContext().getRequestDispatcher("/login.html");
			PrintWriter out= response.getWriter();
			out.println("<font color=red>Either user name or password is wrong.</font>");
			rd.include(request, response);
		}

	}

}

Chú ý đến cookie mà chúng ta đang đặt vào response rồi chuyển tiếp đến LoginSuccess.jsp. Nó sẽ được sử dụng ở đó để theo dõi session. Cũng lưu ý rằng thời gian timeout của cookie được đặt là 30 phút. Ta nên có một logic phức tạp để đặt giá trị cookie cho việc theo dõi session, để nó không xung đột với bất kỳ request nào khác.

<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<https://www.w3.org/TR/html4/loose.dtd>">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Login Success Page</title>
</head>
<body>
<%
String userName = null;
Cookie[] cookies = request.getCookies();
if(cookies !=null){
for(Cookie cookie : cookies){
	if(cookie.getName().equals("user")) userName = cookie.getValue();
}
}
if(userName == null) response.sendRedirect("login.html");
%>
<h3>Hi <%=userName %>, Login successful.</h3>
<br>
<form action="LogoutServlet" method="post">
<input type="submit" value="Logout" >
</form>
</body>
</html>

Lưu ý rằng nếu chúng ta cố gắng truy cập trực tiếp vào JSP, nó sẽ chuyển hướng chúng ta đến trang đăng nhập. Khi chúng ta nhấp vào nút Logout, cookie phải được xóa khỏi trình duyệt của client.

package com.journaldev.servlet.session;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class LogoutServlet
 */
@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	response.setContentType("text/html");
    	Cookie loginCookie = null;
    	Cookie[] cookies = request.getCookies();
    	if(cookies != null){
    	for(Cookie cookie : cookies){
    		if(cookie.getName().equals("user")){
    			loginCookie = cookie;
    			break;
    		}
    	}
    	}
    	if(loginCookie != null){
    		loginCookie.setMaxAge(0);
        	response.addCookie(loginCookie);
    	}
    	response.sendRedirect("login.html");
    }

}

Ví dụ này không có phương thức nào để xóa cookie, nhưng chúng ta có thể đặt tuổi thọ tối đa (maximum age) của nó thành 0 để nó bị xóa ngay lập tức khỏi trình duyệt client. Khi chạy ứng dụng trên, chúng ta nhận được response như các hình ảnh dưới đây.

Ví dụ quản lý session trong Java với Cookies

Ví dụ quản lý session trong Java với Cookies

Session trong Java Servlet với HttpSession

Servlet API cung cấp cơ chế quản lý Session thông qua interface HttpSession. Ta có thể lấy đối tượng session từ đối tượng HttpServletRequest bằng các phương thức sau đây.

HttpSession cho phép chúng ta lưu trữ các đối tượng dưới dạng attribute (thuộc tính), những attribute này có thể được truy xuất trong các request trong tương lai.

  1. HttpSession getSession(): Phương thức này luôn trả về một đối tượng HttpSession. Nó trả về đối tượng session gắn với request. Nếu request không có session nào gắn kèm, nó sẽ tạo một session mới và trả về session đó.
  2. HttpSession getSession(boolean flag): Phương thức này trả về đối tượng HttpSession nếu request có session. Nếu không thì nó trả về null.

Một số phương thức quan trọng của HttpSession bao gồm:

  1. String getId(): Trả về một chuỗi chứa định danh duy nhất được gán cho session này.
  2. Object getAttribute(String name): Trả về đối tượng được gắn với tên đã chỉ định trong session này, hoặc null nếu không có đối tượng nào được gắn với tên đó. Một số phương thức khác để làm việc với các attribute của Session bao gồm setAttribute(String name, Object value), removeAttribute(String name)getAttributeNames().
  3. long getCreationTime(): Trả về thời điểm session này được tạo, tính bằng mili giây (ms) kể từ nửa đêm ngày 1 tháng 1 năm 1970 GMT. Chúng ta có thể lấy thời gian truy cập lần cuối bằng phương thức getLastAccessedTime().
  4. setMaxInactiveInterval(int interval): Chỉ định khoảng thời gian (tính bằng giây) giữa các request của client trước khi servlet container sẽ vô hiệu hóa session này. Ta có thể lấy giá trị timeout của session bằng phương thức getMaxInactiveInterval().
  5. ServletContext getServletContext(): Trả về đối tượng ServletContext cho ứng dụng.
  6. boolean isNew(): Trả về true nếu client chưa biết về session hoặc nếu client chọn không tham gia vào session.
  7. void invalidate(): Vô hiệu hóa session này, sau đó gỡ bỏ mọi đối tượng đã được gắn với nó.

Khi chúng ta sử dụng phương thức HttpServletRequest.getSession() và nó cần tạo một session mới, phương thức này sẽ tạo đối tượng HttpSession mới, đồng thời thêm một cookie vào đối tượng response với tên là JSESSIONID và giá trị là session ID.

Cookie này được sử dụng để định danh đối tượng HttpSession trong các request tiếp theo từ client. Nếu cookies bị vô hiệu hóa ở phía client và chúng ta đang sử dụng URL rewriting, thì getSession() sẽ sử dụng giá trị jsessionid từ URL của request để tìm session tương ứng. JSESSIONID được dùng để theo dõi session, do đó chúng ta không nên sử dụng nó cho các mục đích riêng của ứng dụng để tránh các vấn đề liên quan đến session.

Chúng ta hãy xem một ví dụ về quản lý session bằng đối tượng HttpSession. Ta sẽ tạo một project web động trong Eclipse với servlet context là ServletHttpSessionExample.

Cấu trúc project sẽ trông như hình bên dưới:

Cấu trúc project ví dụ quản lý session trong Java với HttpSession

File login.html tương tự như ví dụ trước và được định nghĩa là trang chào mừng của ứng dụng trong web.xml. LoginServlet sẽ tạo session và thiết lập các attribute mà chúng ta có thể sử dụng ở các resource khác hoặc trong những request trong tương lai.

package com.journaldev.servlet.session;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private final String userID = "admin";
	private final String password = "password";

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// get request parameters for userID and password
		String user = request.getParameter("user");
		String pwd = request.getParameter("pwd");
		
		if(userID.equals(user) && password.equals(pwd)){
			HttpSession session = request.getSession();
			session.setAttribute("user", "Pankaj");
			//setting session to expiry in 30 mins
			session.setMaxInactiveInterval(30*60);
			Cookie userName = new Cookie("user", user);
			userName.setMaxAge(30*60);
			response.addCookie(userName);
			response.sendRedirect("LoginSuccess.jsp");
		}else{
			RequestDispatcher rd = getServletContext().getRequestDispatcher("/login.html");
			PrintWriter out= response.getWriter();
			out.println("<font color=red>Either user name or password is wrong.</font>");
			rd.include(request, response);
		}

	}

}

Code của file LoginSuccess.jsp như sau:

<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<https://www.w3.org/TR/html4/loose.dtd>">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Login Success Page</title>
</head>
<body>
<%
//allow access only if session exists
String user = null;
if(session.getAttribute("user") == null){
	response.sendRedirect("login.html");
}else user = (String) session.getAttribute("user");
String userName = null;
String sessionID = null;
Cookie[] cookies = request.getCookies();
if(cookies !=null){
for(Cookie cookie : cookies){
	if(cookie.getName().equals("user")) userName = cookie.getValue();
	if(cookie.getName().equals("JSESSIONID")) sessionID = cookie.getValue();
}
}
%>
<h3>Hi <%=userName %>, Login successful. Your Session ID=<%=sessionID %></h3>
<br>
User=<%=user %>
<br>
<a href="CheckoutPage.jsp">Checkout Page</a>
<form action="LogoutServlet" method="post">
<input type="submit" value="Logout" >
</form>
</body>
</html>

Khi một resource JSP được sử dụng, container sẽ tự động tạo một session cho nó. Vì vậy, ta không thể kiểm tra xem session có giá trị null hay không để chắc chắn rằng người dùng đã truy cập qua trang đăng nhập. Thay vào đó, chúng ta sử dụng một session attribute để xác thực request.

CheckoutPage.jsp là một trang khác và có nội dung như sau:

<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<https://www.w3.org/TR/html4/loose.dtd>">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Login Success Page</title>
</head>
<body>
<%
//allow access only if session exists
if(session.getAttribute("user") == null){
	response.sendRedirect("login.html");
}
String userName = null;
String sessionID = null;
Cookie[] cookies = request.getCookies();
if(cookies !=null){
for(Cookie cookie : cookies){
	if(cookie.getName().equals("user")) userName = cookie.getValue();
}
}
%>
<h3>Hi <%=userName %>, do the checkout.</h3>
<br>
<form action="LogoutServlet" method="post">
<input type="submit" value="Logout" >
</form>
</body>
</html>

Còn đây là code của LogoutServlet:

package com.journaldev.servlet.session;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class LogoutServlet
 */
@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	response.setContentType("text/html");
    	Cookie[] cookies = request.getCookies();
    	if(cookies != null){
    	for(Cookie cookie : cookies){
    		if(cookie.getName().equals("JSESSIONID")){
    			System.out.println("JSESSIONID="+cookie.getValue());
    			break;
    		}
    	}
    	}
    	//invalidate the session if exists
    	HttpSession session = request.getSession(false);
    	System.out.println("User="+session.getAttribute("user"));
    	if(session != null){
    		session.invalidate();
    	}
    	response.sendRedirect("login.html");
    }

}

Chú ý rằng ví dụ này có in giá trị của cookie JSESSIONID ra log. Bạn có thể kiểm tra file log của server, ở đó sẽ hiển thị giá trị này, trùng với Session ID hiển thị trên trang LoginSuccess.jsp.

Các hình dưới đây minh họa quá trình chạy ứng dụng web trên.

Ví dụ quản lý session trong Java Ví dụ quản lý session trong Java Ví dụ quản lý session trong Java

Quản lý Session trong Java Servlet với URL Rewriting

Như chúng ta đã thấy ở phần trước, ta có thể quản lý session bằng HttpSession. Tuy nhiên, nếu cookies trong trình duyệt bị vô hiệu hóa, cách này sẽ không hoạt động vì server không nhận được cookie JSESSIONID từ client.

Servlet API còn hỗ trợ URL rewriting, một kỹ thuật mà chúng ta có thể sử dụng để quản lý session trong trường hợp này. Ưu điểm lớn nhất của nó là xét về mặt coding, kỹ thuật này rất dễ sử dụng và chỉ bao gồm một bước: mã hóa URL.

Một điểm hay nữa của Servlet URL Encoding là nó có thể hoạt động như một cơ chế dự phòng, chỉ được kích hoạt khi cookies của trình duyệt bị tắt. Ta có thể mã hóa URL bằng phương thức encodeURL() của HttpServletResponse. Nếu cần redirect request sang một resource khác mà vẫn muốn truyền thông tin session, ta có thể dùng phương thức encodeRedirectURL().

Chúng ta sẽ tạo một project tương tự như trên, chỉ khác là sẽ sử dụng các phương thức URL rewriting để đảm bảo việc quản lý session vẫn hoạt động tốt ngay cả khi cookies trong trình duyệt bị vô hiệu hóa.

Cấu trúc project ServletSessionURLRewriting trong Eclipse như hình bên dưới.

Ví dụ quản lý session trong Java

package com.journaldev.servlet.session;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private final String userID = "admin";
	private final String password = "password";

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// get request parameters for userID and password
		String user = request.getParameter("user");
		String pwd = request.getParameter("pwd");
		
		if(userID.equals(user) && password.equals(pwd)){
			HttpSession session = request.getSession();
			session.setAttribute("user", "Pankaj");
			//setting session to expiry in 30 mins
			session.setMaxInactiveInterval(30*60);
			Cookie userName = new Cookie("user", user);
			response.addCookie(userName);
			//Get the encoded URL string
			String encodedURL = response.encodeRedirectURL("LoginSuccess.jsp");
			response.sendRedirect(encodedURL);
		}else{
			RequestDispatcher rd = getServletContext().getRequestDispatcher("/login.html");
			PrintWriter out= response.getWriter();
			out.println("<font color=red>Either user name or password is wrong.</font>");
			rd.include(request, response);
		}

	}

}
<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<https://www.w3.org/TR/html4/loose.dtd>">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Login Success Page</title>
</head>
<body>
<%
//allow access only if session exists
String user = null;
if(session.getAttribute("user") == null){
	response.sendRedirect("login.html");
}else user = (String) session.getAttribute("user");
String userName = null;
String sessionID = null;
Cookie[] cookies = request.getCookies();
if(cookies !=null){
for(Cookie cookie : cookies){
	if(cookie.getName().equals("user")) userName = cookie.getValue();
	if(cookie.getName().equals("JSESSIONID")) sessionID = cookie.getValue();
}
}else{
	sessionID = session.getId();
}
%>
<h3>Hi <%=userName %>, Login successful. Your Session ID=<%=sessionID %></h3>
<br>
User=<%=user %>
<br>
<!-- need to encode all the URLs where we want session information to be passed -->
<a href="<%=response.encodeURL("CheckoutPage.jsp") %>">Checkout Page</a>
<form action="<%=response.encodeURL("LogoutServlet") %>" method="post">
<input type="submit" value="Logout" >
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<https://www.w3.org/TR/html4/loose.dtd>">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Login Success Page</title>
</head>
<body>
<%
String userName = null;
//allow access only if session exists
if(session.getAttribute("user") == null){
	response.sendRedirect("login.html");
}else userName = (String) session.getAttribute("user");
String sessionID = null;
Cookie[] cookies = request.getCookies();
if(cookies !=null){
for(Cookie cookie : cookies){
	if(cookie.getName().equals("user")) userName = cookie.getValue();
}
}
%>
<h3>Hi <%=userName %>, do the checkout.</h3>
<br>
<form action="<%=response.encodeURL("LogoutServlet") %>" method="post">
<input type="submit" value="Logout" >
</form>
</body>
</html>
package com.journaldev.servlet.session;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class LogoutServlet
 */
@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	response.setContentType("text/html");
    	Cookie[] cookies = request.getCookies();
    	if(cookies != null){
    	for(Cookie cookie : cookies){
    		if(cookie.getName().equals("JSESSIONID")){
    			System.out.println("JSESSIONID="+cookie.getValue());
    		}
    		cookie.setMaxAge(0);
    		response.addCookie(cookie);
    	}
    	}
    	//invalidate the session if exists
    	HttpSession session = request.getSession(false);
    	System.out.println("User="+session.getAttribute("user"));
    	if(session != null){
    		session.invalidate();
    	}
    	//no encoding because we have invalidated the session
    	response.sendRedirect("login.html");
    }

}

Khi chạy project này với cookies bị vô hiệu hóa trong trình duyệt, trang web sẽ hiển thị như các hình ảnh dưới đây. Hãy chú ý đến jsessionid trong URL trên thanh địa chỉ của trình duyệt. Cũng cần lưu ý rằng trên trang LoginSuccess, tên người dùng sẽ có giá trị null vì trình duyệt không gửi cookie đã nhận từ response trước đó.

Ví dụ quản lý session trong Java Ví dụ quản lý session trong Java Ví dụ quản lý session trong Java

Nếu cookies không bị vô hiệu hóa, bạn sẽ không thấy jsessionid trong URL, bởi vì khi đó Servlet Session API sẽ sử dụng cookies.

Tổng kết

Trên đây là toàn bộ nội dung về cách quản lý session trong Java Servlet. Bạn có thể tìm đọc các bài viết của chúng tôi để tìm hiểu thêm về những chủ đề tương tự như Servlet Filters, Listeners và Cookies.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.