在Java开发中,获取请求的URL是一项常见的需求,无论是Web应用开发还是接口服务处理,准确获取请求URL都能帮助我们实现路由解析、参数传递、日志记录等功能,本文将从基础到进阶,详细讲解在Java中获取请求URL的多种方法,涵盖Servlet、Spring框架等不同场景,并附上代码示例和注意事项,帮助开发者全面掌握这一技能。

Servlet环境中获取请求URL的方法
在传统的Java Web应用中,Servlet是最基础的处理HTTP请求的组件,通过Servlet API提供的HttpServletRequest对象,我们可以轻松获取请求相关的各种信息,包括URL。HttpServletRequest是Servlet容器传递给Servlet服务的核心对象,封装了HTTP请求的全部内容。
获取请求的基本信息
HttpServletRequest提供了多个方法来获取URL的不同部分,开发者可以根据需求选择合适的方法,以下是常用的方法及其作用:
-
getRequestURI():获取请求的URI(统一资源标识符),即URL中除去协议、主机名和端口的部分,例如/app/user/info,URI不包含查询参数,是资源路径的精确表示。 -
getRequestURL():获取请求的URL(统一资源定位符),包含协议、主机名、端口和路径,但不包含查询参数,对于请求http://localhost:8080/app/user?id=123,getRequestURL()返回的是http://localhost:8080/app/user,该方法返回的是StringBuffer类型,方便进行字符串拼接操作。 -
getQueryString():获取请求中的查询字符串,即URL中问号(?)之后的部分,对于上述请求,getQueryString()返回的是id=123,如果请求中没有查询参数,该方法返回null。
代码示例
以下是一个简单的Servlet示例,演示如何使用上述方法获取URL信息:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class UrlServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取完整的请求URL(不包含查询参数)
StringBuffer requestURL = request.getRequestURL();
// 获取请求URI
String requestURI = request.getRequestURI();
// 获取查询参数
String queryString = request.getQueryString();
// 输出结果
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("<h3>请求URL信息:</h3>");
response.getWriter().println("完整URL(不含参数): " + requestURL.toString() + "<br>");
response.getWriter().println("请求URI: " + requestURI + "<br>");
response.getWriter().println("查询参数: " + (queryString != null ? queryString : "无") + "<br>");
}
}
注意事项
-
getRequestURL()返回的是StringBuffer,而不是String,这是为了方便开发者直接修改字符串内容,例如拼接路径或参数,如果只需要字符串,可以调用toString()方法。 -
当请求包含中文或特殊字符时,URL可能会经过编码(如UTF-8编码),如果需要获取解码后的参数值,可以使用
request.getParameter("参数名"),该方法会自动处理编码问题。
Spring框架中获取请求URL的方法
Spring框架是目前Java Web开发的主流选择,其提供了更简洁和灵活的方式来处理HTTP请求,在Spring中,无论是传统的Spring MVC还是Spring Boot,获取请求URL都非常方便。

使用HttpServletRequest对象
在Spring MVC中,我们仍然可以通过方法参数注入HttpServletRequest对象,然后调用Servlet API的方法获取URL,这种方式与传统Servlet开发类似,适合在Controller层直接操作请求对象。
示例代码:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class UrlController {
@GetMapping("/get-url")
public String getUrl(HttpServletRequest request) {
StringBuffer requestURL = request.getRequestURL();
String requestURI = request.getRequestURI();
String queryString = request.getQueryString();
return String.format("完整URL: %s<br>URI: %s<br>参数: %s",
requestURL, requestURI, queryString != null ? queryString : "无");
}
}
使用@RequestMapping注解的属性
Spring MVC的@RequestMapping注解(及其组合注解如@GetMapping、@PostMapping)提供了path或value属性来映射请求路径,但无法直接获取完整的URL,我们可以结合HttpServletRequest或通过其他方式获取。
使用Spring Boot的ServerWebExchange(WebFlux)
在Spring WebFlux(响应式编程模型)中,HttpServletRequest不可用,取而代之的是ServerWebExchange对象,通过ServerWebExchange的getRequest()方法可以获取ServerHttpRequest,进而获取URL信息。
示例代码:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@RestController
public class ReactiveUrlController {
@GetMapping("/reactive-url")
public Mono<String> getUrl(ServerWebExchange exchange) {
String url = exchange.getRequest().getURI().toString();
return Mono.just("完整URL: " + url);
}
}
使用AOP拦截请求获取URL
如果需要在多个方法中统一获取URL,可以通过Spring AOP(面向切面编程)实现,定义一个切面,拦截所有Controller方法,通过JoinPoint获取请求对象。
示例代码:
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
@Aspect
@Component
public class UrlAspect {
@Before("execution(* com.example.controller.*.*(..))")
public void beforeControllerMethod(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
HttpServletRequest request = null;
for (Object arg : args) {
if (arg instanceof HttpServletRequest) {
request = (HttpServletRequest) arg;
break;
}
}
if (request != null) {
String url = request.getRequestURL().toString();
System.out.println("请求URL: " + url + ",方法: " + joinPoint.getSignature().getName());
}
}
}
高级场景:获取包含上下文路径的完整URL
在实际开发中,Web应用通常部署在上下文路径(Context Path)下,例如/app。getRequestURL()返回的URL可能不包含上下文路径,需要手动拼接,上下文路径可以通过request.getContextPath()获取。
拼接完整URL的示例
String contextPath = request.getContextPath();
String baseUrl = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + contextPath;
String fullUrl = baseUrl + request.getRequestURI();
if (request.getQueryString() != null) {
fullUrl += "?" + request.getQueryString();
}
System.out.println("完整URL(含上下文路径): " + fullUrl);
Spring Boot中获取上下文路径
在Spring Boot中,可以通过application.properties或application.yml配置上下文路径,

server.servlet.context-path=/app
然后在代码中通过@Value注入或通过Environment对象获取:
@Value("${server.servlet.context-path}")
private String contextPath;
注意事项与最佳实践
-
编码问题:如果URL中包含非ASCII字符(如中文),建议使用
java.net.URLEncoder和java.net.URLDecoder进行编码和解码,避免乱码问题。 -
HTTPS与HTTP:通过
request.getScheme()可以获取请求协议(http或https),拼接URL时需注意协议的正确性。 -
性能考虑:频繁调用
getRequestURL()等方法可能会对性能产生轻微影响,建议在必要时才获取,避免不必要的对象创建。 -
安全性:获取的URL可能包含恶意参数,直接拼接到SQL语句或命令中可能导致安全漏洞(如XSS、SQL注入),需对参数进行过滤或转义。
获取请求URL是Java Web开发中的基础技能,根据不同的开发场景和技术栈,有多种实现方式,在传统Servlet中,直接使用HttpServletRequest的方法即可;在Spring框架中,可以通过注入HttpServletRequest或利用AOP、WebFlux等高级特性实现,开发者需要根据项目需求选择合适的方法,并注意编码、安全等问题,确保代码的健壮性和可维护性,通过本文的介绍,相信读者已经掌握了在Java中获取请求URL的核心技巧,能够灵活应对各种开发场景。


















