Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax 如何在JSF应用程序中检查有效会话?_Ajax_Jsf_Primefaces - Fatal编程技术网

Ajax 如何在JSF应用程序中检查有效会话?

Ajax 如何在JSF应用程序中检查有效会话?,ajax,jsf,primefaces,Ajax,Jsf,Primefaces,在我解释这种情况之前,我会先说我正在开发的应用程序已经过时了,需要重新编写,等等。但我工作的公司并不在意,只是在寻找解决这个问题的快速绷带。另外,我只是一个随机的家伙,他们给了这个应用程序,尽管知道什么都没有,他们不知怎的认为我是主题专家。 我有一个.xhtml页面,用户可以通过它来支付账单。我们使用SiteMinder控制对应用程序的访问,并通过此设置了应用程序两小时不活动超时限制。然而,我们最近从第三方供应商那里实施了一些新的支付功能,这些功能使用了模态窗口。如果用户在这个.xhtml页面上

在我解释这种情况之前,我会先说我正在开发的应用程序已经过时了,需要重新编写,等等。但我工作的公司并不在意,只是在寻找解决这个问题的快速绷带。另外,我只是一个随机的家伙,他们给了这个应用程序,尽管知道什么都没有,他们不知怎的认为我是主题专家。 我有一个.xhtml页面,用户可以通过它来支付账单。我们使用SiteMinder控制对应用程序的访问,并通过此设置了应用程序两小时不活动超时限制。然而,我们最近从第三方供应商那里实施了一些新的支付功能,这些功能使用了模态窗口。如果用户在这个.xhtml页面上坐了一个小时五十九分钟,调用模式窗口(通过单击按钮),并在模式中完成各种操作,那么当完成这些操作后,第三方供应商认为操作成功(因为他们不知道我们的超时)但我们没有收到他们的任何回应,因为会议在我们这边已经超时。这是一个问题,因为用户可以安排未来的付款,如果我们没有从供应商那里得到响应,我们没有任何东西可以存储在我们的数据库中,我们最终将使用该数据库触发计划付款


当用户单击调用第三方模式窗口时,如何确定其会话是否仍然有效?下面是其中一个按钮的外观:

<p:commandButton id="makePaymentButton" 
    value="Make Payment" onclick="makePayment(/*args*/);"
</p:commandButton>

如果使用标准渲染工具包,请使用:

<h:commandButton id="makePaymentButton"
                 value="Make Payment" 
                 actionListener="your action listener which may return an exception if the session control fails">
    <f:ajax onevent="makePayment(/*args*/)" />
</h:commandButton>
注意:会话引用可能为空,然后检查您需要它做什么


不要忘记放置
要禁用JSESSIONID的自动创建。

要知道会话是否仍然有效,需要询问服务器。但是您必须小心,这样您的“询问”请求不会自动创建新会话本身。最可靠的方法是完全抛弃JSF,创建一个简单的Servlet

public class CheckSessionServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/plain");

        HttpSession session = request.getSession(false);
        if (session == null) {
            // no session, let's respond 404
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
        } else {
            // session exists - return a succesful status
            response.setStatus(HttpServletResponse.SC_NO_CONTENT);
        }
    }

}
使用JS向这个servlet发出AJAX POST请求,然后根据请求结果采取行动

为了防止在用户填写第三方对话框时会话超时,您可能希望触摸会话以缓冲其超时:

        } else {
            // session exists - bump timeout & return a succesful status
            session.setAttribute("someUnusedAttribute", 123);
            response.setStatus(HttpServletResponse.SC_NO_CONTENT);
        }
如果会话已过期,则可以刷新页面(使用JS)以允许用户重新启动。或者向用户显示一条简单的消息,说明会话已结束,用户需要重新开始


你可以在不接触传统JSF的情况下完成这一切。

Ian,当我读到你的第一段时,我大笑起来。我完全知道您在说什么……”“当用户单击调用第三方模式窗口时,我如何确定用户的会话是否仍然有效?”-但在您自己的示例中,会话此时(1h 59m)仍然有效,因此这没有帮助。我认为问题在于,当用户填写第三方对话框时,会话无效。@VsevolodGolovanov-我今天早上在闹钟响之前躺在床上的时候确实想到了这一点。你说得对,这不能完全解决我的问题。我只能确保在用户调用模式时会话是有效的。所以,现在我想知道如何避免他们的会议死亡。很好的创意建议!ajax提交可能会创建一个新的会话本身,这可能是OP最终想要的,但不是他想要的。此外,如果这意味着触发的
onsuccess
取决于actionListener引发的异常,那么这是错误的。如果会话不存在,则getSession(false)不会创建会话。关于onsuccess的另一个共通点,我稍后会检查,但我以前是这样做的。可能是oncomplete检查arg.validationFailed。。。我必须检查我的旧项目。
getSession(false)
是不相关的-会话将在这之前由JSF impl创建。
public class CheckSessionServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/plain");

        HttpSession session = request.getSession(false);
        if (session == null) {
            // no session, let's respond 404
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
        } else {
            // session exists - return a succesful status
            response.setStatus(HttpServletResponse.SC_NO_CONTENT);
        }
    }

}
        } else {
            // session exists - bump timeout & return a succesful status
            session.setAttribute("someUnusedAttribute", 123);
            response.setStatus(HttpServletResponse.SC_NO_CONTENT);
        }