处理ViewExireException / AJAX并显示一个对话Primefaces(Handl

2019-08-06 22:52发布

我不重定向或我的用户转发到另一个页面。 所以当我SessionExpiredExceptionHandler (扩展ExceptionHandlerWrapper )处理ViewExireException。 我希望用户停留在同一页面上,并显示一个对话框PrimeFaces。 对于通知的会话已过期,用户需要重新登录(基于对话框)。 我使用的Servlet 3.1功能登录/注销用户和Basic/file面向auth-方法给用户不同的系统角色映射。

现在的情况是,查看/页面刷新获得后2分钟,但会议没有得到失效。 只有当页面刷新,4分钟后发生第二次。

    <session-config>
        <session-timeout>2</session-timeout>
    </session-config>

编辑:这是由meta标签刷新:

<meta http-equiv="refresh" content="#{session.maxInactiveInterval}" />

我怎样才能让SessionExpiredExceptionHandler当异常发生第一次失效会话对象(Servlet的注销),我怎么能在客户端显示PrimeFaces对话框中调用一个JavaScript(expireDlg.show())?

我已经看了一些其他线程,但没有找到一个可行的解决方案。 会话超时

SessionExpiredExceptionHandler

    @Override
    public void handle() throws FacesException {
    for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) {
        ExceptionQueuedEvent event = i.next();
        ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();
        Throwable t = context.getException();
        if (t instanceof ViewExpiredException) {
        ViewExpiredException vee = (ViewExpiredException) t;
        FacesContext fc = FacesContext.getCurrentInstance();
        Map<String, Object> requestMap = fc.getExternalContext().getRequestMap();
        NavigationHandler nav = fc.getApplication().getNavigationHandler();                

        try {
            requestMap.put("currentViewId", vee.getViewId());

            nav.handleNavigation(fc, null, "Home");
            fc.renderResponse();

        } finally {
            i.remove();
        }                                
        }
    }
    // At this point, the queue will not contain any ViewExpiredEvents.
    // Therefore, let the parent handle them.
    getWrapped().handle();
    }

web.xml中

<exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/home.xhtml</location>
</error-page>

Answer 1:

我怎样才能让当异常发生第一次SessionExpiredExceptionHandler无效会话对象(Servlet的注销)

这次会议是推测是已经失效/过期( 否则ViewExpiredException不会在所有抛出 ),所以我没有看到手动无效它是如何的有用/到期自己它。 但对于情况下,你可以按如下而无效:

externalContext.invalidateSession();

和我怎样才能在客户端显示PrimeFaces对话框中调用一个JavaScript(expireDlg.show())?

您可以使用PrimeFaces RequestContext API编程指导PrimeFaces就完全Ajax响应执行一些JS代码。

RequestContext.getCurrentInstance().execute("expireDlg.show()");

不要忘了从异常处理程序删除导航处理程序块,如果你真的不想要导航。



Answer 2:

该解决方案为我的情况。 它接缝该Primefaces(3.3)被吞咽ExceptionQueuedEvent。 有没有例外情况处理,当我ViewExceptionHandler被调用。 所以不是我用的p:idleMonitor在事件听者的组成部分。 我也删除元刷新标记。

<p:idleMonitor timeout="#{(session.maxInactiveInterval-60)*1000}">
        <p:ajax event="idle" process="@this" update="sessionMsg" listener="#{userController.userIdleSession()}" />
        <p:ajax event="active" process="@this" update="sessionMsg" listener="#{userController.userActiveSession()}"/>
</p:idleMonitor>

一个奇怪的是,如果timeout是excatly一样web.xml会话超时参数,监听器将不会被调用。

豆功能

public void userIdleSession() {
    if (!userIdleMsgVisable) {
        userIdleMsgVisable = true;
        JsfUtil.addWarningMessage(JsfUtil.getResourceMessage("session_expire_title"), JsfUtil.getResourceMessage("session_expire_content"));            
    }
}

public void userActiveSession() {
        if (!userSessionDlgVisable) {
            userSessionDlgVisable = true;                     
            RequestContext.getCurrentInstance().execute("sessionExipreDlg.show()");            
        }
    }

对话框( sessionExipreDlg )称为重定向而不是使用导航处理程序,以获得新的范围并刷新页面。

public void userInactiveRedirect() {
        FacesContext fc = FacesContext.getCurrentInstance();
        userIdleMsgVisable = false;
        userSessionDlgVisable = false;
        sessionUser = null;         
        HttpServletRequest request = (HttpServletRequest) fc.getExternalContext().getRequest();
        JsfUtil.findBean("homeController", HomeController.class).clearCurrentValues();        
        try {
            fc.getExternalContext().redirect(JsfUtil.getApplicationPath(request, false, null));            
        } catch (IOException ex) {
            BeanUtil.severe(ex.getLocalizedMessage());
        }
    }


文章来源: Handle ViewExireException/ajax and display a Primefaces dialog