Perl CGI::Session->load() 는 호출마다 최종 액세스 시간이 갱신된다(몰랐다
9637 단어 Perl
WebSocket과 CGI :: 세션 하이브리드 시스템에서 발생하는 괴기 현상
이전에 만든 Perl Net::WebSocket::Server + CGI::Session으로 인증된 소켓 만들기 의 시스템에서, 접속중의 모든 세션의 타임 아웃 처리에 CGI::Session->load() 를 사용해 타임 아웃 판별을 실시하고 있었습니다.
이런 시스템에서 세션 관리와 만료일 판별에 CGI::Session을 이용.
誰かがWeb認証経由でWebSocketへアクセスする
-> セッションの有効期限が切れてる他のメンバーがいれば強制切断
세션 체크 부분sub check_session {
# IPアドレスとポートからセッションIDを取り出す
my $conn = $_ && $_->can("socket") || !$_[1] ? $_: $_[0];
my $addr = $conn->socket->peerhost(). ":". $conn->socket->peerport();
my $sid = $_ && $_->can("socket") || !$_[1] ? $clients{$addr} : $_[1];
my $session = CGI::Session->load(undef, $sid, {Directory=>'/.session'});
# 生存チェック
if (!(defined $session->id) || $sid ne $session->id) {
$conn->disconnect($conn->socket); #お前はもう死んでいる
print "dead session: ",$sid,"\n";
undef $user_ids{$sid};
undef $clients{$addr}; #セッションIDも消す
return 0;
}
if(!defined($user_ids{$sid})){
$user_ids{$sid} = $session->param('u');
}
return 1;
}
그러나 세션의 유효 시간 동안 다른 계정이 액세스하면 연결 중인 모든 세션의 _SESSION_ATIME이 업데이트되어 아무도 시간 초과되지 않습니다.
「 load()
함수는 유효기간을 연장시키지 않는다」라고 과신하고 있었던 것이 재해했습니다.
이런 느낌으로 전원 같은 시간에 갱신되고 있습니다. orz
역시 "Node.js에서 Perl CGI::Session에서 생성 된 SessionID에서 세션 가져 오기" 에서 했듯이, perl에서도 CGI::Session을 통하지 않고 직접 세션 파일을 읽는 것이 확실할지도 모르겠네요.
이런 용도에 CGI::Session 사용하는 사람은 적다고 생각합니다만, 액세스 시간을 갱신하지 않는 메소드를 추가해 주었으면 합니다.
추가
CGI-Session 없이 세션 읽기sub getSession {
my ($sid, $dir) = @_;
my $filename = $dir . '/cgisess_' . $sid;
my $text;
if (-e $filename) {
open (my $FILE, "<$filename") or die;
$text = do { local $/; <$FILE> };
close($FILE);
}
if($text && length($text) > 0){
my $session = eval($text);
#現在時刻
my $now = time;
#制限時間
my $limit = $session->{_SESSION_ATIME} + $session->{_SESSION_ETIME};
#現在時刻が制限時間を超えていたらアウト
if($now >= $limit){
return undef;
}
return $session;
} else {
return undef;
}
}
그래, 괜찮아. . . 다른 좋은 방법은 없습니까?
Reference
이 문제에 관하여(Perl CGI::Session->load() 는 호출마다 최종 액세스 시간이 갱신된다(몰랐다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Urushibara01/items/38da465db46a7c089d40
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
誰かがWeb認証経由でWebSocketへアクセスする
-> セッションの有効期限が切れてる他のメンバーがいれば強制切断
sub check_session {
# IPアドレスとポートからセッションIDを取り出す
my $conn = $_ && $_->can("socket") || !$_[1] ? $_: $_[0];
my $addr = $conn->socket->peerhost(). ":". $conn->socket->peerport();
my $sid = $_ && $_->can("socket") || !$_[1] ? $clients{$addr} : $_[1];
my $session = CGI::Session->load(undef, $sid, {Directory=>'/.session'});
# 生存チェック
if (!(defined $session->id) || $sid ne $session->id) {
$conn->disconnect($conn->socket); #お前はもう死んでいる
print "dead session: ",$sid,"\n";
undef $user_ids{$sid};
undef $clients{$addr}; #セッションIDも消す
return 0;
}
if(!defined($user_ids{$sid})){
$user_ids{$sid} = $session->param('u');
}
return 1;
}
sub getSession {
my ($sid, $dir) = @_;
my $filename = $dir . '/cgisess_' . $sid;
my $text;
if (-e $filename) {
open (my $FILE, "<$filename") or die;
$text = do { local $/; <$FILE> };
close($FILE);
}
if($text && length($text) > 0){
my $session = eval($text);
#現在時刻
my $now = time;
#制限時間
my $limit = $session->{_SESSION_ATIME} + $session->{_SESSION_ETIME};
#現在時刻が制限時間を超えていたらアウト
if($now >= $limit){
return undef;
}
return $session;
} else {
return undef;
}
}
Reference
이 문제에 관하여(Perl CGI::Session->load() 는 호출마다 최종 액세스 시간이 갱신된다(몰랐다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Urushibara01/items/38da465db46a7c089d40텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)