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
相关产品推荐
相关产品推荐

