如何在JSF Web应用程序的情况下记住重定向的原始URL

时间:2011-06-07 15:14:14

标签: java jsf

我有一个JSF Web应用程序,我需要提供如下所述的功能:

  1. 为了评论用户必须登录的内容
  2. 如果他没有登录,则“点击此处登录”会将他带到登录页面
  3. 成功登录必须将他重定向到他导航到登录页面的网址
  4. 有什么办法可以实现吗?

2 个答案:

答案 0 :(得分:3)

根据问题,您显然没有使用领域的容器管理身份验证和<security-constraint>中的web.xml。它将为您完全透明地处理这个问题。

我假设您已经自己开发了filter,当会话中没有登录用户时,会将用户重定向到登录页面。在这种情况下,您还需要将当前请求URL添加为请求参数或会话属性。


这是一个将其作为过滤器中的请求参数传递的示例:

if (user == null) {
    String from = URLEncoder.encode(request.getRequestURI(), "UTF-8");
    if (request.getQueryString() != null) from += "?" + request.getQueryString();
    response.sendRedirect("login.jsf?from=" + from);
}

将其作为隐藏字段嵌入登录表单中(是的,使用纯HTML / JSTL,JSF 1.x在这里没用):

<input type="hidden" name="from" value="${fn:escapeXml(param.from)}" />

在登录方法中,检查它是否存在并相应处理:

public String login() {
    // ...

    String from = externalContext.getRequestParameterMap().get("from");

    if (from != null && !from.isEmpty()) {
        externalContext.redirect(from);
        return null;
    } else {
        return "home"; // Default landing page after login.
    }
}

这是一个将其作为过滤器中的会话属性传递的示例:

if (user == null) {
    String from = request.getRequestURI();
    if (request.getQueryString() != null) from += "?" + request.getQueryString();
    request.getSession().setAttribute("from", from);
    response.sendRedirect("login.jsf");
}

这不需要隐藏字段。在登录方法中,检查它是否存在并相应处理:

public String login() {
    // ...

    String from = externalContext.getSessionMap().get("from");

    if (from != null && !from.isEmpty()) {
        externalContext.getSessionMap().remove("from");
        externalContext.redirect(from);
        return null;
    } else {
        return "home"; // Default landing page after login.
    }
}

答案 1 :(得分:0)

JSF和URL不能很好地协同工作:JSF URL不可收藏,与您正在查看的页面相比,URL总是晚一页......所以在您的情况下,您不应该考虑URL但在视图(.xhtml)文件方面。

解决问题的一种方法是创建一个会话管理bean,它在您执行第2步时存储当前视图(以及相关的bean参数)。一旦用户登录,检查此会话bean是否存在,以及如果是这样,将用户重定向到存储的视图,而不是将他重定向到标准的登录后视图。这是通过在doSignIn方法中返回“viewName”来完成的。