我有一个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}
,以便向用户显示一条不错的消息,解释超时发生。
是否有办法解决这种情况,并执行一个成功的登录,即使会话到期,使用户不必输入他的凭据两次?
谢谢你的帮助!
是否有办法解决这种情况,并在会话到期时执行成功登录,以便用户不必输入他的凭据两次?
是的,通过将<f:view>
的transient
属性设置为true
来使用无状态JSF。
<f:view transient="true">
<h:form>
...
<h:commandButton ... action="#{requestScopedBean.login}" />
</h:form>
</f:view>
请注意,支持bean必须是@RequestScoped
,而不是@ViewScoped
或更大。
参见:
- 在JSF中无状态的用处是什么?
- 在后台处理ViewExpiredException并恢复表单值
- JSF没有@ viewscope