Member 11471318 Ответов: 1

Как включить автоматический выход из системы и перенаправление на вход или домашнюю страницу в случае истечения срока действия сеанса


я попробовал плагин javascript, он работал нормально, но у меня есть проблема, если я открою две вкладки, содержащие один и тот же пользовательский интерфейс проекта.неактивная вкладка переживает тайм-аут сеанса и перенаправляется на вход в систему, как предотвратить эту проблему.

Что я уже пробовал:

/*! jQuery userTimeout - v0.3.0 - 2016-05-13
* https://github.com/lleblanc42/jquery-userTimeout
* Copyright (c) 2016 Luke LeBlanc; Licensed GPL-3.0 */
;(function ($, document, window, undefined) {
	'use strict';

	$.fn.userTimeout = function (opts) {

		var defaults = {
			logouturl: null,                   // ULR to redirect to, to log user out
			referer: false,                    // URL Referer - false, auto or a passed URL
			refererName: 'refer',              // Name of the passed referal in the URL
			notify: true,                      // Toggle for notification of session ending
			timer: true,                       // Toggle for enabling the countdown timer
			session: 600000,                   // 10 Minutes in Milliseconds, then notification of logout
			force: 300000,                     // 5 Minutes in Milliseconds, then logout
			ui: 'auto',                        // Model Dialog selector (auto, bootstrap, jqueryui)
			debug: false,                      // Shows alerts
			modalTitle: 'Session Timeout',     // Modal Title
			modalBody: 'You\'re being timed out due to inactivity. Please choose to stay signed in or to logoff. Otherwise, you will logged off automatically.'  // Modal body content
		};

		var options = $.extend(defaults, opts || {});

		var modalUI, timeout, forceLogout, countDownTimer, seconds = Math.floor((options.force / 1000) % 60);

		/**
		 * var init -
		 *
		 * Initializes the plugin. It first does some basic error checking
		 * to ensure the plugin is properly configured, then checks to ensure
		 * one of the two dependencies is available within the page in order
		 * to utilize the modal feature of the plugin. It finishes by enabling
		 * the session timeout and the events to keep the session alive.
		 *
		 * @return {undefined}
		 */
		var init = function() {
			clearTimeout(timeout);

			if (!options.logouturl) {
				if (options.debug === true) {
					window.alert('Please configure the userTimeout plugin!');
				} else {
					window.console.error('Please configure the userTimeout plugin!');
				}
				
				return;
			}

			modalUI = uiCheck(options.ui);
			
			if (modalUI === false) {
				return;
			}
			
			resetTime(false);

			$(document).on('focus click mousemove mousedown keyup scroll keypress', function () {
				resetTime(false);
			});
		};
		
		/**
		 * var uiCheck -
		 *
		 * Checks to see if either bootstrap or jQuery UI is available within the page.
		 * Otherwise, false will be given. Based on what this function returns, will
		 * determine which modal, if any at all, will be used.
		 * 
		 * @param  {string or boolean (false)} uiTest [String or boolean (false) given from the passed options of the plugin]
		 * @return {string or boolean (false)}        [Returns false if unable to determine if bootstrap or jQuery UI is available within the page, otherwise returns which modal to use]
		 */
		var uiCheck = function (uiTest) {
			switch (uiTest) {
				case 'auto':
					if (typeof $().emulateTransitionEnd === 'function') {
						uiTest = 'bootstrap';
					} else if (typeof jQuery.ui !== 'undefined') {
						uiTest = 'jqueryui';
					} else {
						if (options.debug === true) {
							window.alert('Twitter Bootstrap 3 nor jQueryUI was not found! Please load the proper libraries and their themes to utilize this plugin!');
						} else {
							window.console.error('Twitter Bootstrap 3 nor jQueryUI was not found! Please load the proper libraries and their themes to utilize this plugin!');
						}
						
						return false;
					}

					break;
				case 'bootstrap':
					if (typeof $().emulateTransitionEnd !== 'function') {
						if (options.debug === true) {
							window.alert('Twitter Bootstrap 3 was not found! Please load the proper libraries and their themes to utilize this plugin!');
						} else {
							window.console.error('Twitter Bootstrap 3 was not found! Please load the proper libraries and their themes to utilize this plugin!');
						}
						
						return false;
					} else {
						uiTest = 'bootstrap';
					}

					break;
				case 'jqueryui':
					if (typeof jQuery.ui === 'undefined') {
						if (options.debug === true) {
							window.alert('jQueryUI was not found! Please load the proper libraries and their themes to utilize this plugin!');
						} else {
							window.console.error('jQueryUI was not found! Please load the proper libraries and their themes to utilize this plugin!');
						}
						
						return false;
					} else {
						uiTest = 'jqueryui';
					}

					break;
				default:
					if (options.debug === true) {
						window.alert('Twitter Bootstrap 3 nor jQueryUI was not found! Please load the proper libraries and their themes to utilize this plugin!');
					} else {
						window.console.error('Twitter Bootstrap 3 nor jQueryUI was not found! Please load the proper libraries and their themes to utilize this plugin!');
					}
					
					return false;
			}

			return uiTest;
		};

		/**
		 * var modal -
		 *
		 * Creates and displays the modal to the end user based on the configuration
		 * of the plugin. If the modal is bootstrap and the settings for the timer
		 * are set to true, the countdown timer will display.
		 *
		 * @return {undefined}
		 */
		var modal = function () {
			resetTime(true);

			if (modalUI === 'bootstrap') {
				var container, dialog, content, header, body, footer, logoutBtn;

				container = $('<div class="modal fade" id="notifyLogout"></div>');
				dialog = $('<div class="modal-dialog"></div>');
				content = $('<div class="modal-content"></div>');
				header = $('<div class="modal-header"><h4 class="modal-title" id="notifyLogoutLabel">' + options.modalTitle + '</h4></div>');
				body = $('<div class="modal-body">' + options.modalBody + '</div>');
				
				if (options.timer === true) {
					footer = $('<div class="modal-footer"></div>');
					countDown(seconds);
				} else {
					footer = $('<div class="modal-footer"></div>');
				}
				
				logoutBtn = $('');

				content.append(header, body, footer);
				footer.prepend(logoutBtn);
				dialog.append(content);
				container.append(dialog);

				$(container).modal({
					backdrop: 'static',
					keyboard: false,
					show: true
				});

				$(container).on('hide.bs.modal', function () {
					resetTime(false);

					$(document).on('focus click mousemove mousedown keyup scroll keypress', function () {
						resetTime(false);
					});

					$(container).remove();
				});

				$(logoutBtn).on('click', function () {
					logout();
				});
			} else if (modalUI === 'jqueryui') {
				var jqueryLogout;
				var jqueryModalOptions = {};
				var jqueryModal = '<div id="notifyLogout"><p>' + options.modalBody + '</p></div>';

				jqueryModalOptions['Stay Logged In'] = function (){
					resetTime(false);

					$(document).on('focus click mousemove mousedown keyup scroll keypress', function () {
						resetTime(false);
					});
					
					jqueryLogout.dialog('close');
				};

				jqueryModalOptions['Log Off'] = function (){
					logout();
				};

				jqueryLogout = $(jqueryModal).dialog({
					buttons: jqueryModalOptions,
					modal: true,
					width: 600,
					height: 300,
					resizable: false,
					title: options.modalTitle
				});
			}
		};
		
		/**
		 * var countDown -
		 *
		 * Creates the count down timer for the bootstrap modal and sets
		 * the timeout.
		 * 
		 * @param  {integar} countTime [Time in seconds for which it counts down]
		 * @return {undefined}
		 */
		var countDown = function (countTime) {
			$('#countdowntimer').html(countTime);
			
			if (countTime !== 0) {
				countDownTimer = setTimeout(function () {
					countTime = countTime - 1;
					
					countDown(countTime);
				}, 1000);
			} else {
				clearTimeout(countDownTimer);
			}
		};

		/**
		 * var resetTime -
		 *
		 * Clears any and all current timeouts and resets them accordingly.
		 * 
		 * @param  {boolean} modaltime [Tells the function whether to set the force timeout for when the session is ending and the modal is visible or to set the regular timeout]
		 * @return {undefined}
		 */
		var resetTime = function (modaltime) {
			clearTimeout(timeout);
			clearTimeout(forceLogout);
			clearTimeout(countDownTimer);

			if (modaltime === true){
				forceLogout = setTimeout(logout, options.force);
			} else {
				if(options.notify === true) {
					timeout = setTimeout(modal, options.session);
				} else {
					timeout = setTimeout(logout, options.session);
				}
			}
		};

		/**
		 * var logout -
		 * 
		 * Called when the session times out and sends the user to the logout
		 * page as set in the options. It first checks if the referer settings
		 * are configured and handles the logout accordingly.
		 *
		 * @return {object} [Returns the new window location (logoff)]
		 */
		var logout = function () {
			var referralURL;

			clearTimeout(timeout);
			clearTimeout(forceLogout);
			clearTimeout(countDownTimer);

			if (options.referer !== false) {
				if (options.referer === 'auto') {
					var currentReferral = $(location).attr('href');
					
					referralURL = options.logouturl + '?' + encodeURIComponent(options.refererName) + '=' + encodeURIComponent(currentReferral);
				} else {
					referralURL = options.logouturl + '?' + encodeURIComponent(options.refererName) + '=' + encodeURIComponent(options.referer);
				}
			} else {
				referralURL = options.logouturl;
			}

			return window.location = referralURL;
		};

		/**
		 * Initializes the plugin.
		 */
		return this.each(function () {
			init();
		});
	};

}(jQuery, document, window));



that is the js plugin code and in my cshtml i have a this section
$(document).userTimeout({
                logouturl: 'logout url',
                session: 600000 //// 10 Minutes in Milliseconds
            });

1 Ответов

Рейтинг:
1

F-ES Sitecore

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


Member 11471318

пожалуйста, помогите мне решить эту проблему..

F-ES Sitecore

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

Member 11471318

спасибо за ваши ценные комментарии,не могли бы Вы выбрать мне какое-нибудь другое решение.
я хочу реализовать тайм-аут сеанса, а после тайм-аута страница входа в систему должна быть видимой(mvc5).

F-ES Sitecore

Вы не можете, клиент не знает, когда истекло время сеанса.