Я хотел что-то, что полностью вывело управление полями из рук браузера. В этом примере есть одно стандартное поле ввода текста для ввода пароля - без адреса электронной почты, имени пользователя и т. Д. *
<input id='input_password' type='text' autocomplete='off' autofocus>
Есть переменная с именем "input", установленная как пустая строка ...
var input = "";
События поля контролируются JQuery ...
- В фокусе содержимое поля и связанная с ним переменная «input» всегда очищаются.
- При нажатии клавиш любой буквенно-цифровой символ, а также некоторые определенные символы добавляются к переменной «input», а поле ввода заменяется символом маркера. Кроме того, при нажатии клавиши Enter набранные символы (хранящиеся в переменной «input») отправляются на сервер через Ajax. (См. «Сведения о сервере» ниже.)
- При нажатии клавиш Home, End и Arrow клавиши «input» и значения полей сбрасываются. (Я мог бы привыкнуть к навигации по стрелкам и событию focus и использовать .selectionStart, чтобы выяснить, где пользователь щелкнул или осуществлял навигацию, но это не стоит усилий для поля пароля.) Кроме того, нажатие клавиши Backspace усекает оба переменная и содержимое поля соответственно.
$("#input_password").off().on("focus", function(event) {
$(this).val("");
input = "";
}).on("keypress", function(event) {
event.preventDefault();
if (event.key !== "Enter" && event.key.match(/^[0-9a-z!@#\$%&*-_]/)) {
$(this).val( $(this).val() + "•" );
input += event.key;
}
else if (event.key == "Enter") {
var params = {};
params.password = input;
$.post(SERVER_URL, params, function(data, status, ajax) {
location.reload();
});
}
}).on("keyup", function(event) {
var navigationKeys = ["Home", "End", "ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"];
if ($.inArray(event.key, navigationKeys) > -1) {
event.preventDefault();
$(this).val("");
input = "";
}
else if (event.key == "Backspace") {
var length = $(this).val().length - 1 > 0 ? $(this).val().length : 0;
input = input.substring(0, length);
}
});
Краткое описание фронта
По сути, это не дает браузеру ничего полезного для захвата. Даже если он отменяет настройку автозаполнения и / или отображает раскрывающийся список с ранее введенными значениями, все, что у него есть, - это маркеры, сохраненные для значения поля.
Сведения о сервере (дополнительное чтение)
Как показано выше, Javascript выполняет location.reload (), как только сервер возвращает ответ JSON. (Этот метод входа предназначен для доступа к ограниченному инструменту администрирования. Некоторые излишки, связанные с содержимым cookie, могут быть пропущены для более обобщенной реализации.) Вот подробности:
- Когда пользователь переходит на сайт, сервер ищет допустимый файл cookie.
- Если файлов cookie нет, отображается страница входа. Когда пользователь
вводит пароль и отправляется через Ajax, сервер подтверждает пароль, а также проверяет
чтобы увидеть, есть ли IP пользователя в списке авторизованных IP.
- Если пароль или IP-адрес не распознаны, сервер не создает файл cookie, поэтому при перезагрузке страницы пользователь видит ту же страницу входа.
- Если и пароль, и IP распознаны, сервер генерирует
файл cookie с десятиминутным сроком службы, в котором также хранятся два зашифрованных значения, соответствующих временным рамкам и IP-адресу.
- Когда страница перезагружается, сервер находит cookie и проверяет, что
скремблированные значения верны (т. е. период времени соответствует дате cookie и IP-адрес совпадает).
- Процесс проверки подлинности и обновления cookie повторяется каждый раз, когда пользователь взаимодействует с сервером, когда он входит в систему, отображает данные или обновляет запись.
- Если значения cookie всегда правильные, сервер представляет полный веб-сайт (если пользователь входит в систему) или выполняет запрос на отображение или обновление, который был отправлен.
- Если в любое время значения cookie неверны, сервер удаляет текущий cookie, который после перезагрузки вызывает страницу входа в систему.
повторно отображается.