多年来,我一直很困惑为什么登录后我有时没有指向应用程序欢迎页面。我终于弄明白了(比其他人多年):
我通过j_security_check成功登录并转到欢迎页面
等待会话超时
点击发送GET请求的h:link
因为它是一个GET而不是POST我的自定义ViewExpiredException
处理程序没有启动
容器安全性重定向到登录页面,因为会话
已经超时了。因为会话超时+容器安全性
在一个阶段监听器中,应用程序看不到get请求(来自h:link)
或过滤。
我再次成功登录
j_security_check将我重定向到触发了
的页面
身份验证,在这种情况下是GET请求的目标。
我不明白的最后一点,我以为它总会进入欢迎页面。
我的问题是我目前的设计要求在登录后我总是显示欢迎页面。欢迎页面有一个preRenderView事件,它在登录后在会话范围的bean中设置一些上下文信息,并增加几个计数器等...
支持其他页面的bean代码需要此上下文信息,目前如果我没有首先浏览欢迎页面,则会有例外。
在修复方面,我看了以下几个选项:
理想情况下,可以调用@PostLogin方法,它可以干净地解决我的所有问题。我使用JSF(Mojarra)和Myfaces CODI,但我没有看到任何符合我想要的东西。
我可以在我的过滤器中添加更多代码,但是我需要保留一些数据(即登录计数),它看起来不是一个不错的选择。也许我错了。
我使用j_security_check(使用GET调用的页面)的潜在目标的所有preRenderView方法处理直接从j_seecurity_check调用它们的情况。我可以看到这就是我必须要做的事情,但这看起来很麻烦。
为glassfish编写服务器身份验证模块以覆盖j_security_check行为。
这是如何正常处理的?在多年滥用POST后转移到GETs以获取简单的导航案例后,我开始遇到此问题,并且自定义异常处理程序不起作用。如果有人对这个问题有任何指导我会很感激,至少我知道现在发生了什么。希望我错过了一些明显的东西!
由于 O / S
答案 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行为。
无法回答,因为我从未这样做过。