1

多年来,我一直很困惑为什么在登录后有时我没有定向到应用程序欢迎页面。我终于想通了(比其他人晚了几年):

  • 我通过 j_security_check 成功登录并进入欢迎页面

  • 等待会话超时

  • 单击发送 GET 请求的 h:link

  • 因为它是 GET 而不是 POST 我的自定义 ViewExpiredException
    处理程序不会启动


  • 由于会话超时,容器安全性重定向到登录页面。由于会话超时+容器安全性,应用程序在阶段侦听器或过滤器中看不到获取请求(来自 h:link)。

  • 我再次成功登录

  • j_security_check 将我重定向到触发
    身份验证的页面,在这种情况下是 GET 请求的目标。

最后一点我不明白,我认为它总是会进入欢迎页面。

我的问题是我目前的设计要求登录后我总是显示欢迎页面。欢迎页面有一个 preRenderView 事件,它在登录后在会话范围的 bean 中设置一些上下文信息并增加一些计数器等......

支持其他页面的 bean 代码需要此上下文信息,目前如果我不先浏览欢迎页面,则会出现异常。

在修复它方面,我查看了以下选项:

  1. 理想情况下,会有一个可以调用的@PostLogin 方法,它可以彻底解决我的所有问题。我将 JSF (Mojarra) 与 Myfaces CODI 一起使用,但我没有看到任何我想要的东西。

  2. 我可以向我的过滤器添加更多代码,但我需要保留一些数据(即登录计数),这看起来不是一个不错的选择。也许我错了。

  3. 我让 j_security_check 的潜在目标(使用 GET 调用的页面)的所有 preRenderView 方法处理直接从 j_seecurity_check 调用它们的情况。我可以看到这是我必须做的,但这似乎很麻烦。

  4. 为 glassfish 编写一个服务器身份验证模块以覆盖 j_security_check 行为。

这通常是如何处理的?经过多年滥用 POST 后,我开始使用 GET 处理简单的导航案例,并且自定义异常处理程序不起作用。如果有人对此问题有任何指导,我将不胜感激,至少我知道现在发生了什么。希望我错过了一些明显的东西!

感谢操作系统

4

1 回答 1

2

理想情况下,会有一个可以调用的@PostLogin 方法,它可以彻底解决我的所有问题。我将 JSF (Mojarra) 与 Myfaces CODI 一起使用,但我没有看到任何我想要的东西。

确实没有这样的事情。


我可以向我的过滤器添加更多代码,但我需要保留一些数据(即登录计数),这看起来不是一个不错的选择。也许我错了。

这确实是“最简单”的方式。基本上:

UserPrincipal user = request.getUserPrincipal();
HttpSession session = request.getSession();

if (user != null && session.getAttribute("user") == null) {
    session.setAttribute("user", user);

    // First-time login. You can do your intercepting thing here.
    response.sendRedirect(request.getContextPath() + "/welcome.xhtml");
}

我让 j_security_check 的潜在目标(使用 GET 调用的页面)的所有 preRenderView 方法处理直接从 j_seecurity_check 调用它们的情况。我可以看到这是我必须做的,但这似乎很麻烦。

那不是DRY


为 glassfish 编写一个服务器身份验证模块以覆盖 j_security_check 行为。

无法回答,因为我从来没有这样做过。

于 2012-05-10T18:41:35.747 回答