它从web.xml
中读取错误页面,因为如果您没有首先使用JSF ajax,那么这是标准方式。换句话说,FullAjaxExceptionHandler
确保异常处理和错误页面呈现的行为完全相同,就好像你不会使用例如ajax一样。 <h:commandButton>
没有<f:ajax>
或<p:commandButton ajax="false">
,或者因为enduser已禁用JS。
确实可以通过扩展异常处理程序并覆盖findErrorPageLocation
方法来控制它,但它不会像标准方式那样运行。
或者,在您的特定情况下,更好的方法是只指定ViewExpiredException
的特定错误页面,并按照常规请求属性抓取初始页面,并在页面加载时让JavaScript重定向到该页面。
<h:outputScript>
window.location = "#{requestScope['javax.servlet.error.request_uri']}";
</h:outputScript>
作为奖励,它就能准确的方式,当你不会使用JSF AJAX相同。
我只想知道这将如何改善用户体验。这可能只会让最终用户感到困惑;一个页面,当会话在回发期间过期时,它可以在没有任何额外反馈的情况下重新加载自身。
感谢您的回复。你适合用户提交数据的情况,但在我的情况下,我想处理Ajax导航(渲染页面的另一部分)。在这种情况下,我想不出用户需要知道视图过期的原因。我错过了什么吗? –
恩,这种方式输入表单不符合设计。所有提交的数据都丢失了,没有任何关于成功/失败提交的反馈,页面只是重新加载。这一切都很混乱。就像填写登录表单一样,登录表单也会在没有反馈的情况下重新显示。您最好展示一个“对不起,您的会话已过期”的错误页面,并附上带有表单的原始页面的链接。 – BalusC
采取了点。 Facebook和LinkedIn等网站如何避免这种情况?他们只是让这个会议永远活着吗?他们在页面过期之前刷新页面吗? –