多年来,我一直很困惑为什么在登录后有时我没有定向到应用程序欢迎页面。我终于想通了(比其他人晚了几年):
我通过 j_security_check 成功登录并进入欢迎页面
等待会话超时
单击发送 GET 请求的 h:link
因为它是 GET 而不是 POST 我的自定义 ViewExpiredException
处理程序不会启动
由于会话超时,容器安全性重定向到登录页面。由于会话超时+容器安全性,应用程序在阶段侦听器或过滤器中看不到获取请求(来自 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 后,我开始使用 GET 处理简单的导航案例,并且自定义异常处理程序不起作用。如果有人对此问题有任何指导,我将不胜感激,至少我知道现在发生了什么。希望我错过了一些明显的东西!
感谢操作系统