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

Spring MVC中控制器与JSP标签的request.getRequestURI()结果差异及解决

问题解析:Spring MVC中RequestURI在控制器与自定义标签的差异及解决方案

差异原因

核心在于服务器端包含的请求路径重写机制:

  • 控制器处理的是客户端发起的原始HTTP请求,request.getRequestURI()返回的是浏览器地址栏里的原始路径/passwordReset。
  • 当执行<jsp:include>时,属于服务器内部的资源包含操作,容器会临时将当前请求的URI替换为被包含操作所在的JSP文件的物理路径(也就是/WEB-INF/views/passwordReset.jsp),因为此时容器正在处理该JSP的渲染流程,而非原始请求的入口阶段。

自定义标签中获取原始URI的方法

方法1:控制器提前存入请求属性

在控制器处理请求时,把原始URI存入请求域:

// 控制器方法内
request.setAttribute("originalRequestURI", request.getRequestURI());

然后在自定义标签的doTag()方法中读取:

@Override
public void doTag() throws JspException, IOException {
    PageContext pageContext = (PageContext) getJspContext();
    String originalUri = (String) pageContext.getAttribute("originalRequestURI", PageContext.REQUEST_SCOPE);
    // 使用originalUri做后续处理
}

方法2:读取Servlet规范内置的原始请求属性

Servlet容器在处理服务器端包含/转发时,会自动将原始请求URI存入javax.servlet.forward.request_uri属性,直接读取即可:

@Override
public void doTag() throws JspException, IOException {
    PageContext pageContext = (PageContext) getJspContext();
    String originalUri = (String) pageContext.getAttribute("javax.servlet.forward.request_uri", PageContext.REQUEST_SCOPE);
    // 若属性不存在(比如非转发/包含场景),可以降级用当前URI
    if (originalUri == null) {
        originalUri = ((HttpServletRequest) pageContext.getRequest()).getRequestURI();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:42:34