gpt4 book ai didi

jsf - session 到期时自动在客户端执行操作

转载 作者:行者123 更新时间:2023-12-04 02:43:39 24 4
gpt4 key购买 nike

我想在 <p:growl> 中显示 session 已过期。
我发现了许多处理 session 过期的方法,例如 Session timeout and ViewExpiredException handling on JSF/PrimeFaces ajax request ,但我无法将人脸消息推送到 <p:growl> .

就此而言,当 HTTP session 在服务器端自动过期时,如何在客户端自动运行一些(JavaScript)代码?

最佳答案

您可以使用 PrimeFaces idle monitor为了这。超时后用户被重定向到注销操作以使 session 无效。倒计时对话框前 2 分钟显示警告用户。再次移动鼠标后 session 被延长。

PrimeFaces 空闲监视器和 dialog放置在一个模板中,您可以添加到所涉及的每个页面:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">

<ui:composition>
<h:form prependId="false">
<p:idleMonitor
timeout="#{session.maxInactiveInterval * 1000 - 125000}"
onidle="startIdleMonitor()"
onactive="timeoutDialog.hide()" />

<p:dialog id="timeoutSession"
header="#{msg['session.expire']}"
widgetVar="timeoutDialog"
showEffect="fade" hideEffect="fade"
modal="true"
width="400"
height="110"
closable="false"
draggable="false"
resizable="false"
appendToBody="true"
onHide="stopCount()"
onShow="doTimer()">
<br />
<p>
<span class="ui-icon ui-icon-alert" style="float: left; margin: 8px 8px 0;"/>
<p:panel>
#{msg['logoff.soon.1']}
<span id="dialog-countdown" style="font-weight: bold"></span>
#{msg['logoff.soon.2']}
</p:panel>
</p>
<br />
<p style="font-weight: bold;">#{msg['move.cursor']}</p>
</p:dialog>
<p:remoteCommand name="keepAlive" actionListener="#{auth.keepSessionAlive}" />
</h:form>
<script type="text/javascript">
var TIME = 120; // in seconds
var countTimer = TIME;
var processTimer;
var timer_is_on = 0;
var redirectPage = "#{request.contextPath}/auth/j_verinice_timeout";

var countDownDiv = "dialog-countdown";
var txtCountDown = null;
if (!txtCountDown)
txtCountDown = document.getElementById(countDownDiv);

function startIdleMonitor() {
countTimer = TIME;
txtCountDown.innerHTML = countTimer;
timeoutDialog.show();
}
function timedCount() {
txtCountDown.innerHTML = countTimer;
if (countTimer == 0) {
stopCount();
window.location.href = redirectPage;
return;
}
countTimer = countTimer - 1;
processTimer = setTimeout("timedCount()", 1000);
}
function doTimer() {
if (!timer_is_on) {
timer_is_on = 1;
timedCount();
}
}
function stopCount() {
clearTimeout(processTimer);
timer_is_on = 0;
keepAlive();
}
</script>
</ui:composition>
</html>

  • 第 11 行:空闲监视器的超时时间由系统变量 session.maxInactiveInterval 设置。您在 web.xml 或服务器配置中设置的值。
  • 第 12/13 行:在超时后调用 Javascript 方法 startIdleMonitor(),无需任何用户交互。此方法打开对话框。 timeoutDialog.hide() 在用户再次忙碌时调用:对话框关闭
  • 第 26/27 行:在显示或隐藏对话框时调用另外两个 Javascript 方法:doTimer() 启动和 stopCount() 停止倒计时。
  • 第 40 行:PrimeFaces 远程命令以保持 session 事件。通过在服务器上调用任意方法, session 被扩展。命令由 Javascript 方法 keepAlive() 在第 78 行调用。
  • 第 59-68 行:每秒调用 Javascript 方法 timedCount() 以执行倒计时。超时后重定向在第 63 行完成。

  • 要在多个页面中激活超时处理,请在布局模板中包含超时模板:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xml:lang="de-DE">
    <h:head>
    ...
    </h:head>
    <body>
    <ui:include src="/template/sessionTimeOut.xhtml" />
    <ui:include src="/nav.xhtml"/>>
    <ui:insert name="content">Default content</ui:insert>
    <ui:include src="/footer.xhtml"/>>
    </body>
    </html>

    您可以在 web.xml 中设置的 Web 应用程序的特定超时时间:
    <!--?xml version="1.0" encoding="UTF-8"?-->
    <web-app>
    ...
    <session-config>
    <!-- Session idle timeout in min. -->
    <session-timeout>30</session-timeout>
    </session-config>
    </web-app>

    您可以在此博客文章中阅读有关此解决方案的更多信息: JSF and PrimeFaces: Session Timeout Handling

    关于jsf - session 到期时自动在客户端执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19097565/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com