运行 当 session 以 Yii 1 结束时的一些脚本
run some script when session end in Yii 1
我在配置文件 (main.php) 中的 session 配置是:
'session' => array(
'class' => 'CDbHttpSession',
'timeout' => 60*60, // 1 hour
),
我把这段代码放在布局文件中:
<?php if (!Yii::app()->user->isGuest) { ?>
<meta http-equiv="refresh" content="<?php echo Yii::app()->params['session_timeout'];?>;"/>
<?php } ?>
到目前为止,session结束时还没有任何通知。当我刷新浏览器时,session已经结束了。
在 session(或几乎)过期后,我想告诉用户 session 将过期,例如倒计时对话框或其他内容。
我试过这个扩展 http://www.yiiframework.com/extension/timeout-dialog/。但它不适用于我的网站配置。扩展程序在 session 还剩 1 分钟时显示对话框,但是当我单击按钮恢复 session 时,它不起作用,因为 session 仍然 运行 .我知道是因为当我刷新浏览器时,session 已经过期了。
那么,我必须做什么?
至少,我想知道浏览器刷新时session的剩余时间如何获取,所以我可以自己修改公告。
谢谢:)
我想我自己解决了这个问题。
这里解释一下:
知道会话在服务器上运行很重要。当浏览器访问服务器时,会话超时将重新开始。无法知道会话的剩余时间。
因此,要警告用户会话将过期,必须在客户端使用 javascript 或 jQuery 进行处理。我创建了处理程序,当网站空闲(无活动)或会话超时快到期时会警告用户。将通过确认对话框警告用户,询问用户是继续登录还是注销。当用户决定继续登录时,客户端将执行 ajax 在服务器中执行任何脚本(因为这将重新启动会话超时)。
因为我的Yii网站使用bootstrap 3,所以我创建的对话框面板将使用bootstrap代码。
这是在视图布局中:
<script>
/* configuration */
var count = <?php echo Yii::app()->session->getTimeout(); ?>; //session
var countdown = 60; //warning 60 seconds
var idle = 10; //warning when idle 10 seconds
var urluser = <?php echo "'".Yii::app()->createUrl('site/lock', array('id'=>Yii::app()->user->id))."'"; ?>;
var idlecountdown = countdown;
var idletime = idle;
var show = true;
var counter = setInterval(timer, 1000); //1000 will run it every 1 second
function timer(){
count = count-1; idletime = idletime-1;
if (count <= 0 ){
clearInterval(counter);
// counter ended, go to the lockscreen
window.location.href = urluser;
return;
}
if (count <= countdown || idletime <= 0){
count = count<=countdown?count:countdown;
// show warning
if(show){
document.getElementById('tombolmodal').click();
show = false;
}
document.getElementById('sisadetik').innerHTML = count;
}
window.onmousemove = function(){ idletime=idle };
window.onclick = function(){ idletime=idle };
window.onmousedown = function(){ idletime=idle };
window.onscroll = function(){ idletime=idle };
window.onkeypress = function(){ idletime=idle };
// when button stay signin cliked
document.getElementById('staysignin').onclick = function() {
// access properties using this keyword
if ( this.click ) {
count = <?php echo Yii::app()->session->getTimeout(); ?>;
show = true;
idletime = idle;
}
};
document.getElementById('forcelogout').onclick = function() {
// access properties using this keyword
if ( this.click ) {
window.location.href = urluser;
return;
}
};
}
</script>
<!-- design of modal -->
<button id='tombolmodal' style="display:none" type="button" class="btn btn-info btn-lg" data-backdrop="static" data-keyboard="false" data-toggle="modal" data-target="#myModal">Open Large Modal</button>
<div class="modal fade" id="myModal" role="dialog">
<div class="modal-dialog modal-sm">
<div class="modal-content panel-danger">
<div class="modal-header panel-heading" style="border-radius: inherit;">
<h4 class="modal-title"><span class="glyphicon glyphicon-warning-sign"></span>
ATTENTION!</h4>
</div>
<div class="modal-body text-center">
<h3 class="text-danger">
It seems you are in inactive
</h3>
<p>
<b><span id="sisadetik"></span> seconds</b> left to logout your account
</p>
</div>
<div class="modal-footer">
<!-- From this line, I Used YiiBooster Extension -->
<?php $this->widget('booster.widgets.TbButton',
array(
'buttonType' => 'ajaxSubmit',
'context' => 'primary',
'label' => 'Keep Sign In',
'url' => CController::createUrl('site/keepalive'),
'ajaxOptions' => array(
'type' => 'GET',
),
'htmlOptions' => array(
"data-dismiss"=>"modal",
'id'=>'staysignin',
)
)
);
?>
<?php $this->widget('booster.widgets.TbButton',
array(
'context' => 'default',
'label' => 'Logout',
'htmlOptions' => array(
"data-dismiss"=>"modal",
"id"=>"forcelogout"
)
)
);
?>
<!-- End of YiiBooster Extension -->
</div>
</div>
</div>
</div>
这是我的站点控制器:
public function actionKeepalive()
{
if(Yii::app()->request->isAjaxRequest){
Yii::app()->session->open();
}
}
public function actionLock($id)
{
$user = User::model()->findByPk($id);
Yii::app()->user->logout();
$this->render('lock', array( //refers to lockscreen page
'user'=>$user,
));
}
并且不要忘记写下我上面问题的代码。
该代码在我的网站上运行良好。
这段代码还有一个弱点。当您在不同的浏览器中使用相同的帐户登录时,它们彼此不相关。他们是独立的。所以,如果第一个浏览器的session已经过期,其他浏览器的session可能还没有过期,甚至早已经过期了。
从这个link也可以看到Yii2中的实现:http://www.hafidmukhlasin.com/2014/10/01/yii2-create-lock-screen-web-application-with-javascript/
谢谢。如果我错了请纠正我
我在配置文件 (main.php) 中的 session 配置是:
'session' => array(
'class' => 'CDbHttpSession',
'timeout' => 60*60, // 1 hour
),
我把这段代码放在布局文件中:
<?php if (!Yii::app()->user->isGuest) { ?>
<meta http-equiv="refresh" content="<?php echo Yii::app()->params['session_timeout'];?>;"/>
<?php } ?>
到目前为止,session结束时还没有任何通知。当我刷新浏览器时,session已经结束了。
在 session(或几乎)过期后,我想告诉用户 session 将过期,例如倒计时对话框或其他内容。
我试过这个扩展 http://www.yiiframework.com/extension/timeout-dialog/。但它不适用于我的网站配置。扩展程序在 session 还剩 1 分钟时显示对话框,但是当我单击按钮恢复 session 时,它不起作用,因为 session 仍然 运行 .我知道是因为当我刷新浏览器时,session 已经过期了。
那么,我必须做什么?
至少,我想知道浏览器刷新时session的剩余时间如何获取,所以我可以自己修改公告。
谢谢:)
我想我自己解决了这个问题。
这里解释一下:
知道会话在服务器上运行很重要。当浏览器访问服务器时,会话超时将重新开始。无法知道会话的剩余时间。
因此,要警告用户会话将过期,必须在客户端使用 javascript 或 jQuery 进行处理。我创建了处理程序,当网站空闲(无活动)或会话超时快到期时会警告用户。将通过确认对话框警告用户,询问用户是继续登录还是注销。当用户决定继续登录时,客户端将执行 ajax 在服务器中执行任何脚本(因为这将重新启动会话超时)。
因为我的Yii网站使用bootstrap 3,所以我创建的对话框面板将使用bootstrap代码。
这是在视图布局中:
<script>
/* configuration */
var count = <?php echo Yii::app()->session->getTimeout(); ?>; //session
var countdown = 60; //warning 60 seconds
var idle = 10; //warning when idle 10 seconds
var urluser = <?php echo "'".Yii::app()->createUrl('site/lock', array('id'=>Yii::app()->user->id))."'"; ?>;
var idlecountdown = countdown;
var idletime = idle;
var show = true;
var counter = setInterval(timer, 1000); //1000 will run it every 1 second
function timer(){
count = count-1; idletime = idletime-1;
if (count <= 0 ){
clearInterval(counter);
// counter ended, go to the lockscreen
window.location.href = urluser;
return;
}
if (count <= countdown || idletime <= 0){
count = count<=countdown?count:countdown;
// show warning
if(show){
document.getElementById('tombolmodal').click();
show = false;
}
document.getElementById('sisadetik').innerHTML = count;
}
window.onmousemove = function(){ idletime=idle };
window.onclick = function(){ idletime=idle };
window.onmousedown = function(){ idletime=idle };
window.onscroll = function(){ idletime=idle };
window.onkeypress = function(){ idletime=idle };
// when button stay signin cliked
document.getElementById('staysignin').onclick = function() {
// access properties using this keyword
if ( this.click ) {
count = <?php echo Yii::app()->session->getTimeout(); ?>;
show = true;
idletime = idle;
}
};
document.getElementById('forcelogout').onclick = function() {
// access properties using this keyword
if ( this.click ) {
window.location.href = urluser;
return;
}
};
}
</script>
<!-- design of modal -->
<button id='tombolmodal' style="display:none" type="button" class="btn btn-info btn-lg" data-backdrop="static" data-keyboard="false" data-toggle="modal" data-target="#myModal">Open Large Modal</button>
<div class="modal fade" id="myModal" role="dialog">
<div class="modal-dialog modal-sm">
<div class="modal-content panel-danger">
<div class="modal-header panel-heading" style="border-radius: inherit;">
<h4 class="modal-title"><span class="glyphicon glyphicon-warning-sign"></span>
ATTENTION!</h4>
</div>
<div class="modal-body text-center">
<h3 class="text-danger">
It seems you are in inactive
</h3>
<p>
<b><span id="sisadetik"></span> seconds</b> left to logout your account
</p>
</div>
<div class="modal-footer">
<!-- From this line, I Used YiiBooster Extension -->
<?php $this->widget('booster.widgets.TbButton',
array(
'buttonType' => 'ajaxSubmit',
'context' => 'primary',
'label' => 'Keep Sign In',
'url' => CController::createUrl('site/keepalive'),
'ajaxOptions' => array(
'type' => 'GET',
),
'htmlOptions' => array(
"data-dismiss"=>"modal",
'id'=>'staysignin',
)
)
);
?>
<?php $this->widget('booster.widgets.TbButton',
array(
'context' => 'default',
'label' => 'Logout',
'htmlOptions' => array(
"data-dismiss"=>"modal",
"id"=>"forcelogout"
)
)
);
?>
<!-- End of YiiBooster Extension -->
</div>
</div>
</div>
</div>
这是我的站点控制器:
public function actionKeepalive()
{
if(Yii::app()->request->isAjaxRequest){
Yii::app()->session->open();
}
}
public function actionLock($id)
{
$user = User::model()->findByPk($id);
Yii::app()->user->logout();
$this->render('lock', array( //refers to lockscreen page
'user'=>$user,
));
}
并且不要忘记写下我上面问题的代码。
该代码在我的网站上运行良好。
这段代码还有一个弱点。当您在不同的浏览器中使用相同的帐户登录时,它们彼此不相关。他们是独立的。所以,如果第一个浏览器的session已经过期,其他浏览器的session可能还没有过期,甚至早已经过期了。
从这个link也可以看到Yii2中的实现:http://www.hafidmukhlasin.com/2014/10/01/yii2-create-lock-screen-web-application-with-javascript/
谢谢。如果我错了请纠正我