j_security_check没有重定向到欢迎页面 - 成功登录事件监听器?

时间:2012-05-10 18:27:51

标签: jsf authentication glassfish mojarra j-security-check

多年来,我一直很困惑为什么登录后我有时没有指向应用程序欢迎页面。我终于弄明白了(比其他人多年):

  • 我通过j_security_check成功登录并转到欢迎页面

  • 等待会话超时

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

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

  • 容器安全性重定向到登录页面,因为会话
    已经超时了。因为会话超时+容器安全性 在一个阶段监听器中,应用程序看不到get请求(来自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行为。

  5. 这是如何正常处理的?在多年滥用POST后转移到GETs以获取简单的导航案例后,我开始遇到此问题,并且自定义异常处理程序不起作用。如果有人对这个问题有任何指导我会很感激,至少我知道现在发生了什么。希望我错过了一些明显的东西!

    由于 O / S

1 个答案:

答案 0 :(得分: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行为。

无法回答,因为我从未这样做过。