Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions web-modules/jakarta-servlets/Storing_Java_Objects/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>session-demo</artifactId>
<version>1.0</version>
<packaging>war</packaging>

<dependencies>
<!-- Servlet API -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>

<!-- SLF4J + Logback for logging -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.11</version>
</dependency>

<!-- JUnit 5 for writing tests -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.0</version>
<scope>test</scope>
</dependency>

<!-- Mockito for mocking servlet objects -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.5.0</version>
<scope>test</scope>
</dependency>

</dependencies>

<build>
<finalName>session-demo</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>21</source>
<target>21</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.example;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.WebServlet;
import java.io.*;

@WebServlet("/remove-session")
public class RemoveSessionServlet extends HttpServlet {

private static final Logger logger = LoggerFactory.getLogger(RemoveSessionServlet.class);

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

// Get the existing session without creating a new one
HttpSession session = request.getSession(false);

if (session != null) {
String sessionId = session.getId();

// Remove only a specific attribute
session.removeAttribute("loggedInUser");
logger.info("User attribute removed from session ID: {}", sessionId);

// Invalidate the entire session (e.g., on logout)
session.invalidate();
logger.info("Session '{}' has been invalidated.", sessionId);

} else {
logger.warn("No active session found to remove.");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.example;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.WebServlet;
import java.io.*;

@WebServlet("/retrieve-session")
public class RetrieveSessionServlet extends HttpServlet {

private static final Logger logger = LoggerFactory.getLogger(RetrieveSessionServlet.class);

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

// Get the existing session without creating a new one
HttpSession session = request.getSession(false);

if (session != null) {
// Retrieve the User object from the session
User user = (User) session.getAttribute("loggedInUser");

if (user != null) {
logger.info("Retrieved user: {}, Email: {}",
user.getUsername(), user.getEmail());
} else {
logger.warn("No user found in session.");
}
} else {
logger.warn("No active session found.");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.example;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.WebServlet;
import java.io.*;

@WebServlet("/store-session")
public class StoreSessionServlet extends HttpServlet {

private static final Logger logger = LoggerFactory.getLogger(StoreSessionServlet.class);

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

// Create a User object
User user = new User("john_doe", "john@example.com");

// Get or create the session
HttpSession session = request.getSession();

// Store the User object in the session
session.setAttribute("loggedInUser", user);

logger.info("User '{}' stored in session with ID: {}",
user.getUsername(), session.getId());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example;

import java.io.Serializable;

public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
private String email;

public User(String username, String email) {
this.username = username;
this.email = email;
}

public String getUsername() { return username; }
public String getEmail() { return email; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0">
</web-app>
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.example;

import jakarta.servlet.http.*;
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;

public class RemoveSessionServletTest {

@Test
void testUserRemovedFromSession() throws Exception {

HttpServletRequest request = mock(HttpServletRequest.class);
HttpServletResponse response = mock(HttpServletResponse.class);
HttpSession session = mock(HttpSession.class);

when(request.getSession(false)).thenReturn(session);
when(session.getId()).thenReturn("TEST-SESSION-ID");

// Run the servlet
RemoveSessionServlet servlet = new RemoveSessionServlet();
servlet.doPost(request, response);

// Verify removeAttribute and invalidate were both called
verify(session).removeAttribute("loggedInUser");
verify(session).invalidate();
}

@Test
void testNoSessionToRemove() throws Exception {

HttpServletRequest request = mock(HttpServletRequest.class);
HttpServletResponse response = mock(HttpServletResponse.class);

// Simulate no active session
when(request.getSession(false)).thenReturn(null);

// Run the servlet — should handle null gracefully
RemoveSessionServlet servlet = new RemoveSessionServlet();
servlet.doPost(request, response);

// No exception should be thrown
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.example;

import jakarta.servlet.http.*;
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;

public class RetrieveSessionServletTest {

@Test
void testUserRetrievedFromSession() throws Exception {

HttpServletRequest request = mock(HttpServletRequest.class);
HttpServletResponse response = mock(HttpServletResponse.class);
HttpSession session = mock(HttpSession.class);
User mockUser = new User("john_doe", "john@example.com");

// Return our mock session and user
when(request.getSession(false)).thenReturn(session);
when(session.getAttribute("loggedInUser")).thenReturn(mockUser);

// Run the servlet
RetrieveSessionServlet servlet = new RetrieveSessionServlet();
servlet.doGet(request, response);

// Verify getAttribute was called with the correct key
verify(session).getAttribute("loggedInUser");
}

@Test
void testNoSessionFound() throws Exception {

HttpServletRequest request = mock(HttpServletRequest.class);
HttpServletResponse response = mock(HttpServletResponse.class);

// Simulate no active session
when(request.getSession(false)).thenReturn(null);

// Run the servlet — should handle null gracefully
RetrieveSessionServlet servlet = new RetrieveSessionServlet();
servlet.doGet(request, response);

// No exception should be thrown
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.example;

import jakarta.servlet.http.*;
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;

public class StoreSessionServletTest {

@Test
void testUserStoredInSession() throws Exception {

// Mock the request, response, and session
HttpServletRequest request = mock(HttpServletRequest.class);
HttpServletResponse response = mock(HttpServletResponse.class);
HttpSession session = mock(HttpSession.class);

// When getSession() is called, return our mock session
when(request.getSession()).thenReturn(session);

// Run the servlet
StoreSessionServlet servlet = new StoreSessionServlet();
servlet.doPost(request, response);

// Verify setAttribute was called with a User object
verify(session).setAttribute(eq("loggedInUser"), any(User.class));
}
}