|
Accessing the Standard CGI
Variables |
Note: Chapter 5 of Core Servlets and JavaServer Pages
contains much more detailed and up to date information on this topic. The full
text is now available online
in PDF for free access.
If you come to
Java servlets from traditional CGI, you are probably used to the idea of "CGI
Variables". These are a somewhat eclectic collection of information about the
request. Some are derived from the HTTP request line and headers (e.g. the part
of the URI that came after the question mark and typically contains the form
data, or the Content-Length header), some are derived from the
socket itself (e.g. the name and IP address of the requesting host), and some
are derived from server installation parameters (e.g. the mapping of URLs to
actual paths).
Although it probably makes more sense to think of different
sources of data (request data, server data, etc.) as distinct, experienced CGI
programmers may find the following table useful. Assume that
request is the HttpServletRequest supplied to the
doGet and doPost methods.
CGI Variable
| Meaning
| Accessing it from doGet or doPost
|
AUTH_TYPE
| If an Authorization header was supplied, this is the
scheme specified (basic or digest )
| request.getAuthType()
|
CONTENT_LENGTH
| For POST requests only, the number of bytes of data sent.
| Technically, the equivalent is
String.valueOf(request.getContentLength()) (a
String ) but you'll probably want to just call
request.getContentLength() , which returns an
int .
|
CONTENT_TYPE
| MIME type of attached data, if specified.
| request.getContentType()
|
DOCUMENT_ROOT
| Path to directory corresponding to http://host/
| getServletContext().getRealPath("/") Note that this was
request.getRealPath("/") in older servlet specifications.
|
HTTP_XXX_YYY
| Access to arbitrary HTTP headers
| request.getHeader("Xxx-Yyy")
|
PATH_INFO
| Path information attached to the URL. Since servlets, unlike standard
CGI programs, can talk to the server, they don't need to treat this
separately. Path info could be sent as part of the regular form data.
| request.getPathInfo()
|
PATH_TRANSLATED
| The path information mapped to a real path on the server. Again, with
servlets there is no need to have a special case for this.
| request.getPathTranslated()
|
QUERY_STRING
| For GET requests, this is the attached data as one big
string, with values still URL-encoded. You rarely want the raw data in
servlets; instead use request.getParameter to access
individual parameters.
| request.getQueryString()
|
REMOTE_ADDR
| The IP address of the client that made the request, as a String. E.g.
"192.9.48.9" .
| request.getRemoteAddr()
|
REMOTE_HOST
| The fully qualified domain name (e.g. "java.sun.com" ) of
the client that made the request. The IP address is returned if this
cannot be determined.
| request.getRemoteHost()
|
REMOTE_USER
| If an Authorization header was supplied, the user part.
| request.getRemoteUser()
|
REQUEST_METHOD
| The request type, which is usually GET or
POST , but is occasionally HEAD ,
PUT , DELETE , OPTIONS , or
TRACE .
| request.getMethod()
|
SCRIPT_NAME
| Path to servlet.
| request.getServletPath()
|
SERVER_NAME
| Web server's name
| request.getServerName()
|
SERVER_PORT
| Port server is listening on.
| Technically, the equivalent is
String.valueOf(request.getServerPort()) , which returns a
String . You'll usually just want
request.getServerPort() , which returns an int .
|
SERVER_PROTOCOL
| Name and version used in the request line (e.g. HTTP/1.0
or HTTP/1.1 ).
| request.getProtocol()
|
SERVER_SOFTWARE
| Identifying information about the Web server
| getServletContext().getServerInfo() |
Here's a
servlet that creates a table showing the values of all the CGI variables other
than HTTP_XXX_YYY , which are just the HTTP request headers shown in
the previous section.
3.1 ShowCGIVariables.java
Note: also uses ServletUtilities.java,
shown earlier. package hall;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
/** Creates a table showing the values of all the CGI variables.
*
* Part of tutorial on servlets and JSP that appears at
* http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/
* 1999 Marty Hall; may be freely used or adapted.
*/
public class ShowCGIVariables extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String[][] variables =
{ { "AUTH_TYPE", request.getAuthType() },
{ "CONTENT_LENGTH", String.valueOf(request.getContentLength()) },
{ "CONTENT_TYPE", request.getContentType() },
{ "DOCUMENT_ROOT", getServletContext().getRealPath("/") },
{ "PATH_INFO", request.getPathInfo() },
{ "PATH_TRANSLATED", request.getPathTranslated() },
{ "QUERY_STRING", request.getQueryString() },
{ "REMOTE_ADDR", request.getRemoteAddr() },
{ "REMOTE_HOST", request.getRemoteHost() },
{ "REMOTE_USER", request.getRemoteUser() },
{ "REQUEST_METHOD", request.getMethod() },
{ "SCRIPT_NAME", request.getServletPath() },
{ "SERVER_NAME", request.getServerName() },
{ "SERVER_PORT", String.valueOf(request.getServerPort()) },
{ "SERVER_PROTOCOL", request.getProtocol() },
{ "SERVER_SOFTWARE", getServletContext().getServerInfo() }
};
String title = "Servlet Example: Showing CGI Variables";
out.println(ServletUtilities.headWithTitle(title) +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=CENTER>" + title + "</H1>\n" +
"<TABLE BORDER=1 ALIGN=CENTER>\n" +
"<TR BGCOLOR=\"#FFAD00\">\n" +
"<TH>CGI Variable Name<TH>Value");
for(int i=0; i<variables.length; i++) {
String varName = variables[i][0];
String varValue = variables[i][1];
if (varValue == null)
varValue = "<I>Not specified</I>";
out.println("<TR><TD>" + varName + "<TD>" + varValue);
}
out.println("</TABLE></BODY></HTML>");
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
3.2 ShowCGIVariables Output
|