«Я люблю писать код аутентификации и авторизации». Нет Java-разработчика. Надоело строить одни и те же экраны входа снова и снова? Попробуйте API Okta для размещенной аутентификации, авторизации и многофакторной аутентификации.
Развертывание приложений сложно. Часто вам нужен консольный доступ к серверу, с которого вы извлекаете последний код и затем вручную создаете экземпляр в своем контейнере. В этом руководстве вы увидите более простой способ использования Tomcat: вы создадите аутентифицированное веб-приложение и развернете его через браузер, используя последние версии Tomcat, Spring Boot и Java.
Начиная с версии 9, Oracle сократила частоту выпусков Java до шести месяцев, поэтому номера основных версий растут гораздо быстрее, чем раньше. Последним выпуском является Java SE 11 (Standard Edition), вышедшая в сентябре 2018 года. Самое большое изменение лицензий в этом новом выпуске привело к однозначному выводу: использовать OpenJDK с этого момента. Open JDK — это бесплатная версия Java, которую вы также можете получить от Oracle. Кроме того, Java 11 имеет долгосрочную поддержку, поэтому эту версию вы должны использовать для новых проектов в будущем.
Запустите приложение Java 11
Откройте консоль и запустите java -version чтобы увидеть, какую версию Java вы используете.
[karl@localhost demo]$ java -versionopenjdk version "1.8.0_111"OpenJDK Runtime Environment (build 1.8.0_111-b16)OpenJDK 64-Bit Server VM (build 25.111-b16, mixed mode)[karl@localhost demo]$ |
Java 8 показана как версия 1.8.0 .
SDKMAN — отличный инструмент для поддержания ваших библиотек разработки в актуальном состоянии. Чтобы установить его, запустите
|
|
Обратите внимание, что SDKMAN работает только в Linux и Unix-подобных системах. Пользователи Windows должны будут установить последнюю версию Java вручную .
Если SDKMAN установлен правильно, вы увидите инструкции по получению команды для работы в вашем текущем терминале.
All done!Please open a new terminal, or run the following in the existing one: source "/home/karl/.sdkman/bin/sdkman-init.sh"Then issue the following command: sdk helpEnjoy!!![karl@localhost demo] |
Запустите указанную source команду, и команда sdk должна быть активной.
Теперь установите последнюю sdk install java Java просто с sdk install java .
[karl@localhost demo]$ sdk install javaDownloading: java 11.0.2-openIn progress... |
После того, как java -version 11.0.2 должно 11.0.2 .
Done installing!Setting java 11.0.2-open as default.[karl@localhost demo]$ java -versionopenjdk version "11.0.2" 2019-01-15OpenJDK Runtime Environment 18.9 (build 11.0.2+9)OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)[karl@localhost demo]$ |
ПРИМЕЧАНИЕ: если у вас уже есть SDKMAN! и Java 11 установлена, вы можете установить ее по умолчанию, используя sdk default java 11.0.2-open .
Создайте проект Spring Boot для Tomcat
Самый популярный способ начать проект Spring с Spring Initializr

Перейдите к файлу start.spring.io в своем любимом веб-браузере, затем выберите параметры проекта:
- Оставьте как Maven, Java и последнюю стабильную версию Spring Boot (2.1.4)
- Измените группу и артефакт, если хотите
- Нажмите на Дополнительные параметры и выберите
Java 11 - В поле Зависимости введите и выберите
Web,SecurityиDevtools. Они должны отображаться как зависимости, выбранные справа
Теперь нажмите Generate Project, и zip-файл будет загружен вместе с проектом внутри. Просто разархивируйте и введите каталог из командной строки. Если вы увидите ls вы увидите пять файлов и один каталог ( src ).
[karl@m14x demo]$ lsHELP.md mvnw mvnw.cmd pom.xml src |
mvnw — это скрипт, который позволяет вам использовать Maven, не устанавливая его глобально. mvnw.cmd — версия этого скрипта для Windows. pom.xml описывает ваш проект, а src содержит ваш Java-код внутри. (Обратите внимание, что есть также скрытый каталог .mvn котором .mvn встроенные файлы maven!)
Давайте посмотрим, что делает проект. Введите ./mvnw spring-boot:run и нажмите ввод. Все может занять некоторое время для установки, но в конечном итоге вы должны увидеть что-то вроде этого:
Tomcat started on port(s): 8080 (http) with context path ''2019-03-17 19:56:49.342 INFO 10744 --- [ restartedMain] com.karl.demo.DemoApplication : Started DemoApplication in 3.022 seconds (JVM running for 3.56) |
Обратите внимание на сообщение Tomcat started on port(s): 8080 . Откройте окно браузера по http://localhost:8080 и вы должны увидеть страницу входа.

Вы можете аутентифицироваться, используя «user» для имени пользователя и пароля, который был напечатан на вашем терминале. После входа в систему вы увидите страницу с ошибкой 404, потому что вы не создали никакого кода для отображения целевой страницы в / .
Добавьте безопасную аутентификацию в приложение Spring Boot
Давайте добавим аутентификацию с Okta. Почему окта? Потому что вы не хотите беспокоиться об управлении своими пользователями и хэшировании их паролей, не так ли? Друзья не позволяют друзьям писать аутентификацию — пусть эксперты сделают это за вас! В конце концов, API Okta также построен на Java и Spring Boot!
После того, как вы зарегистрировали бесплатную учетную запись, перейдите в раздел Приложения на панели инструментов. Нажмите « Добавить приложение» , выберите « Интернет» и нажмите « Далее» .
Теперь вы должны быть на странице настроек приложения. Замените поле URI для перенаправления входа следующим:
http://localhost:8080/login/oauth2/code/okta |
Нажмите Готово внизу. Скопируйте свой идентификатор клиента и секрет клиента из раздела «Учетные данные клиента» и храните их в безопасном месте. Теперь прямо вверху щелкните вкладку API (рядом с Приложениями ) и затем Серверы авторизации . Запишите URI эмитента, который выглядит следующим образом:
https://{yourOktaDomain}/oauth2/default |
Создайте файл в своем проекте в src/main/resources/application.yml и поместите эти значения внутрь:
okta: oauth2: issuer: https://{yourOktaDomain}/oauth2/default client-id: {clientId} client-secret: {clientSecret} |
Теперь добавьте библиотеку Okta Spring Boot Starter в качестве зависимости в вашем pom.xml .
<dependency> <groupId>com.okta.spring</groupId> <artifactId>okta-spring-boot-starter</artifactId> <version>1.1.0</version></dependency> |
Теперь отредактируйте ваш основной файл ввода Java — который, вероятно, находится где-то вроде src/main/java/com/example/demo/DemoApplication.java — и добавьте аннотацию @RestController к классу, а также точку входа на домашней странице:
package com.example.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.security.core.Authentication;import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;@RestController@SpringBootApplicationpublic class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @GetMapping @ResponseBody public String currentUserName(Authentication authentication) { DefaultOidcUser userDetails = (DefaultOidcUser) authentication.getPrincipal(); return "Hello, " + userDetails.getFullName(); }} |
Перезапустите приложение, используя ./mvnw spring-boot:run или используйте свою IDE для его запуска.
Теперь, когда вы посещаете http://localhost:8080 вы должны увидеть экран входа Okta.

Как только вы введете данные подключенного пользователя Okta (вы можете использовать тот же логин, что и ваша учетная запись разработчика Okta здесь), вы должны увидеть приветственное сообщение с полным именем, которое вы ввели при регистрации:

Подсказка: выход из сеанса OAuth2 более нюансов, чем можно себе представить. Чтобы продолжить тестирование процесса входа в систему, я рекомендую использовать закрытые окна просмотра, чтобы обеспечить возврат экрана входа в систему; закройте их, когда вы закончите.
Остановите приложение Spring Boot, чтобы вы могли запустить Tomcat на порте по умолчанию 8080.
Настройте Tomcat 9 для приложения Spring Boot
Запуск Tomcat и запуск не может быть проще. Начните с загрузки двоичного файла, совместимого с вашей платформой. Убедитесь, что вы используете файл .zip или .tar.gz а не установщик. Извлеките его в папку и в каталоге bin запустите сценарий запуска — startup.sh для Linux / Mac и startup.bat для Windows.
[karl@m14x bin]$ ./startup.shUsing CATALINA_BASE: /home/karl/Downloads/apache-tomcat-9.0.19Using CATALINA_HOME: /home/karl/Downloads/apache-tomcat-9.0.19Using CATALINA_TMPDIR: /home/karl/Downloads/apache-tomcat-9.0.19/tempUsing JRE_HOME: /home/karl/.sdkman/candidates/java/currentUsing CLASSPATH: /home/karl/Downloads/apache-tomcat-9.0.19/bin/bootstrap.jar:/home/karl/Downloads/apache-tomcat-9.0.19/bin/tomcat-juli.jarTomcat started.[karl@m14x bin]$ |
Подсказка: вы также можете использовать ./catalina.sh run для запуска вашего приложения. Эта команда напечатает логи на ваш терминал, поэтому вам не нужно следить за ними, чтобы увидеть, что происходит.
Перейдите по http://localhost:8080 и вы должны увидеть страницу установки Tomcat.

Создайте WAR-файл из вашего проекта Spring Boot
Теперь вам нужно создать WAR-файл из вашего приложения Spring Boot. Добавьте следующее сразу после узла <description> в вашем pom.xml .
<packaging>war</packaging> |
Удалите встроенный сервер Tomcat, добавив в список зависимостей следующее:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope></dependency> |
Наконец, включите ваше приложение в качестве сервлета, расширив основной класс с помощью SpringBootServletInitializer :
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;@SpringBootApplicationpublic class DemoApplication extends SpringBootServletInitializer { ...} |
Теперь очистите и упакуйте свое приложение с помощью следующей команды:
./mvnw clean package |
Вы должны увидеть сообщение, подобное следующему:
[INFO] Building war: /home/karl/tst/demo/target/demo-0.0.1-SNAPSHOT.war |
Обратите внимание, где живет ваш новый .war .
Разверните WAR для Tomcat из браузера
Возможно, вы заметили, что с правой стороны экрана приветствия Tomcat было три кнопки: Состояние сервера , Приложение менеджера и Диспетчер хостов . Вы можете развернуть WAR-файл из приложения Manager, но для этого требуется аутентификация (и по умолчанию пользователи не определены).
Добавьте следующее в файл conf/tomcat-users.xml в каталоге Tomcat:
<user username="karl" password="secret" roles="manager-gui" /> |
Вам нужно будет перезапустить Tomcat, чтобы изменения вступили в силу. Поскольку вы начали это напрямую, вам нужно остановить процесс самостоятельно. Найдите идентификатор процесса с помощью ps aux | grep tomcat ps aux | grep tomcat .
[karl@m14x bin]$ ps aux | grep tomcatkarl 11813 180 1.9 7389172 159596 pts/0 Sl 09:44 0:07 /home/karl/.sdkman/candidates/java/current/bin/java -Djava.util.logging.config.file=/home/karl/Downloads/apache-tomcat-9.0.19/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/karl/Downloads/apache-tomcat-9.0.19/bin/bootstrap.jar:/home/karl/Downloads/apache-tomcat-9.0.19/bin/tomcat-juli.jar -Dcatalina.base=/home/karl/Downloads/apache-tomcat-9.0.19 -Dcatalina.home=/home/karl/Downloads/apache-tomcat-9.0.19 -Djava.io.tmpdir=/home/karl/Downloads/apache-tomcat-9.0.19/temp org.apache.catalina.startup.Bootstrap startkarl 11881 0.0 0.0 6268 2280 pts/0 S+ 09:44 0:00 grep tomcat[karl@m14x bin]$ |
Здесь мой идентификатор процесса — 11813. Используйте команду kill, чтобы убить его.
kill 11813 |
Перезагрузите сервер, используя startup.sh как и раньше. Когда вы нажимаете кнопку « Приложение менеджера», введенные выше данные пользователя должны открыть экран менеджера.

Прокрутите вниз до WAR-файла, чтобы развернуть раздел. Нажмите Обзор … и выберите файл WAR из ранее. Нажмите Развернуть .
Если вы прокрутите вверх, вы увидите что-то вроде /demo-0.0.1-SNAPSHOT указанное в разделе « Приложения ». Нажмите здесь, чтобы перейти на http://localhost:8080/demo-0.0.1-SNAPSHOT откуда Tomcat обслуживает наше приложение. Вы увидите ошибку Bad Request.

Это связано с тем, что URL-адрес перенаправления теперь неверен в нашей конфигурации приложения Okta — все должно начинаться с demo-0.0.1-SNAPSHOT . Это имя немного громоздко. Чтобы изменить его, переименуйте ваш WAR-файл в demo.war (вы можете сделать это навсегда, добавив <finalName>demo</finalName> в раздел сборки вашего pom.xml ). Теперь нажмите Undeploy рядом с именем вашего приложения в окне менеджера и повторно разверните WAR. Теперь приложение должно быть в /demo .
Теперь в настройках приложения Okta добавьте все URL-адреса с помощью /demo , например, http://localhost:8080/demo/login/oauth2/code/okta (вы делаете это, нажимая Edit, а затем Save ). Теперь, нажав на ваше /demo приложение в менеджере (или перейдя по http://localhost:8080/demo ), вы увидите экран приветствия, как и раньше.
Совет: чтобы убедиться, что ваши локальные настройки разработки соответствуют машине, на которой вы развертываете, убедитесь, что встроенная версия Tomcat совпадает с вашим внешним сервером, добавив следующее в ваш pom.xml :
<properties> <tomcat.version>9.0.19</tomcat.version></properties> |
Узнайте больше о Tomcat, Spring Boot и Java 11
Отлично, вы удаленно развернули приложение Spring Boot 2.1 в Tomcat 9, все с поддержкой Java 11!
Надеюсь, вы нашли этот урок полезным. Вы можете найти репозиторий GitHub для этого примера в oktadeveloper / okta-spring-boot-tomcat-example .
Проверьте некоторые из этих ссылок ниже для получения дополнительной информации:
- i18n в Java 11, Spring Boot и JavaScript
- Spring Boot 2.1: выдающаяся поддержка OIDC, OAuth 2.0 и Reactive API
- Перенесите приложение Spring Boot на новейшую и лучшую Spring Security и OAuth 2.0
- Создавайте реактивные API с помощью Spring WebFlux
- Создайте реактивное приложение с помощью Spring Boot и MongoDB
- Baeldung Как развернуть файл WAR в Tomcat
Как то, что вы узнали сегодня? Подпишитесь на нас в Twitter и подпишитесь на наш канал на YouTube .
«Развертывание приложения Spring Boot в Tomcat» первоначально было опубликовано в блоге разработчиков Okta 16 апреля 2019 года.
«Я люблю писать код аутентификации и авторизации». Нет Java-разработчика. Надоело строить одни и те же экраны входа снова и снова? Попробуйте API Okta для размещенной аутентификации, авторизации и многофакторной аутентификации.