Вход в Spring Web App - обработка ошибок и локализация

Вход в Spring Web App - обработка ошибок и локализация

1. обзор

В этой статье мы покажем, как реализоватьa simple Login Page с помощью Spring MVC для приложения, которое обрабатывает аутентификацию с помощью Spring Security в бэкэнде.

Для получения полной информации о том, как обрабатывать вход в систему с помощью Spring Security,here’s the articleподробно описывает настройку и реализацию этого.

2. Страница входа в систему

Начнем с определенияa very simple login page:




   

Login

User:
Password:

Теперь давайте включим проверку на стороне клиента, чтобы убедиться, чтоusername иpassword были введены, прежде чем мы даже отправим форму. В этом примере мы будем использовать простой Javascript, но JQuery также является отличным вариантом:

Как видите, мы просто проверяем, пусты ли поляusername илиpassword; если они есть - появится окно сообщения javascript с соответствующим сообщением.

3. Локализация сообщений

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

  1. Сгенерированные сообщенияbefore форма обрабатывается контроллерами или обработчиками Spring. На эти сообщения можно ссылаться на страницах JSP, и они локализуются с помощьюJsp/Jslt localization (см. Раздел 4.3.)

  2. Сообщения, которые локализуются после того, как страница была отправлена ​​для обработки Spring (после отправки формыlogin); эти сообщения локализуются с помощьюSpring MVC localization (см. раздел 4.2.)

3.1. Файлыmessage.properties

В любом случае нам нужно создать файлmessage.properties для каждого языка, который мы хотим поддерживать; имена файлов должны соответствовать этому соглашению:messages [localeCode] .properties_.

Например, если мы хотим поддерживать сообщения об ошибках на английском и испанском языках, у нас будут файлы:messages_en.properties иmessages_es_ES.properties. Обратите внимание, что для английского языка также действуетmessages.properties.

Мы собираемся поместить эти два файла в путь к классам проекта (src/main/resources). Файлы просто содержат коды ошибок и сообщения, которые мы должны отображать на разных языках, например:

message.username=Username required
message.password=Password required
message.unauth=Unauthorized access!!
message.badCredentials=Invalid username or password
message.sessionExpired=Session timed out
message.logoutError=Sorry, error login out
message.logoutSucc=You logged out successfully

3.2. Настройка локализации Spring MVC

Spring MVC предоставляетLocaleResolver, который работает вместе с его APILocaleChangeInterceptor, чтобы сделать возможным отображение сообщений на разных языках, в зависимости от настройки локали. Чтобы настроить локализацию - нам нужно определить следующие bean-компоненты в нашей конфигурации MVC:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
    localeChangeInterceptor.setParamName("lang");
    registry.addInterceptor(localeChangeInterceptor);
}
@Bean
public LocaleResolver localeResolver() {
    CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
    return cookieLocaleResolver;
}
@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource =
      new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("classpath:messages");
    messageSource.setUseCodeAsDefaultMessage(true);
    messageSource.setDefaultEncoding("UTF-8");
    messageSource.setCacheSeconds(0);
    return messageSource;
}

Одно важное и более сложное замечание: нам нужно убедиться, чтоthe messageSource bean is defined in the right Spring context - контекст, в котором он будет использоваться. Имейте в виду, что веб-приложение имеет корневой контекст, а затем оно имеет один (или более) контекстов сервлета.

По умолчанию распознаватель локали получает код локали из заголовка HTTP. Чтобы установить языковой стандарт по умолчанию, нам нужно установить его наlocaleResolver():

@Bean
public LocaleResolver localeResolver() {
    CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
    cookieLocaleResolver.setDefaultLocale(Locale.ENGLISH);
    return cookieLocaleResolver;
}

Этим преобразователем языкового стандарта являетсяCookieLocaleResolver, что означает, что он хранит информацию о языковом стандарте в файле cookie на стороне клиента; как таковой - он будет запоминать региональные параметры пользователя при каждом входе в систему и в течение всего посещения.

В качестве альтернативы естьSessionLocaleResolver, который запоминает локаль на протяжении всего сеанса. Чтобы использовать этотLocaleResolver вместо этого, нам нужно заменить вышеуказанный метод следующим:

@Bean
public LocaleResolver localeResolver() {
    SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
    return sessionLocaleResolver;
}

Наконец, обратите внимание, чтоLocaleChangeInterceptor изменит языковой стандарт в зависимости от значения параметраlang, отправленного со страницей входа по простым ссылкам:

3.3. JSP/JSLT Localization

JSP/JSLT API will be used to display localized messages that are caught in the jsp page itself. Чтобы использовать библиотеки локализации jsp, мы должны добавить вpom.xml следующие зависимости:


    javax.servlet.jsp
    javax.servlet.jsp-api
    2.3.2-b01


    javax.servlet
    jstl
    1.2

4. Отображение сообщений об ошибках

4.1. Ошибки проверки входа

Чтобы использовать поддержку JSP / JSTL и отображать локализованные сообщения вlogin.jsp, можно реализовать следующие изменения на странице:

1. Добавьте следующий элемент тега lib вlogin.jsp:

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

2. Добавьте элемент jsp / jslt, который будет указывать на файлыmessages.properties:

3. Добавьте следующие элементы<fmt:…> для хранения сообщений в переменных jsp:


4. Измените сценарий проверки входа в систему, который мы видели в Разделе 3, чтобы локализовать сообщения об ошибках:

4.2. Ошибки перед входом в систему

Иногда странице входа будет передан параметр ошибки, если предыдущая операция не удалась. Например, кнопка отправки формы регистрации загрузит страницу входа. Если регистрация прошла успешно, было бы неплохо показать сообщение об успешном завершении в форме входа в систему и сообщение об ошибке, если обратное было верным.

В приведенном ниже примере формыlogin мы реализуем это путем перехвата и параметровregSucc иregError и отображения локализованного сообщения на основе их значений.


    

4.3. Ошибки безопасности входа

В случае сбоя процесса входа в систему по какой-либо причине Spring Security выполнит перенаправление на URL-адрес ошибки входа, который мы определили как/login.html?error=true.

Итак, аналогично тому, как мы показали статус регистрации на странице, мы должны сделать то же самое в случае проблемы с входом:


    

Обратите внимание, что мы используем элемент<spring:message …>. Это означает, что сообщения об ошибках генерируются во время обработки Spring MVC.

Полную страницу входа, включая проверку js и эти дополнительные сообщения о статусе, можно найти вgithub project.

4.4. Ошибки выхода

В следующем примере код jsp<c:if test=”$\{not empty SPRING_SECURITY_LAST_EXCEPTION}”> на страницеlogout.html проверяет, не произошла ли ошибка в процессе выхода.

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

Давайте посмотрим на полныйlogout.jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="sec"
    uri="http://www.springframework.org/security/tags"%>
<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>

    
Logged Out Login

Обратите внимание, что страница выхода также считывает параметр строки запросаlogSucc, и если его значение равноtrue, будет отображено локализованное сообщение об успешном выполнении.

5. Конфигурация безопасности Spring

В этой статье основное внимание уделяется внешнему интерфейсу процесса входа в систему, а не внутреннему интерфейсу, поэтому мы лишь кратко рассмотрим основные моменты настройки безопасности; для полной конфигурации вы должны прочитатьprevious article.

5.1. Перенаправление на URL-адрес ошибки входа

Следующая директива в элементе<form-login…/> направляет поток приложения на URL-адрес, где будет обрабатываться ошибка входа в систему:

authentication-failure-url="/login.html?error=true"

5.2. Перенаправление успешного выхода из системы

Атрибутlogout-success-url просто перенаправляет на страницу выхода с параметром, который подтверждает, что выход был успешным.

6. Заключение

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

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