4

我已经在菜单栏顶部构建了一个登录代码片段。如果用户通过导航进入任何页面并突然按下登录按钮,我希望看到该人经过身份验证,同时留在他最初来自的页面上。所以我在backing bean上使用了这个:

HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();

那么如果说 mypage.htm?a=2&b=2 用 request.getQueryString() 得到 a=2&b=2

但是 getQueryString 返回 null,我怎样才能完全从支持 bean 获得原始 URL?

4

3 回答 3

5

它返回null是因为命令按钮未提交到包含查询字符串的 URL。查看生成的 HTML 输出<h:form>。您会看到生成<form action>的 HTML 根本不包含查询字符串。

您需要自己将当前查询字符串作为登录链接/按钮中的请求参数传递。

获取当前请求 URI 和查询字符串并将其作为from参数添加到登录链接/按钮中(注意:使用普通链接/按钮,它不需要是命令链接/按钮):

<h:button value="login" outcome="/login">
    <f:param name="from" value="#{request.requestURI}#{empty request.queryString ? '' : '?'}#{request.queryString}" />
</h:button>

在登录页面中,将from参数设置为视图范围的 bean 属性:

<f:metadata>
    <f:viewParam name="from" value="#{login.from}" />
</f:metadata>

在登录操作方法中,重定向到它:

public void submit() throws IOException {
    User user = userService.find(username, password);

    if (user != null) {
        // ... Do your login thing.

        FacesContext.getCurrentInstance().getExternalContext().redirect(from);
    } else {
        // ... Do your "unknown login" thing.
    }
}
于 2013-08-22T11:55:39.930 回答
0

<h:commandButton>向服务器发送一个 POST 请求,更具体地说是发送到Faces Servlet,然后 JSF 生命周期开始。您可能知道,您无法在 POST 请求中访问查询字符串参数。

如果您想在访问页面时从表单发送 GET 请求或检索查询字符串参数,则必须使用映射每个预期的查询参数<f:viewParam>

<f:metadata>
    <f:viewParam id="a" name="a" value="#{bean.a}" />
    <f:viewParam id="b" name="b" value="#{bean.b}" />
</f:metadata>

更多信息:

于 2013-08-22T03:15:04.577 回答
0

您还可以通过将<h:form>包装更改<h:commandButton>全方位表单并将 includeRequestParams 设置为 true:来解决此问题<o:form includeRequestParams="true">请参阅 BalusC 对此问题的回复。

于 2015-02-10T16:00:47.707 回答