Java獲取請求url地址的幾種常見方法
1. 在 Servlet 中獲取
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class UrlDemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
// 獲取到類似 "http://example.com:8080/app/path/to/servlet"
StringBuffer url = request.getRequestURL();
// 如果還想要問號后面的查詢串,比如 "?a=1&b=2"
String queryString = request.getQueryString(); // 可能為 null
String fullUrl = (queryString == null)
? url.toString()
: url.append('?').append(queryString).toString();
response.getWriter().write("Full URL: " + fullUrl);
}
}request.getRequestURL()返回StringBuffer,包含協(xié)議、服務(wù)器名、端口、上下文路徑和 servlet 路徑。request.getQueryString()返回 URL 中?后的那部分(不含?本身),如果沒有查詢參數(shù)則為null。
2. 在 Spring MVC 控制器中獲取
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UrlDemoController {
@GetMapping("/demo")
@ResponseBody
public String demo(HttpServletRequest request) {
StringBuffer url = request.getRequestURL();
String qs = request.getQueryString();
return (qs == null) ? url.toString() : url.append('?').append(qs).toString();
}
}Spring 會自動把 HttpServletRequest 注入到方法參數(shù)里,使用方式與 Servlet 一樣。
3. 在過濾器(Filter)里獲取
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class UrlLoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
StringBuffer url = request.getRequestURL();
String qs = request.getQueryString();
String fullUrl = (qs == null) ? url.toString() : url.append('?').append(qs).toString();
System.out.println("Incoming request URL: " + fullUrl);
chain.doFilter(req, res);
}
}過濾器常用于打印日志、鑒權(quán)、統(tǒng)一處理。
4. 拿到更精細的各部分
request.getScheme():協(xié)議(http或https)request.getServerName():主機名或 IPrequest.getServerPort():端口號request.getContextPath():應(yīng)用上下文路徑(部署時的app名)request.getServletPath():Servlet 映射路徑request.getPathInfo():額外的路徑信息request.getQueryString():查詢串(不含?)
如果你需要在反向代理(Nginx、F5)后還拿到原始請求的主機名和協(xié)議,就要結(jié)合 X-Forwarded-Proto / X-Forwarded-Host 等頭部來重組:
String proto = request.getHeader("X-Forwarded-Proto");
if (proto == null) proto = request.getScheme();
String host = request.getHeader("X-Forwarded-Host");
if (host == null) host = request.getServerName();
String port = request.getHeader("X-Forwarded-Port");
if (port == null) port = String.valueOf(request.getServerPort());
String fullUrl = proto + "://" + host + (port.isEmpty() ? "" : ":" + port)
+ request.getRequestURI()
+ (qs == null ? "" : "?" + qs);5. 客戶端(HTTP 客戶端庫)獲取請求 URL
如果你是在客戶端代碼中(比如用 Apache HttpClient、OkHttp)想拿到自己發(fā)出的請求 URL:
- Apache HttpClient
HttpGet get = new HttpGet("https://api.example.com/data?x=1");
System.out.println(get.getURI()); // 輸出 URI 對象- OkHttp
Request req = new Request.Builder()
.url("https://api.example.com/data?x=1")
.build();
System.out.println(req.url()); // okio.HttpUrl 對象以上就是在各種常見場景下“Java:獲取請求 URL 地址”的做法,按需選用即可。
到此這篇關(guān)于Java獲取請求url地址的幾種常見方法的文章就介紹到這了,更多相關(guān)Java獲取請求url地址內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
logback輸出日志屏蔽quartz的debug等級日志方式
這篇文章主要介紹了logback輸出日志屏蔽quartz的debug等級日志方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Java并發(fā)編程示例(二):獲取和設(shè)置線程信息
這篇文章主要介紹了Java并發(fā)編程示例(二):獲取和設(shè)置線程信息,本文是系列文章的第二篇,本文著重講解Thread類的幾個重要屬性,需要的朋友可以參考下2014-12-12
SpringCloud基本Rest微服務(wù)工程搭建過程
這篇文章主要介紹了SpringCloud基本Rest微服務(wù)工程搭建,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
Java并發(fā)編程示例(六):等待線程執(zhí)行終止
這篇文章主要介紹了Java并發(fā)編程示例(六):等待線程執(zhí)行終止,在本節(jié),示例程序演示等待初始化方法完成后,再去執(zhí)行其他任務(wù),需要的朋友可以參考下2014-12-12
SpringBoot Redisson 集成的實現(xiàn)示例
本文主要介紹了SpringBoot Redisson 集成的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
SpringBoot中干掉Whitelabel Error Page返回自定義內(nèi)容的實現(xiàn)
這篇文章主要介紹了SpringBoot中干掉Whitelabel Error Page返回自定義內(nèi)容的實現(xiàn)方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
MyBatis動態(tài)SQL如何實現(xiàn)前端指定返回字段
這篇文章主要介紹了MyBatis動態(tài)SQL如何實現(xiàn)前端指定返回字段,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01

