HTTP is fundamentally a stateless protocol, meaning each client request is treated independently without built-in memory of previous interactions. To maintain client state across multiple HTTP requests, Java Servlets provide several session tracking mechanisms—one of the simplest and most widespread being Cookies. A cookie is a small piece of text data sent by a server to a web browser, stored locally on the client machine, and returned with subsequent requests.
Key Concepts & Lifecycle
javax.servlet.http.Cookie: The core Java class used to create, inspect, and configure cookies.
Name-Value Pair: Cookies are stored as key-value string pairs (e.g., Cookie cookie = new Cookie("user", "Ram")).
Adding Cookies to Response: The servlet adds the cookie to the HTTP response header using response.addCookie(cookie).
Reading Cookies from Request: On subsequent visits, the servlet reads incoming cookies from the HTTP request header using request.getCookies(), which returns an array of Cookie[] objects.
Max Age & Expiration: Control persistence using cookie.setMaxAge(seconds). Setting a positive value makes it a persistent cookie, while negative or zero values control session-only or deletion behavior.
Step-by-Step Implementation Flow
Instantiate the Cookie: Create a new Cookie instance specifying the key and value strings.
Configure Cookie Properties: Set optional attributes such as setMaxAge(), setPath(), or setDomain().
Send Cookie to Client: Call response.addCookie(cookie) before writing response content.
Retrieve Cookies in Another Servlet: Call request.getCookies() to get the array of cookies and iterate through them to locate your target cookie by cookie.getName() and retrieve its data via cookie.getValue().
Benefits of Cookie-Based Session Tracking
Client-Side Storage: Minimizes server-side memory overhead since state information is preserved on the user's browser.
Simple Implementation: Straightforward API built directly into the standard Java Servlet specification without external dependencies.
Customizable Lifespan: Easy to configure whether data lasts only for the browser session or persists across browser restarts.
Recommended Next Videos
Continue your deep dive into Java Servlets and session management with these related tutorials from our channel:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet
{
private static final long serialVersionUID =1L;
public void init() throws ServletException
{
System.out.println("-----------------------------------------");
System.out.println(" Init method is called in "+this.getClass().getName());
System.out.println("--------------------------------------");
}
public void doGet( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String userName = request.getParameter("userName");
out.print("Welcome "+ userName);
Cookie cookie =new Cookie("userName", userName);// creating cookie object
response.addCookie(cookie);// adding cookie in the response// creating submit button
out.print("<form action='servlet2'>");
out.print("<input type='submit' value='go'>");
out.print("</form>");
out.close();
}
public void destroy()
{
System.out.println("-----------------------------------------");
System.out.println(" destroy method is called in "+this.getClass().getName());
System.out.println("-----------------------------------------");
}
}
SecondServlet.java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SecondServlet extends HttpServlet
{
private static final long serialVersionUID =1L;
public void init() throws ServletException
{
System.out.println("--------------------------------------------");
System.out.println(" Init method is called in "+this.getClass().getName());
System.out.println("---------------------------------------------");
}
public void doGet( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
Cookie cookiesArray[] = request.getCookies();
for( Cookie cookie : cookiesArray )
{
out.print("Hello "+ cookie.getValue());
}
out.close();
}
public void destroy()
{
System.out.println("--------------------------------------------");
System.out.println(" destroy method is called in "+this.getClass().getName());
System.out.println("--------------------------------------------");
}
}
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?><web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
metadata-complete="true"version="3.0"><display-name>CookieDemo</display-name><description>
This is a simple web application with a source code organization
based on the recommendations of the Application Developer's Guide.
</description><servlet><servlet-name>s1</servlet-name><servlet-class>FirstServlet</servlet-class></servlet><servlet-mapping><servlet-name>s1</servlet-name><url-pattern>/servlet1</url-pattern></servlet-mapping><servlet><servlet-name>s2</servlet-name><servlet-class>SecondServlet</servlet-class></servlet><servlet-mapping><servlet-name>s2</servlet-name><url-pattern>/servlet2</url-pattern></servlet-mapping></web-app>
Whenever a client (such as your web browser) sends a request to a web server or a Java Servlet, the server evaluates the request and sends back an HTTP response.
The first line of that response includes a 3-digit HTTP Status Code along with a reason phrase. This status code immediately tells the client whether the request succeeded, failed, needs redirection, or encountered an error on either the client or server side.
The 5 Standard Categories of HTTP Status Codes
All HTTP status codes are grouped into five distinct ranges based on the first digit:
1xx (Informational): The request was received and the server is continuing the process (e.g., 100 Continue).
2xx (Success): The action requested by the client was successfully received, understood, and accepted (e.g., 200 OK, 201 Created).
3xx (Redirection): Further action needs to be taken by the client to fulfill the request (e.g., 301 Moved Permanently, 302 Found).
4xx (Client Error): The request contains bad syntax or cannot be fulfilled by the server (e.g., 400 Bad Request, 404 Not Found).
5xx (Server Error): The server failed to fulfill an apparently valid request due to an internal issue (e.g., 500 Internal Server Error, 503 Service Unavailable).
Setting Status Codes in Java Servlets
In Java Servlets, you can inspect and set status codes dynamically using the HttpServletResponse interface:
// Setting a standard success status
response.setStatus(HttpServletResponse.SC_OK);
// Sending an error status with a message
response.sendError(HttpServletResponse.SC_NOT_FOUND, "Resource not found!");
Constants defined in HttpServletResponse make your Java code clean, self-descriptive, and compliant with standard HTTP specifications.
In Java web applications built using the Servlet API, passing data between web components (such as from a Controller Servlet to a JSP view) is a fundamental task. Unlike parameters which are read-only strings sent from client forms or query URLs, request attributes allow servlets to store rich Java objects in the request scope. The lifecycle of these attributes is tied directly to the lifetime of a single HTTP request lifecycle, making request scope the ideal choice for forwarding data securely and efficiently.
Core ServletRequest Attribute Methods
The HttpServletRequest interface provides dedicated methods to manipulate attributes stored in the request scope:
setAttribute(String name, Object obj): Binds an object to a specified attribute name within this request. If an attribute of the same name already exists, the old value is replaced.
getAttribute(String name): Retrieves the attribute as an Object. You can cast this back to its original class type (e.g., String, List, POJO). Returns null if no attribute exists with the given name.
removeAttribute(String name): Removes the specified attribute from the request scope entirely.
getAttributeNames(): Returns an Enumeration<String> containing all attribute names currently accessible in this request.
Step-by-Step Implementation Flow
Setting the Attribute: In the source servlet, store processed business data or objects using request.setAttribute("user", "Ram").
Forwarding the Request: Forward the request and response to a target JSP or servlet using RequestDispatcher.forward(request, response) so the request scope remains intact.
Retrieving the Attribute: In the target destination, fetch the stored object using request.getAttribute("user") and cast it appropriately.
Removing the Attribute: If the data is no longer needed or must be cleared during request processing, call request.removeAttribute("user").
Why Use Request Attributes?
Object Preservation: Store complex Java objects (like domain models, collections, or custom DTOs) without converting them into plain text strings.
Short, Memory-Safe Lifespan: Attributes are automatically garbage collected once the HTTP response completes, preventing memory leaks unlike long-lived session data.
Clean MVC Architecture: Enables servlets to act purely as controllers that fetch and prepare model data before dispatching rendering tasks to view components.
Recommended Next Videos
Deepen your understanding of Java Servlet scopes and listeners with these related tutorials from our channel:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet
{
private static final long serialVersionUID =1L;
public void init() throws ServletException
{
System.out.println("-----------------------------------------");
System.out.println(" Init method is called in "+this.getClass().getName());
System.out.println("--------------------------------------");
}
public void doGet( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
request.setAttribute("CompanyName", "Wipro");
request.setAttribute("Location", "India");
System.out.println("Firstservlet will forward the request to SecondServlet soon");
try
{
Thread.sleep(10000);
}
catch( InterruptedException e )
{
// TODO Auto-generated catch block
e.printStackTrace();
}
RequestDispatcher requestDispatcher = request
.getRequestDispatcher("/servlet2");
requestDispatcher.forward(request, response);
out.close();
}
public void destroy()
{
System.out.println("-----------------------------------------");
System.out.println(" destroy method is called in "+this.getClass().getName());
System.out.println("-----------------------------------------");
}
}
SecondServlet.java
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SecondServlet extends HttpServlet
{
private static final long serialVersionUID =1L;
public void init() throws ServletException
{
System.out.println("--------------------------------------------");
System.out.println(" Init method is called in "+this.getClass().getName());
System.out.println("---------------------------------------------");
}
public void doGet( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String CompanyName = (String) request.getAttribute("CompanyName");
out.print("CompanyName : "+ CompanyName +"<br>");
out.print("*************************************************************"+"<br>");
Enumeration<String> namesEnum = request.getAttributeNames();
while( namesEnum.hasMoreElements() )
{
String name = (String) namesEnum.nextElement();
out.print(name +":");
Object value = request.getAttribute(name);
out.print(value);
out.print("<br>");
}
out.close();
}
public void destroy()
{
System.out.println("--------------------------------------------");
System.out.println(" destroy method is called in "+this.getClass().getName());
System.out.println("--------------------------------------------");
}
}
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?><web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"metadata-complete="true"version="3.0"><display-name>ServletRequestAttributeDemo</display-name><description>
This is a simple web application with a source code organization
based on the recommendations of the Application Developer's Guide.
</description><servlet><servlet-name>s1</servlet-name><servlet-class>FirstServlet</servlet-class></servlet><servlet-mapping><servlet-name>s1</servlet-name><url-pattern>/servlet1</url-pattern></servlet-mapping><servlet><servlet-name>s2</servlet-name><servlet-class>SecondServlet</servlet-class></servlet><servlet-mapping><servlet-name>s2</servlet-name><url-pattern>/servlet2</url-pattern></servlet-mapping></web-app>