在Java开发中,获取地址栏地址(即浏览器URL)的需求通常出现在Web应用开发场景,尤其是需要动态获取当前请求路径、参数或进行页面跳转控制时,由于Java运行在服务器端,无法直接操作浏览器地址栏,但可以通过Servlet API、Spring框架等工具间接获取与当前请求相关的URL信息,以下将从基础到进阶,详细说明不同场景下获取地址栏地址的方法及注意事项。

Servlet API获取请求地址信息
在原生Java Web开发中,Servlet规范提供了HttpServletRequest接口,该接口是获取客户端请求信息的核心对象,通过request对象可以解析出地址栏URL的各个组成部分,包括协议、服务器地址、端口、请求路径、查询参数等。
获取基础URL信息
HttpServletRequest提供了多个方法用于获取不同维度的URL信息:
request.getRequestURL():获取请求的完整URL(不包括查询参数),访问http://localhost:8080/app/user?id=123时,该方法返回http://localhost:8080/app/user。request.getRequestURI():获取请求URI(项目路径+资源路径),例如上述URL返回/app/user。request.getContextPath():获取项目部署路径(上下文路径),例如返回/app。request.getQueryString():获取查询参数部分(不包括),例如返回id=123。
组合构建完整地址
实际开发中常需要动态拼接完整URL,例如生成跳转链接或API调用地址,可以通过以下方式组合:
String scheme = request.getScheme(); // 协议(http/https)
String serverName = request.getServerName(); // 服务器地址
int serverPort = request.getServerPort(); // 端口
String contextPath = request.getContextPath(); // 项目路径
String requestURI = request.getRequestURI(); // 请求路径
String queryString = request.getQueryString(); // 查询参数
StringBuilder fullUrl = new StringBuilder();
fullUrl.append(scheme).append("://").append(serverName);
if (("http".equals(scheme) && serverPort != 80) || ("https".equals(scheme) && serverPort != 443)) {
fullUrl.append(":").append(serverPort);
}
fullUrl.append(contextPath).append(requestURI);
if (queryString != null) {
fullUrl.append("?").append(queryString);
}
String completeUrl = fullUrl.toString();
注意事项
request.getRequestURL()返回的是StringBuffer类型,需调用toString()方法。- 查询参数需手动处理编码问题,可通过
request.getParameter("paramName")获取单个参数值,或使用request.getParameterMap()获取所有参数。 - 在HTTPS环境下,若代理服务器(如Nginx)做了转发,需通过
request.getHeader("X-Forwarded-Proto")获取真实协议类型。
Spring框架中的URL获取方式
Spring框架对Servlet API进行了封装,提供了更便捷的获取URL信息的途径,尤其在Spring MVC和Spring Boot中。
通过HttpServletRequest获取
在Spring MVC控制器中,可以直接通过方法参数注入HttpServletRequest对象,用法与原生Servlet一致:

@GetMapping("/user")
public String getUserInfo(HttpServletRequest request) {
String requestUrl = request.getRequestURL().toString();
String queryString = request.getQueryString();
// 处理逻辑
return "user";
}
使用UriComponentsBuilder构建URL
Spring提供了UriComponentsBuilder工具类,支持灵活构建和解析URL,避免手动拼接字符串:
import org.springframework.web.util.UriComponentsBuilder;
@GetMapping("/buildUrl")
public String buildUrl() {
String url = UriComponentsBuilder.newInstance()
.scheme("https")
.host("example.com")
.port(8080)
.path("/api/user")
.queryParam("id", 123)
.queryParam("name", "张三")
.build()
.toUriString();
return url; // 返回 "https://example.com:8080/api/user?id=123&name=张三"
}
Spring Boot中的获取方式
在Spring Boot中,除了上述方法,还可以通过ServerWebExchange(响应式编程)或@RequestAttribute注解获取URL信息:
@GetMapping("/reactive")
public String getReactiveUrl(ServerWebExchange exchange) {
String url = exchange.getRequest().getURI().toString();
return url;
}
获取当前请求的完整路径
在Spring MVC中,若需获取当前请求的完整路径(包括项目路径),可通过以下方式:
String currentUrl = request.getRequestURL().toString() +
(request.getQueryString() != null ? "?" + request.getQueryString() : "");
前端与后端协作获取地址栏信息
某些场景下,可能需要将浏览器地址栏信息传递给后端,此时可通过JavaScript获取URL并传递给后端接口:
前端获取URL
// 获取当前完整URL
let currentUrl = window.location.href;
// 获取路径部分
let path = window.location.pathname;
// 获取查询参数
let params = new URLSearchParams(window.location.search);
let id = params.get("id");
通过AJAX传递给后端
fetch("/api/saveUrl", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ url: currentUrl })
});
后端接收时可直接绑定对象:

@PostMapping("/api/saveUrl")
public void saveUrl(@RequestBody UrlRequest urlRequest) {
String url = urlRequest.getUrl();
// 处理URL
}
安全与编码处理
获取地址栏信息时,需注意安全与编码问题:
- XSS防护:若将URL内容直接输出到前端,需对特殊字符进行转义,防止XSS攻击,Spring提供了
HtmlUtils.htmlEscape()方法。 - URL编码:查询参数可能包含非ASCII字符,需使用
java.net.URLEncoder.encode()和URLDecoder.decode()处理编码。 - 参数校验:对URL中的参数进行合法性校验,避免SQL注入或路径遍历攻击。
Java获取地址栏地址的核心思路是通过服务器端对象解析HTTP请求信息,原生Servlet开发中依赖HttpServletRequest,Spring框架则提供了更便捷的工具类和注解支持,实际开发中需根据场景选择合适的方法,并注意编码与安全问题,无论是获取基础URL信息、动态构建链接,还是前后端协作传递URL,Java生态均提供了成熟的解决方案,开发者可灵活应用以满足业务需求。

















