In the code example below we will extract information regarding the HTTP (Hypertext Transport Protocol) from the request object (HttpServletRequest
). We will extract the protocol used (http / https), server name and its assigned port number. We will also read our application context path, servlet path, path info and the query string. If we combine all the previously mentioned information we will get something equals to the value returned by request.getRequestURL()
method.
Let’s check the code snippet below to see what method of the HttpServletRequest
class that we can call to get the information regarding the HTTP request object that we can collect.
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 java.io.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = "/url-info")
public class ServletUrlInformation extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Getting servlet request URL
String url = request.getRequestURL().toString();
// Getting servlet request query string.
String queryString = request.getQueryString();
// Getting request information without the hostname.
String uri = request.getRequestURI();
// Below we extract information about the request object path
// information.
String scheme = request.getScheme();
String serverName = request.getServerName();
int portNumber = request.getServerPort();
String contextPath = request.getContextPath();
String servletPath = request.getServletPath();
String pathInfo = request.getPathInfo();
String query = request.getQueryString();
response.setContentType("text/html");
PrintWriter pw = response.getWriter();
pw.print("Url: " + url + "<br/>");
pw.print("Uri: " + uri + "<br/>");
pw.print("Scheme: " + scheme + "<br/>");
pw.print("Server Name: " + serverName + "<br/>");
pw.print("Port: " + portNumber + "<br/>");
pw.print("Context Path: " + contextPath + "<br/>");
pw.print("Servlet Path: " + servletPath + "<br/>");
pw.print("Path Info: " + pathInfo + "<br/>");
pw.print("Query: " + query);
}
}
When you access this servlet using the following url http://localhost:8080/url-info?x=1&y=1, you’ll get the following output in your browser:
Url: http://localhost:8080/url-info
Uri: /url-info
Scheme: http
Server Name: localhost
Port: 8080
Context Path:
Servlet Path: /url-info
Path Info: null
Query: x=1&y=1
Maven dependencies
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
- How do I get number of each day for a certain month in Java? - September 8, 2024
- How do I get operating system process information using ProcessHandle? - July 22, 2024
- How do I sum a BigDecimal property of a list of objects using Java Stream API? - July 22, 2024
This works fine only if the requests don’t pass through a load balancer. In that case, server name and server port will refer to the load balancer and not to the localhost.
Hi Stefano,
For this case you might want to check the value of the following http request header:
X-Forwarded-For
Proxy-Client-IP
WL-Proxy-Client-IP
HTTP_CLIENT_IP
HTTP_X_FORWARDED_FOR
REMOTE_ADDR
I have a page that have local layout
taglibs
. When I process request which hastaglib
url I expect to retrieve master url, I see that it’s stored inrequest.requestDispatcherPath
, but I haven’t found a way how to retrieve that. Maybe you could help with that?Thank you for the example.
BTW,
String queryString = request.getQueryString();
is not needed because is followed by almost the same string with query variable.