Information Passed to Servlets

Server Information

A servlet can get the name of the server and the port number for a particular request with getServerName and getServerPort, respectively. These methods are attributes of ServletRequest because the values can change for different requests if the server has more than one name (a technique called virtual hosting).

The getServerInfo() method of ServletContext provides general information about the server software.

   public void ShowServerInfo(HttpServletRequest req, PrintWriter out)
   {
	   ServletContext context = getServletContext();
	   out.println("\nServer Info:\n");
	   out.println("req.getServerName(): " + req.getServerName());
	   out.println("req.getServerPort(): " + req.getServerPort());
	   out.println("context.getServerInfo(): " +
				   context.getServerInfo());
	   out.println("context.getServletContextName(): " +
				   context.getServletContextName());
	   out.println("Servlet API: " + context.getMajorVersion() + "." +
				   context.getMinorVersion() );
   }

Client Information

A servlet can use getRemoteAddr() and getRemoteHost() to retrieve the IP address and hostname of the client machine, respectively.

   public void ShowClientInfo(HttpServletRequest req, PrintWriter out)
   {
	out.println("\nClient Info:\n");
	out.println("req.getRemoteHost(): " + req.getRemoteHost());
	out.println("req.getRemoteAttr(): " + req.getRemoteAddr());
	out.println("req.getProtocol(): " + req.getProtocol());
	out.println("req.getScheme(): " + req.getScheme());
	out.println("req.isSecure(): " + (req.isSecure()? "yes": "no") );

	out.println("req.getAuthType(): " + req.getAuthType());
	out.println("req.getRemoteUser(): " + req.getRemoteUser());
	out.println("req.getMethod(): " + req.getMethod());

	out.println("req.getRequestURI(): " + req.getRequestURI());
	out.println("req.getServletPath(): " + req.getServletPath());

	out.println("req.getContentType(): " + req.getContentType());
	out.println("req.getContentLength(): " + req.getContentLength());
	out.println("req.getCharacterEncoding(): " + req.getCharacterEncoding());
   }

The Request

Some of the information about the client, shown above, is obtained from the request headers.

Request Headers

HTTP requests and responses can have a number of associated HTTP headers. A servlet rarely needs to read the HTTP headers. Many of them are parsed and handled by the server itself. However, a servlet can access header values directly, if desired.

  public void ShowHeaderInfo(HttpServletRequest req, PrintWriter out)
  {
	Enumeration enum = req.getHeaderNames();
	if (!enum.hasMoreElements()) return;
	out.println("\nRequest Headers:");
	out.println();
	while (enum.hasMoreElements())
	{
		String name = (String) enum.nextElement();
		String value = req.getHeader(name);
		if (value != null) {
			out.println(name + ": " + value);
		}
	}
  }

Request Parameters

Each access to the servlet can have any number of request parameters associated with it. These parameters are typically name/value pairs.

An HTTP servlet gets its request parameters as part of its query string (for GET requests) or as encoded post data (for POST requests). A servlet used as a server-side include has its parameters supplied by <PARAM> tags.

  public void ShowParameterInfo(HttpServletRequest req, PrintWriter out)
  {
	out.println("\nQuery String:");
	out.println(req.getQueryString());
	out.println();

	Enumeration enum = req.getParameterNames();
	if (!enum.hasMoreElements()) return;
	out.println("Request Parameters:");
	while (enum.hasMoreElements()) {
		String name = (String) enum.nextElement();
		String values[] = req.getParameterValues(name);
		if (values != null) {
			for (int i = 0; i < values.length; i++) {
				out.println(name + " (" + i + "): " + values[i]);
			}
		}
	}
   }

Input Stream

Each request has an input stream associated with it, just as each response has an associated output stream.

A servlet can identify encoded parameter informatin by checking the content type of the input stream. If it is application/x-www-form-urlencoded, the data can be retrieved with getParameter().

A servlet may wish to call the getContentLength() method before calling getParameter(). A rogue client may send an absurdly large amount of data as part of a POST request, hoping to slow the server to a crawl, in a denial-of-service attack. A servlet can check the content length to verify that the length is reasonable.


Maintained by John Loomis, last updated 5 Jan 2001