You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HttpServletRequest.getRequestURL()无法获取实际调用URL的问题求助

获取URLRewrite重写后的原始请求URL

我之前也碰到过完全一样的问题!用Tuckey的URLRewriteFilter做地址重写后,想在Bean里拿到用户实际访问的原始URL,有几个很实用的办法,给你详细说说:

方法一:利用URLRewriteFilter内置的原始URI属性

Tuckey的URLRewriteFilter默认会把用户请求的原始URI存在request的org.tuckey.web.filters.urlrewrite.ORIGINAL_REQUEST_URI属性里,你可以直接在Bean里通过HttpServletRequest获取:

// 获取原始请求URI(比如"/abc")
String originalUri = (String) request.getAttribute("org.tuckey.web.filters.urlrewrite.ORIGINAL_REQUEST_URI");

// 如果需要拼接成完整的URL(包括域名)
String fullOriginalUrl = request.getScheme() + "://" + request.getServerName() + 
                         (request.getServerPort() != 80 && request.getServerPort() != 443 ? ":" + request.getServerPort() : "") + 
                         originalUri;

这个方法最省心,不用修改任何重写规则,直接用框架自带的属性就行。

方法二:使用Servlet转发的标准属性

因为URLRewrite本质是内部转发请求,Servlet容器会自动把原始请求的信息存在几个标准属性里,这些属性是Servlet规范定义的,不依赖具体的重写框架:

// 获取原始请求的URI和上下文路径
String originalRequestUri = (String) request.getAttribute("javax.servlet.forward.request_uri");
String originalContextPath = (String) request.getAttribute("javax.servlet.forward.context_path");

// 拼接成完整原始URL
String fullOriginalUrl = request.getScheme() + "://" + request.getServerName() + 
                         (request.getServerPort() != 80 && request.getServerPort() != 443 ? ":" + request.getServerPort() : "") + 
                         originalContextPath + originalRequestUri;

这个方法的通用性更强,哪怕以后换了其他重写框架也能生效。

方法三:在重写规则里主动传递原始URL参数

如果你想更直观,也可以在urlrewrite.xml的规则里把原始URL作为参数传递给目标JSP,比如修改你的规则:

<rule>
  <from>/abc</from>
  <!-- 用$request_uri变量把原始URI作为参数传递 -->
  <to>/test.jsp?originalUrl=$request_uri</to>
</rule>

然后在Bean里直接获取这个参数:

// 获取传递的原始URI参数
String originalUriParam = request.getParameter("originalUrl");

// 拼接成完整URL
String fullOriginalUrl = request.getScheme() + "://" + request.getServerName() + 
                         (request.getServerPort() != 80 && request.getServerPort() != 443 ? ":" + request.getServerPort() : "") + 
                         originalUriParam;

这个方法适合需要快速在JSP或Bean里拿到参数的场景,但要注意如果是外部请求的话参数可能被篡改,不过内部使用完全没问题。

我个人平时用第一种方法最多,毕竟是框架原生支持的,不用额外改配置,非常方便。

内容的提问来源于stack exchange,提问作者user9419705

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:33:18