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

