Как можно отобразить тайм-аут сессии, предупреждающий, который достаточно умен для обработки нескольких открытых браузеров или вкладок

17
задан Amos M. Carpenter 4 September 2012 в 09:06
поделиться

4 ответа

Необходимо было бы проверить состояние сеанса на сервере с помощью Ajax и отслеживать все открытые сессии/окна, которые имеет пользователь. Вы тогда были бы в состоянии быть нацеленными на только одну из доступных сессий с журналом, предупреждая.

В ответ на Ваш комментарий:

не используют встроенный механизм сессии, разрабатывают Ваше собственное использование серверной стороны персистентный массив или журнал транзакций базы данных.

нет, ничто в Запросе HTTP не говорит Вам, сколько браузеров открыто, но можно присвоить собственный sessionID cookie, поскольку пользователь открывает каждое окно браузера. Выполните вызов Ajax к серверу, посмотрите, синхронизировал ли пользователь, и если Вы являетесь самыми низкими (или в последний раз) запись в журнале сеанса тогда, Вы - браузер, который получает предупреждение.

2
ответ дан 30 November 2019 в 14:50
поделиться

Вы не можете рассчитывать на все вкладки/окна, чтобы быть частью той же Сессии, потому что они могли порождаться и содержаться в рамках отдельных процессов, и Вы не имеете большого контроля над этим.

, Но если Ваш код ссылается на cookie JavaScript, можно проверить псевдосостояние сеанса через обратную передачу (синхронный или асинхронный Ajax). Но тогда Вы в зависимости от cookie, включаемых на браузере пользователя.

2
ответ дан 30 November 2019 в 14:50
поделиться

Это работало бы?

Хранилище cookie JavaScript и проверка, что, чтобы определить, была ли сессия расширена на другой вкладке?

похож, это действительно работает...

0
ответ дан 30 November 2019 в 14:50
поделиться

Установка @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;
    }
}
0
ответ дан 30 November 2019 в 14:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: