How do I manage sessions using HttpSession in Jakarta Servlets?

Managing sessions using HttpSession in Jakarta Servlets is a straightforward process. HttpSession is a part of the Jakarta Servlet API which provides a way to handle session management between a client and server during multiple requests.

Here’s a structured guide on using and managing sessions with HttpSession:


1. Introduction to HttpSession

  • The HttpSession interface is used to:
    • Store information about a user’s session (attributes such as user information, preferences, or data specific to each client).
    • Track users across multiple requests (via cookies or URL rewriting).

2. How to Create or Retrieve a Session

You can retrieve or create a session using the HttpServletRequest.getSession() method:

HttpSession session = request.getSession();
  • If a session already exists, this method returns the existing session.
  • If no session exists, it will create a new one.

If you want to retrieve the session but don’t want to create a new one if it does not exist, you can use:

HttpSession session = request.getSession(false); // Returns null if no session exists

3. Adding Attributes to the Session

You can store user-related or application-specific data in the session using the setAttribute method:

session.setAttribute("user", "JohnDoe");
session.setAttribute("cartItems", cartItemList);

4. Retrieving Attributes from the Session

Use the getAttribute method to retrieve values stored in the session:

String user = (String) session.getAttribute("user");
List<String> cartItems = (List<String>) session.getAttribute("cartItems");

Make sure to cast the returned object to the proper type.


5. Removing Attributes from the Session

Use the removeAttribute method to delete specific session attributes:

session.removeAttribute("user");

6. Invalidating or Destroying the Session

When the session is no longer needed (e.g., a user logs out), you can invalidate the session using:

session.invalidate();

This method:

  1. Invalidates the current session and removes all the stored attributes.
  2. Creates a new session on the next request.getSession() call.

7. Setting Session Timeout

You can specify the session timeout (in minutes) using:

session.setMaxInactiveInterval(30 * 60); // 30 minutes

To retrieve the current session timeout:

int timeout = session.getMaxInactiveInterval();

If the user is inactive for longer than the timeout duration, the session will be invalidated automatically.


8. Session ID

Each HttpSession has a unique session ID. You can retrieve it using:

String sessionId = session.getId();

This ID is used to track the session between requests (usually via cookies or URL rewriting).


9. Checking Session Validity

You can verify whether a session is new using:

boolean isNew = session.isNew();

This is particularly useful when you want to check if the session was newly created or reused.


10. Session Tracking Mechanisms

The server manages session tracking using one of the following mechanisms:

  1. Cookies: This is the default method where the session ID is maintained using a cookie (e.g., JSESSIONID).
  2. URL Rewriting: This is a fallback mechanism when cookies are disabled. The session ID is appended to the URL as a query parameter.

For enabling URL rewriting, you can use:

String encodedURL = response.encodeURL("yourUrlHere");

This ensures the session ID is included in the URL if cookies are not supported.


11. Example Code: Using HttpSession

Here’s a full working example:

package org.kodejava.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/sessionExample")
public class SessionExampleServlet extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
    // Retrieve session, create if none exists
    HttpSession session = request.getSession();

    // Set session attributes
    session.setAttribute("username", "JohnDoe");

    // Get session attributes
    String username = (String) session.getAttribute("username");

    // Display session info
    response.setContentType("text/html");
    response.getWriter().println("<h1>Welcome, " + username + "</h1>");

    // Show session ID
    response.getWriter().println("<p>Session ID: " + session.getId() + "</p>");
  }

  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
    // Invalidate session on logout
    HttpSession session = request.getSession(false);
    if (session != null) {
      session.invalidate();
    }
    response.getWriter().write("Logged out successfully!");
  }
}

12. Best Practices for HttpSession

  • Minimize Data Storage: Store only necessary, lightweight data in the session to reduce memory overhead.
  • Secure Session Handling:
    • Ensure cookies are marked as HttpOnly and Secure.
    • Implement proper session timeout.
    • Use HTTPS to protect the session ID during transmission.
  • Invalidate Sessions on Logout: Always invalidate the session to clear sensitive data when users log out.

By following these steps, you can effectively manage user sessions using HttpSession in your Jakarta Servlets-based application.

Maven dependencies

<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>6.1.0</version>
    <scope>provided</scope>
</dependency>

Maven Central

How do I know session last access time?

package org.kodejava.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

@WebServlet(name = "SessionLastAccessTime", urlPatterns = "/last-access-time")
public class SessionLastAccessTime extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        HttpSession session = request.getSession();
        Date date = new Date(session.getLastAccessedTime());

        PrintWriter writer = response.getWriter();
        writer.println("Last accessed time: " + date);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
}

This servlet will return a result like:

Last accessed time: Mon Sep 27 06:43:03 CST 2021

Maven dependencies

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>

Maven Central

How do I get a notification when session attribute was changed?

Implementing the HttpSessionAttributeListener will make the servlet container inform you about session attribute changes. The notification is in a form of HttpSessionBindingEvent object. The getName() on this object tell the name of the attribute while the getValue() method tell about the value that was added, replaced or removed.

package org.kodejava.servlet;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

@WebListener
public class SessionAttributeListener implements HttpSessionAttributeListener {

    @Override
    public void attributeAdded(HttpSessionBindingEvent event) {
        // This method is called when an attribute is added to a session.
        // The line below display session attribute name and its value.
        System.out.println("Session attribute added: ["
                + event.getName() + "] = [" + event.getValue() + "]");
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent event) {
        // This method is called when an attribute is removed from a session.
        System.out.println("Session attribute removed: ["
                + event.getName() + "] = [" + event.getValue() + "]");
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent event) {
        // This method is invoked when an attribute is replaced in a session.
        System.out.println("Session attribute replaced: ["
                + event.getName() + "] = [" + event.getValue() + "]");
    }
}

Maven dependencies

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>

Maven Central

How do I capture session creation and removal events?

The Servlet specification define an HttpSessionListener interface that can be implemented if we want to listen to session creation and removal events. The interface has two methods that we can implement, the sessionCreated(HttpSessionEvent event) and sessionDestroyed(HttpSessionEvent event) methods. To activate the listener we need to register it in the servlet container. To register the listener we can use the @WebListener annotation. Let’s see the full code snippet below.

package org.kodejava.servlet;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.Date;

@WebListener
public class MySessionListener implements HttpSessionListener {

    // Notification that a new session was created
    @Override
    public void sessionCreated(HttpSessionEvent event) {
        HttpSession session = event.getSession();

        System.out.println("New session created  : " + session.getId());
        System.out.println("Session creation time: " + new Date(session.getCreationTime()));
    }

    // Notification that a session was invalidated
    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        HttpSession session = event.getSession();

        System.out.println("Session destroyed  : " + session.getId());
    }
}

Maven dependencies

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>

Maven Central

How do I invalidate user’s session?

In a web application you might want to invalidate user session, for instance in a logout Servlet or JSP. There is an invalidate() method in the HttpSession interface, this method invalidates the session, and it removes all attributes from the session object.

package org.kodejava.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet(name = "InvalidateSessionServlet", urlPatterns = "/invalidate-session")
public class InvalidateSessionServlet extends HttpServlet {

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

        HttpSession session = request.getSession();

        // Invalidate the session and removes any attribute related to it
        session.invalidate();

        // Get an HttpSession related to this request, if no session exist don't
        // create a new one. This is just a check to see after invalidation the
        // session will be null.
        session = request.getSession(false);

        response.getWriter().println("Session : " + session);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
}

Maven dependencies

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>

Maven Central