Java HttpServletRequest get URL in browsers URL bar
If your current request is coming from an "inside the app-server" forward or include, the app-server is expected to preserve request information as request attributes. The specific attributes, and what they contain, depends on whether you're doing a forward or an include.
For <jsp:include>
, the original parent URL will be returned by request.getRequestURL()
, and information about the included page will be found in the following request attributes:
javax.servlet.include.request_uri
javax.servlet.include.context_path
javax.servlet.include.servlet_path
javax.servlet.include.path_info
javax.servlet.include.query_string
For <jsp:forward>
, the new URL will be returned by request.getRequestURL()
, and the original request's information will be found in the following request attributes:
javax.servlet.forward.request_uri
javax.servlet.forward.context_path
javax.servlet.forward.servlet_path
javax.servlet.forward.path_info
javax.servlet.forward.query_string
These are set out in section 8.3 and 8.4 of the Servlet 2.4 specification.
However, be aware that this information is only preserved for internally-dispatched requests. If you have a front-end web-server, or dispatch outside of the current container, these values will be null. In other words, you may have no way to find the original request URL.
Get current URL in Webapplication
If you want a javascript solution, you can use window.document.location object and its properties:
console.log(window.document.location.protocol);
http:
console.log(window.document.location.host);
stackoverflow.com
console.log(window.document.location.port);
console.log(window.document.location.href);
http://stackoverflow.com/questions/10845606/get-current-url-in-webapplication
console.log(window.document.location.pathname);
/questions/10845606/get-current-url-in-webapplication
You can understand other parameters reading this article at MDN.
Get full URL and query string in Servlet for both HTTP and HTTPS requests
By design, getRequestURL()
gives you the full URL, missing only the query string.
In HttpServletRequest
, you can get individual parts of the URI using the methods below:
// Example: http://myhost:8080/people?lastname=Fox&age=30
String uri = request.getScheme() + "://" + // "http" + "://
request.getServerName() + // "myhost"
":" + // ":"
request.getServerPort() + // "8080"
request.getRequestURI() + // "/people"
"?" + // "?"
request.getQueryString(); // "lastname=Fox&age=30"
.getScheme()
will give you"https"
if it was ahttps://domain
request..getServerName()
givesdomain
onhttp(s)://domain
..getServerPort()
will give you the port.
Use the snippet below:
String uri = request.getScheme() + "://" +
request.getServerName() +
("http".equals(request.getScheme()) && request.getServerPort() == 80 || "https".equals(request.getScheme()) && request.getServerPort() == 443 ? "" : ":" + request.getServerPort() ) +
request.getRequestURI() +
(request.getQueryString() != null ? "?" + request.getQueryString() : "");
This snippet above will get the full URI, hiding the port if the default one was used, and not adding the "?"
and the query string if the latter was not provided.
Proxied requests
Note, that if your request passes through a proxy, you need to look at the X-Forwarded-Proto
header since the scheme might be altered:
request.getHeader("X-Forwarded-Proto")
Also, a common header is X-Forwarded-For
, which show the original request IP instead of the proxys IP.
request.getHeader("X-Forwarded-For")
If you are responsible for the configuration of the proxy/load balancer yourself, you need to ensure that these headers are set upon forwarding.
getting a HttpServletRequest response address
There is an HTTP Header called "Referer" that contains the information from which page the request was triggered. For AJAX requests, this header normally contains the URL of the page in which the AJAX request was triggered. You can get this header using request.getHeader("Referer"), so you could try if that is what you need.
But it's up to the client to send that header, so you cannot be sure that it will always be there. And this approach may also lead to maintainability issues, e.g. if you move you web page to a different URL. So it may be the better design to parameterize your JavaScript and you servlet, i.e. the client adds a parameter to the URL that tells the servlet from which context the request is coming from or what the expected output format is.
Wicket: Get URL from browser
You need to query the underlying HTTPServletRequest:
public class DummyPage extends WebPage{
private String getRequestUrl(){
// this is a wicket-specific request interface
final Request request = getRequest();
if(request instanceof WebRequest){
final WebRequest wr = (WebRequest) request;
// but this is the real thing
final HttpServletRequest hsr = wr.getHttpServletRequest();
String reqUrl = hsr.getRequestURL().toString();
final String queryString = hsr.getQueryString();
if(queryString != null){
reqUrl += "?" + queryString;
}
return reqUrl;
}
return null;
}
}
Reference:
- (Wicket) Component.getRequest()
- (Wicket) Request
- (Wicket) WebRequest
- (Servlet API) HTTPServletRequest
Related Topics
Java 8 Stream with Batch Processing
JPA - Returning an Auto Generated Id After Persist()
How to Increase the Java Heap Size in Netbeans
In Java 8, Why Is the Default Capacity of Arraylist Now Zero
Java Code for Getting Current Time
How to Copy the Contents of One Arraylist into Another
Parsing a Fixed-Width Formatted File in Java
How to Configure Log4J with a Properties File
How to Implement a Fsm - Finite State MAChine in Java
How to Set Tls Version on Apache Httpclient
When to Use a Constructor and When to Use Getinstance() Method (Static Factory Methods)
What Is Xml Bom and How to Detect It
"Faceted Project Problem (Java Version Mismatch)" Error Message
Accessing Constructor of an Anonymous Class
How to Add a Timeout Value When Using Java's Runtime.Exec()