JSF 2.3基于表单的登录和ViewExpiredException

3
我有一个Web应用程序,目前部署在Wildfly 22上,使用JSF 2.3和OpenJDK 11。我正在将登录页面从j_security_check迁移到编程式登录,遵循BalusC在此帖子中的示例:
在Java EE / JSF中使用j_security_check执行用户身份验证
我不会发布登录代码,因为它与BalusC的帖子完全相同。登录过程正常工作,但当登录页面的会话超时到期时出现问题。换句话说,当用户请求受保护的资源时,会呈现出登录页面。如果在提交登录表单之前会话过期,则会引发ViewExpiredException并向用户显示错误。
我知道这是期望的行为,但对于最终用户来说并不是理想的情况。我使用OmniFaces的ViewExpiredExceptionHandler成功地减少了这种情况。这样,当抛出ViewExpiredException时,OmniFaces处理程序将捕获它并重定向到带有查询字符串的当前URL。换句话说,当会话过期后,用户尝试登录并且登录页面再次呈现给用户。我成功地使用了#{flash['org.omnifaces.view_expired'] eq true},以便向用户呈现漂亮的消息,解释超时发生了。是否有任何方法可以解决这种情况,并在会话过期时执行成功的登录,以便用户不必输入他的凭据两次?谢谢你的帮助!
1个回答

1
“有没有办法解决这种情况,即使会话过期,也能成功登录,以便用户不必输入他的凭据两次?”
是的,通过使用无状态JSF,将的transient属性设置为true,可以实现这一点。
<f:view transient="true">
    <h:form>
        ...
        <h:commandButton ... action="#{requestScopedBean.login}" />
    </h:form>
</f:view>

请注意,支持bean必须是@RequestScoped,而不是@ViewScoped或更广泛的范围。
另请参阅:

你好, 我按照你的建议操作,一切都完美地解决了。 然后我意识到在会话超时后原始URL没有被保留,但只需公开getter和setter并在xhtml中添加<h:inputHidden value="#{loginController.originalURL}"/>即可解决。非常感谢! - areal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接