使用 PrettyFaces 获取原始请求 URI

Posted

技术标签:

【中文标题】使用 PrettyFaces 获取原始请求 URI【英文标题】:Getting the original request URI with PrettyFaces 【发布时间】:2011-12-06 00:51:15 【问题描述】:

我在我的 JSF 应用程序中使用 PrettyFaces。该站点需要身份验证才能访问某些页面,因此我使用了一个侦听器(预渲染视图)来检查用户是否已登录。因此,如果用户尝试访问 /foo(PrettyFaces 之前的 /foo.jsf),我会重定向登录。

但是,我想将它们重定向到初始目的地,因此我想附加一个请求参数“next”,以便将用户重定向到 /login?next=/foo。不幸的是,我无法从请求对象中获取原始 requestURI,以下代码中的 uri 字符串是 /appname/foo.jsf 而不是 /appname/foo

ctx = FacesContext.getCurrentInstance().getExternalContext();
HttpServletRequest request = (HttpServletRequest) ctx.getRequest();
String uri = request.getRequestURI();

有没有办法检索原始 URI 路径?

【问题讨论】:

【参考方案1】:

PrettyFaces 在幕后使用 RequestDispatcher#forward() 将漂亮的 URL 转发到真实的 URL。使用此技术,原始请求 URI 可用作带有键 RequestDispatcher#FORWARD_REQUEST_URI 的请求属性。

所以,应该这样做:

String originalURI = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI);
// ...

【讨论】:

非常感谢!它确实存储在 requestMap 中,但是键名略有不同,并以字符串形式给出。以下工作。 String originalURI = (String) ctx.getRequestMap().get("javax.servlet.forward.request_uri"); 嗯,这与RequestDispatcher#FORWARD_REQUEST_URI 的值相同。另请参阅 javadoc:download.oracle.com/javaee/6/api/… sysout 值时究竟得到了什么?或者它只是没有编译? (该常量是在 Servlet 2.5 中引入的)。 是的,它没有编译,抱怨缺少字段。奇怪,我以为我已经在使用 Servlet 2.5(在依赖项中有它),但也许其他一些旧版本被覆盖了。 也许您在/WEB-INF/lib 中放置了一个有问题的servlet-api.jar 文件?一些初学者会这样做。另见***.com/questions/4076601/… 感谢 BalusC,我认为我的问题有点不同,可能涉及更多,所以我将它作为一个单独的问题发布:***.com/questions/7741986/…【参考方案2】:

使用此代码获取原始请求 URL:

PrettyContext.getCurrentInstance().getRequestUrl().toURL()

【讨论】:

在当前的漂亮面孔中,代码是这个 PrettyContext.getCurrentInstance().getRequestURL().toURL() 将这个答案与上面的 BalusC 进行比较,有一个很小但很重要的区别。这给出了没有上下文路径的 URL,但是如果禁用了 cookie,则使用 requestMap 中的转发请求 uri 也包含 contextPath 和 jsessionid。所以在选择解决方案时要小心。 即使没有任何漂亮的效果,此解决方案也会提供 URL。基于 forward_request_uri 的解决方案结果为 NULL。

以上是关于使用 PrettyFaces 获取原始请求 URI的主要内容,如果未能解决你的问题,请参考以下文章

使用来自 ajax 请求的原始图像数据获取数据 URI

nginx基础学习第二篇:nginx内置变量的使用

JSF 和 PrettyFaces - 如何限制直接 xhtml 请求

Android - 如何从原始文件中获取 Uri?

JSF PrettyFaces 导致过滤器链“中断”

Android:给定原始图像的Uri,获取SD卡上图像的缩略图