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. 拿到更精細(xì)的各部分
request.getScheme()
:協(xié)議(http
或https
)request.getServerName()
:主機(jī)名或 IPrequest.getServerPort()
:端口號request.getContextPath()
:應(yīng)用上下文路徑(部署時的app
名)request.getServletPath()
:Servlet 映射路徑request.getPathInfo()
:額外的路徑信息request.getQueryString()
:查詢串(不含?
)
如果你需要在反向代理(Nginx、F5)后還拿到原始請求的主機(jī)名和協(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-08Java并發(fā)編程示例(二):獲取和設(shè)置線程信息
這篇文章主要介紹了Java并發(fā)編程示例(二):獲取和設(shè)置線程信息,本文是系列文章的第二篇,本文著重講解Thread類的幾個重要屬性,需要的朋友可以參考下2014-12-12SpringCloud基本Rest微服務(wù)工程搭建過程
這篇文章主要介紹了SpringCloud基本Rest微服務(wù)工程搭建,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01Java并發(fā)編程示例(六):等待線程執(zhí)行終止
這篇文章主要介紹了Java并發(fā)編程示例(六):等待線程執(zhí)行終止,在本節(jié),示例程序演示等待初始化方法完成后,再去執(zhí)行其他任務(wù),需要的朋友可以參考下2014-12-12SpringBoot Redisson 集成的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot Redisson 集成的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05SpringBoot中干掉Whitelabel Error Page返回自定義內(nèi)容的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot中干掉Whitelabel Error Page返回自定義內(nèi)容的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01MyBatis動態(tài)SQL如何實(shí)現(xiàn)前端指定返回字段
這篇文章主要介紹了MyBatis動態(tài)SQL如何實(shí)現(xiàn)前端指定返回字段,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01