Spring MVC中如何通过WebRequest获取请求URL(类HttpServletRequest方式)
在Spring MVC中从WebRequest获取等效于HttpServletRequest.getRequestURL()的请求URL
嘿,这个场景我之前在项目里刚好碰到过,其实有两种实用的方式可以实现需求,下面给你详细拆解:
方法1:直接转换为HttpServletRequest调用原生方法
Spring MVC里的WebRequest在Servlet环境下的实现类是ServletWebRequest,它本身就包装了HttpServletRequest对象。我们可以直接把WebRequest转成对应的原生请求对象,然后调用熟悉的getRequestURL()方法:
// 假设你已经拿到了WebRequest实例 WebRequest webRequest = ...; // 方式A:强制类型转换(Servlet环境下完全安全) if (webRequest instanceof ServletWebRequest) { HttpServletRequest nativeRequest = ((ServletWebRequest) webRequest).getRequest(); String requestUrl = nativeRequest.getRequestURL().toString(); // 这里的requestUrl和原生getRequestURL()结果完全一致 } // 方式B:用getNativeRequest方法更优雅,避免强制转换的生硬感 HttpServletRequest nativeRequest = webRequest.getNativeRequest(HttpServletRequest.class); if (nativeRequest != null) { String requestUrl = nativeRequest.getRequestURL().toString(); }
这种方法的好处是完全复用原生API的逻辑,不用自己造轮子,结果最准确,也最省心。
方法2:手动拼接URL各部分(不依赖Servlet环境)
如果你不想强依赖Servlet环境,或者不确定WebRequest的具体实现,可以手动拼接出和getRequestURL()相同格式的URL。getRequestURL()的核心逻辑是拼接协议+服务器名称+非默认端口+请求URI,我们可以从WebRequest中分别获取这些部分:
WebRequest webRequest = ...; String scheme = webRequest.getScheme(); // 获取http/https协议 String serverName = webRequest.getServerName(); int serverPort = webRequest.getServerPort(); String requestUri = webRequest.getRequestURI(); StringBuilder urlBuilder = new StringBuilder(); urlBuilder.append(scheme).append("://").append(serverName); // 只有非默认端口才需要添加(http默认80,https默认443) if (!(("http".equals(scheme) && serverPort == 80) || ("https".equals(scheme) && serverPort == 443))) { urlBuilder.append(":").append(serverPort); } urlBuilder.append(requestUri); String requestUrl = urlBuilder.toString();
这个拼接逻辑和HttpServletRequest.getRequestURL()的底层实现完全对齐,得到的结果也会和原生方法一模一样。
内容的提问来源于stack exchange,提问作者Abhinav Mittal
相关产品推荐
相关产品推荐

