Я реализовал предупреждение о тайм-ауте сеанса с помощью javascript, который просто спрашивает пользователя, хотят ли они продлить свой сеанс или выйти из системы. Проблема в том, что это для портала интрасети, где опытные пользователи часто имеют несколько окон или вкладок браузера, открытых одновременно для приложения. В настоящее время им будет предлагаться выйти из каждого окна браузера. Как я могу сделать код более умным, чтобы обнаруживать, что они активно используют другой сеанс браузера?
Как вы можете отобразить предупреждение о тайм-ауте сеанса, которое достаточно умно для обработки нескольких открытых браузеров или вкладок
Ответы (4)
Вам нужно будет проверить состояние сеанса на сервере с помощью Ajax и отслеживать все открытые сеансы / окна, которые есть у пользователя. Тогда вы сможете настроить таргетинг только на один из доступных сеансов с предупреждением о выходе из системы.
В ответ на ваш комментарий:
Не используйте встроенный механизм сеанса, разработайте свой собственный, используя постоянный массив на стороне сервера или журнал базы данных.
Нет, в HTTP-запросе ничего не говорится о том, сколько браузеров открыто, но вы можете назначить свой собственный файл cookie с идентификатором сеанса, когда пользователь открывает каждое окно браузера. Сделайте вызов Ajax на сервер, посмотрите, не истек ли у пользователя тайм-аут, и если вы самая нижняя (или последняя) запись в журнале сеанса, то вы браузер, который получает предупреждение.
Вы не можете рассчитывать на то, что все вкладки / окна будут частью одного и того же сеанса, потому что они могут быть порождены и содержаться в отдельных процессах, и у вас нет особого контроля над этим.
Но если ваш код ссылается на файл cookie Javascript, вы можете проверить состояние псевдосессии с помощью обратной передачи (синхронного или асинхронного AJAX). Но тогда вы зависите от файлов cookie, включенных в браузере пользователя.
Это сработает?
Сохранить файл cookie Javascript и проверить его, чтобы определить, был ли сеанс расширен на другой вкладке?
похоже, это работает ...
Установить @ ng-idle @ ng-idle можно через NPM. Установите его, запустив:
npm install --save @ng-idle/core @ng-idle/keepalive angular2-moment
Настройте модуль вашего приложения. Откройте src / app / app.module.ts и импортируйте Ng2IdleModule, используя
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { NgIdleKeepaliveModule } from '@ng-idle/keepalive'; // this includes the core NgIdleModule but includes keepalive providers for easy wireup
import { MomentModule } from 'angular2-moment'; // optional, provides moment-style pipes for date formatting
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
MomentModule,
NgIdleKeepaliveModule.forRoot()
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
затем в component.ts
import { Component } from '@angular/core';
import {Idle, DEFAULT_INTERRUPTSOURCES} from '@ng-idle/core';
import {Keepalive} from '@ng-idle/keepalive';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
currentPath: String;
idleState = 'Not started.';
timedOut = false;
lastPing?: Date = null;
constructor(private idle: Idle, private keepalive: Keepalive, location: Location, router: Router) {
// sets an idle timeout of 5 seconds, for testing purposes.
idle.setIdle(5);
// sets a timeout period of 5 seconds. after 10 seconds of inactivity, the user will be considered timed out.
idle.setTimeout(5);
// sets the default interrupts, in this case, things like clicks, scrolls, touches to the document
idle.setInterrupts(DEFAULT_INTERRUPTSOURCES);
idle.onIdleEnd.subscribe(() => this.idleState = 'No longer idle.');
idle.onTimeout.subscribe(() => {
this.idleState = 'Timed out!';
this.timedOut = true;
});
idle.onIdleStart.subscribe(() => this.idleState = 'You\'ve gone idle!');
idle.onTimeoutWarning.subscribe((countdown) => this.idleState = 'You will time out in ' + countdown + ' seconds!');
// Sets the ping interval to 15 seconds
keepalive.interval(15);
keepalive.onPing.subscribe(() => this.lastPing = new Date());
// Lets check the path everytime the route changes, stop or start the idle check as appropriate.
router.events.subscribe((val) => {
this.currentPath = location.path();
if(this.currentPath.search(/authentication\/login/gi) == -1)
idle.watch();
else
idle.stop();
});
}
reset() {
this.idle.watch();
this.idleState = 'Started.';
this.timedOut = false;
}
}