【问题标题】:JSF redirect doesn't stop page renderingJSF 重定向不会停止页面呈现
【发布时间】:2013-02-06 21:08:14
【问题描述】:

我们以一种非常简单的方式使用 JSF。我们所做的只是实现包含一些 Java 代码的标签。

我已经实现了一个“安全”标签,只要用户没有登录,它就会将 302 重定向发送回登录页面:

// make them log in
ctx.getExternalContext().redirect("login.xhtml");
ctx.responseComplete();

问题在于redirect() 方法不会停止页面的其余部分的呈现。页面下方的标签正在执行。这是一个问题,因为如果未登录的用户让浏览器忽略重定向,他们可能会看到他们不应该看到的东西。

如何让 responseComplete() 完成我认为应该做的事情?

【问题讨论】:

标签: jsf


【解决方案1】:

在 servlet 过滤器中实现与登录相关的逻辑总是更好,如下所示:

  1. 为您要保护的 URL 模式实施过滤器
  2. 在过滤器中,检查用户是否已登录(可能只检查用户会话中是否存在用户名/用户 ID)
  3. 如果用户未登录,则将用户重定向到基于 HTML 的登录页面。
  4. 如果用户已登录,则让用户访问资源。

有很多方法(可能比这更好)来实现这一点,但这是最基本的。

【讨论】:

  • 是的,最好利用 JSF 提供的 faces-config.xml
  • 这是我们最初的做法。问题是某些路径不应该受到保护,例如 /login.xhtml 和 /images/*。维护列表是丑陋的。使用这种方案,我可以将一个标签放在所有安全页面共有的标题中。
  • 您只能使用显示受保护内容的(动态)页面来保护您的(动态)页面。保护静态资源,如图像、css、JS 可能会被跳过。在过滤器中,您添加一个绕过登录页面的条件。
【解决方案2】:

也许您可以使用标志来验证用户是否已登录。
然后,您可以在不想呈现的标签中使用render=#{managedBean.logged} 属性。
这只是一种解决方法...对于您提供的大量信息并不能提供太多帮助。

【讨论】:

    【解决方案3】:

    试试吧!

    ctx.getExternalContext().dispatch("login.xhtml");
    ctx.responseComplete();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-14
      • 2021-01-08
      • 1970-01-01
      • 2019-03-09
      • 2018-01-09
      • 2013-09-04
      • 2012-02-10
      • 2021-03-04
      相关资源
      最近更新 更多