Функция единого входа все еще очень важна в фактических сценариях применения. Логически, мы не позволяем пользователю выполнять две операции одновременно. Давайте узнаем об отдельной реализации SpringMVC.
Перехватчик SpringMVC отличается от перехватчика Spring. Springmvc имеет единый входной диспетчер. Все запросы проходят через DispatcherServlet, поэтому вам нужно только суетиться на диспетчерсе. У диспетчериста не есть прокси, а контроллер, управляемый SpringMVC, не имеет прокси.
1. Сначала изучите основной принцип реализации: эта функция относительно проста, то есть только один пользователь может работать в одном и том же веб -проекте одновременно, поэтому здесь есть обнаружение удаленного входа, и здесь представлены два пути. 1. Сервер обнаруживает, что пользователь регистрации снова выполнил операцию входа через другой IP, а затем активно нажимает напоминание, чтобы сообщить первому пользователю войти в систему дистанционного входа; 2. Когда пользователь выполняет операции, он обнаруживает, что его учетная запись была выдана, и есть удаленный логин. Что касается этих двух решений, то первое большее время в режиме реального времени, но все еще изучается. Давайте сосредоточимся на втором методе ниже.
2. Реализация второго типа относительно проста. Есть две операции. Одним из них является добавление дополнительного поля в сеанс пользователя для хранения зарегистрированного пользователя SessionID, поскольку каждый запрос на запрос соответствует уникальному не повторному сеансу. Затем, используя технологию Interceptor, перехватывает операции пользователя. В перехватчике соответствующий запрос URL -адреса на странице входа в систему сначала выпущен, а другой - это запрос на проверку входа в систему. Наконец, отфильтруйте пользователя. (О входе в систему пользователя, когда проверка является успешной, не только должен храниться пользователь в сеансе для проверки перехвата входа в систему, но и идентификатор сеанса необходимо хранить в соответствующем сеансе в таблице пользователей.) Для запроса на этот раз вы можете получить сеанс и его идентификатор, а затем сравнить, то же самое с SessionID в базе данных в соответствии с этим идентификатором, а затем пройти его идентификатор. Если разница в том, что в автономном логике прыжка будет предложено прыгать в вход в систему, потому что в операции пользовательского сервера подключения будет сеанс. Пока сеанс истекает, идентификатор сеанса каждой инициированной пользователем операции одинаковы, поэтому он будет соответствовать идентификатору, хранящемуся в базе данных при входе в систему. Когда кто -то еще проходит через другие устройства, используйте ту же учетную запись для ввода. Сеанс будет восстановлен во время входа в систему. Сеанс в базе данных будет обновлять SessionID в базе данных, но SessionID все еще остается неизменным. Однако сеанс в базе данных изменился. Следовательно, при проверке SessionID в базе данных согласуется в перехватчике, он не может перехватить операцию пользователя для достижения функции входа в одно пользователь. (Примечание о сеансе, когда пользователь сначала подключается к серверу, на стороне сервера будет создан сеанс, а затем каждая операция, инициированная пользователем, будет нести идентификатор этого сеанса, и некоторые ситуации будут происходить.
Ниже приводится реализация перехватчика в Springmvc
Общедоступный класс MountuserInterceptor реализует HandlerInterceptor {@AutowireDPrivate USERMAPPER Mapper; Public Void Aftercomplotion (httpservletRequest arg0, httpservletresponse arg1, объект Arg2, исключение Arg3), бросает исключение {// todo Auto-Generated STUB} public Posthandle (httpests., {// todo Auto-Generated STUB} public voidslemervlecgle {// todo Auto-Generated STUB} voidslepslets. Httpservlectresponse arg1, object arg2, modelandview arg3) выбрасывает исключение {// todo Автогенерированный метод stub} public boolean prehandle (httpservletrequest arg0, httpservletresponse arg1, agard arg2) execution {string url = arg0.getrequesture (); if (url.indexof ("login.jsp")> = 0 || url.indexof ("new/login")> = 0 || url.indexof ("checkuser")> = 0) {return true;} // Если имя пользователя существует (то есть, логин и выпуск) integer = (integer). arg0.getSession (). getAttribute ("user"); if (user! = null) {string sessionId = mapper.getUserentity (integer.valueof (user)). getseSsionId (); if (sessionId.equals (arg0.getSession (). getId ()) {return True;} else {arg1.setStatus (arg1.sc_gateway_timeout); arg1.setContentType ("text/html; charset = utf-8"); printwriter out = arg1.getwriter (); out.println ("html>"); out.println ("<cript>"); В другом месте вы вынуждены уйти в автономном режиме «)»); out.println ("window.open ('" + arg0.getContextPath () + "/new/login''top' );;; rogeNtextPath () +" /new/login','_top');"); cout.println("</script>"); out.println("</html>; arg0.getRequestDispatcher ("login.jsp").Приведенный выше код может реализовать функцию первого пользователя, зарегистрированного в зарегистрировании, сжимается из строки, когда один и тот же пользователь вводит несколько раз. Он может реализовать функцию побуждения учетной записи для удаленного входа в систему, а затем прыгать на страницу входа в систему. Здесь нам нужно объяснить ключевые моменты этой простой функции приглашения на опове. Если это предупреждение должно появиться, оно должно быть в состоянии закончить запрос. Затем функция печати ответов выводит оператор приглашения Alert, поэтому комментированный оператор Jump не может существовать. Если есть заявление о приглашении на оповещение, не будет выпущено, потому что ваша операция не заканчивается правильно, но перенаправлена или перенаправлена на другие операции. Будь то правильное или нет, он будет выходить из других действий на страницу, поэтому ваш оператор печати ответа не будет отображаться. Таким образом, правильным способом: запрос перехвата не выпущен (returnFalse), и запрос по -прежнему является исходным запросом и не будет прыгать. Информация о печати ответа обратно на страницу может быть отображена. Что касается прыжка на страницу входа в систему, вы можете использовать: out.println ("window.open ('"+arg0.getContextPath ()+"/new/login', '_ top');"); Чтобы реализовать, что запрос на действие выполняется в разделе вывода JS с помощью ответа, указывая на страницу входа в систему.
Приведенный выше код в основном рассматривался как единая функция входа в систему, но вы обнаружите, что операция запроса AJAX не указывает на страницу входа в систему при входе в удаленное местоположение, и информации не существует. Позвольте мне в первую очередь объяснить причину, потому что ваш Ajax делает асинхронный запрос, а запрошенный URL также соответствует Mapper процессора, поэтому он будет рассматриваться как успешный запрос (код состояния возврата - 200). Заявление JS, напечатанное в вышеуказанном ответе, станет успешным запросом в успехе и возвратной стоимости. Вы можете попытаться прокомментировать вышеуказанное предложение: arg1.setStatus (arg1.sc_gateway_timeout); В настоящее время необходимо выполнить некоторые другие операции. Первым является утверждение arg1.setStatus (arg1.sc_gateway_timeout); Его функция состоит в том, чтобы установить код состояния, возвращаемый ответом. Приведенные выше настройки указывают, что код состояния 504 будет возвращен для представления ошибки запроса. В настоящее время запрос AJAX больше не будет отвечать в методе успеха, но ответит на метод ошибки AJAX. Поэтому вам нужно только выполнить соответствующий метод в ошибке AJAX, например:
$ .ajax ({url: 'new/msd2', success: function (a) {alert (a);}, ошибка: function (rs) {if (rs.status == 504) {document.write (rs.responsetext);}}});Когда запрос AJAX перехвачен из -за удаленного входа в систему, установите arg1.setStatus (arg1.sc_gateway_timeout); Состояние возврата запроса может быть изменено на 504. Затем метод ошибки отвечает. Когда определяется, что статус - это установленное вами код состояния, document.write (rs.responsetextext); Ответтексте - это оператор JS, напечатанный на стойке регистрации в перехватчике. Для выполнения этих утверждений документ.write (); Метод должен написать код в DOM, чтобы он вступил в силу. На этом этапе были реализованы все запросы и единый вход для асинхронных запросов AJAX.
Оставьте эту статью только для того, чтобы записать ключевой код, идеи и принципы операций
Суммировать
Выше приведенное дело о реализации единого входа в SpringMVC Interceptor, я надеюсь, что это будет полезно для всех. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте.