Jetty (также известный как Eclipse Jetty) — это веб-сервер и механизм сервлетов на основе Java. Это открытый исходный код, хорошо масштабируемый и поддерживает многие протоколы, такие как HTTP / 2 и WebSockets. Jetty является заменой Tomcat и может использоваться как встроенный, так и автономный при размещении приложений Java.
Как правило, для публикации веб-приложений на Java необходимо запустить отдельный веб-сервер, но приложения Spring Boot создаются со встроенными веб-серверами. Это означает, что код приложения встроен в сервер. Вы можете отделить контейнер сервлетов Jetty или Tomcat (стиль сервера приложений старой школы), опубликовав файл WAR с небольшой реализацией. Tomcat используется в Spring по умолчанию, но вы можете легко это изменить, как вы увидите.
В этом руководстве вы создадите простой веб-сервис со встроенной Jetty. После этого вы создадите один и тот же веб-сервис в Spring Boot и Jetty. Наконец, вы добавите аутентификацию и авторизацию JWT (JSON Web Token) к веб-сервису, используя безопасность на уровне методов с Okta в качестве поставщика OAuth / OIDC.
Вам также может понравиться:
Создание веб-службы REST с помощью Java и Spring (часть 1)
Установите зависимости проекта
Вам нужно будет установить несколько вещей, прежде чем начать.
Java 11: этот проект использует Java 11. Если у вас нет Java 11, вы можете установить OpenJDK . Вы также можете установить OpenJDK, используя Homebrew . SDKMAN — еще один отличный вариант для установки и управления Java SDK.
HTTPie: это простая утилита командной строки для выполнения HTTP-запросов. Вы будете использовать это для тестирования приложения REST. Ознакомьтесь с инструкциями по установке на их сайте .
Учетная запись разработчика Okta : вы будете использовать Okta в качестве поставщика OAuth / OIDC для добавления аутентификации и авторизации JWT в приложение. Зайдите на их сайт и зарегистрируйте один из их бесплатных аккаунтов разработчиков, если вы этого еще не сделали.
Gradle: это необязательная установка. Если вы загрузите проект для этого руководства из репозитория, вы можете запустить проект с помощью оболочки Gradle и не нужно устанавливать Gradle. Если вы хотите построить проект с нуля, вам нужно установить Gradle .
Создайте простой веб-сервис с Java и Jetty
Первым шагом в этом руководстве является создание простого веб-сервиса с использованием Java и Gradle. Для этого вы будете использовать плагин Gretty для Gradle . Gretty упрощает запуск веб-приложений на встроенных контейнерах сервлетов с использованием Gradle и поддерживает как Tomcat, так и Jetty.
Если вы решите загрузить проект для этого учебника из репозитория GitHub , просто выполните следующие несколько шагов, пока я объясняю, как создать проект с нуля.
Джава
xxxxxxxxxx
1
git clone https://github.com/oktadeveloper/okta-spring-boot-jetty-example.git
Сначала откройте оболочку и перейдите в соответствующий каталог (или создайте его), в котором вы хотите разместить проект. Инициализируйте проект, используя Gradle CLI.
Джава
xxxxxxxxxx
1
mkdir jetty
2
cd jetty
3
gradle init --type=basic --dsl=groovy --project-name=JettyEmbedded
Отредактируйте build.gradle
файл в корневом каталоге проекта:
Джава
xxxxxxxxxx
1
plugins {
2
id 'java'
3
id 'war'
4
id 'org.gretty' version '2.3.1'
5
}
6
7
repositories {
8
jcenter()
9
}
10
11
dependencies {
12
providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
13
}
14
15
gretty {
16
contextPath = '/'
17
}
Я хочу указать на несколько вещей здесь. Обратите внимание на org.gretty
плагин в plugins
блоке. Также обратите внимание на javax.servlet:javax.servlet-api
зависимость, которую вы добавили providedCompile
. Это добавляет его в путь к классам компиляции, но не добавляет его в упакованный файл war, поскольку это будет предоставлено контейнером сервлета при его развертывании. Наконец, обратите внимание, что контекстный путь для встроенного контейнера сервлета был установлен как root в gretty
блоке.
Теперь создайте корневой каталог для файлов Java ( src/main/java
это стандартная корневая папка Java плюс com.okta.jettyembedded
пакет):
Джава
xxxxxxxxxx
1
mkdir -p src/main/java/com/okta/jettyembedded
Создайте простой сервлет:
src/main/java/com/okta/jettyembedded/Hello.java
Джава
xxxxxxxxxx
1
package com.okta.jettyembedded;
2
3
import javax.servlet.ServletException;
4
import javax.servlet.annotation.WebServlet;
5
import javax.servlet.http.HttpServlet;
6
import javax.servlet.http.HttpServletRequest;
7
import javax.servlet.http.HttpServletResponse;
8
import java.io.IOException;
9
10
name = "HelloServlet", urlPatterns = {"hello"}, loadOnStartup = 1) (
11
public class Hello extends HttpServlet {
12
13
protected void doGet(HttpServletRequest request, HttpServletResponse response)
14
throws ServletException, IOException {
15
response.getWriter().print("Howdy");
16
}
17
18
}
Теперь вы можете запустить приложение:
Джава
xxxxxxxxxx
1
gradlew apprun
Чтобы проверить это, откройте другое окно оболочки и используйте HTTPie:
Джава
xxxxxxxxxx
1
http :8080/hello
Джава
xxxxxxxxxx
1
HTTP/1.1 200 OK
2
Content-Length: 5
3
Date: Fri, 06 Sep 2019 20:23:40 GMT
4
Server: Jetty(9.2.26.v20180806)
5
6
Howdy
Вы создали очень простой веб-сервлет. Это пока мало что делает, но работает (надеюсь). Обратите внимание на @WebServlet
аннотацию в Hello.java
классе. Здесь вы можете настроить некоторые параметры сервлета, а не в web.xml
файле. Перемещение этой конфигурации в код облегчает создание и поддержку некоторых конфигураций сервлета.
Далее вы познакомитесь с более полнофункциональным веб-сервлетом.
Улучшение сервлета Java с добавлением и удалением
Теперь вы создадите веб-приложение для отслеживания списка походов. Он продемонстрирует, как поддерживать операции POST и DELETE, а также простые GET и некоторую простую обработку ошибок.
Создайте новый файл Java:
src/main/java/com/okta/jettyembedded/HikesTodoServlet.java
Джава
xxxxxxxxxx
1
package com.okta.jettyembedded;
2
3
import java.io.IOException;
4
import javax.servlet.annotation.WebServlet;
5
import javax.servlet.http.HttpServlet;
6
import javax.servlet.http.HttpServletRequest;
7
import javax.servlet.http.HttpServletResponse;
8
import java.util.ArrayList;
9
import java.util.Arrays;
10
import java.util.List;
11
12
name = "HikesTodoServlet", urlPatterns = {"hikes"}, loadOnStartup = 1) (
13
public class HikesTodoServlet extends HttpServlet {
14
15
// Not synchronized
16
private List<String> hikes = new ArrayList<>(Arrays.asList(
17
"Wonderland Trail", "South Maroon Peak", "Tour du Mont Blanc",
18
"Teton Crest Trail", "Everest Base Camp via Cho La Pass", "Kesugi Ridge"
19
));
20
21
protected void doGet(HttpServletRequest request, HttpServletResponse response)
22
throws IOException {
23
response.getWriter().print(String.join("\n", this.hikes));
24
}
25
26
protected void doPost(HttpServletRequest request, HttpServletResponse response)
27
throws IOException {
28
String hike = request.getParameter("hike");
29
if (hike == null) {
30
response.setStatus(400);
31
response.getWriter().print("Param 'hike' cannot be null.");
32
}
33
else if (this.hikes.contains(hike)) {
34
response.setStatus(400);
35
response.getWriter().print("The hike '"+hike+"' already exists.");
36
}
37
else {
38
this.hikes.add(hike);
39
response.getWriter().print(String.join("\n", this.hikes));
40
}
41
}
42
43
protected void doDelete(HttpServletRequest request, HttpServletResponse response)
44
throws IOException {
45
String hike = request.getParameter("hike");
46
if (hike == null) {
47
response.setStatus(400);
48
response.getWriter().print("Param 'hike' cannot be null.");
49
}
50
else {
51
this.hikes.remove(hike);
52
response.getWriter().print(String.join("\n", this.hikes));
53
}
54
}
55
56
}
Используйте, Control-C
чтобы остановить сервер и перезапустить его gradle apprun
.
ПОЛУЧИТЕ список походов:
Джава
xxxxxxxxxx
1
HTTP/1.1 200 OK
2
Content-Length: 5
3
Date: Fri, 06 Sep 2019 20:23:40 GMT
4
Server: Jetty(9.2.26.v20180806)
5
6
Howdy
Джава
xxxxxxxxxx
1
HTTP/1.1 200 OK
2
...
3
4
Wonderland Trail
5
South Maroon Peak
6
Tour du Mont Blanc
7
Teton Crest Trail
8
Everest Base Camp via Cho La Pass
9
Kesugi Ridge
ПОСТ новый поход:
Джава
xxxxxxxxxx
1
http -f POST :8080/hikes hike="Pear Lake"
Джава
xxxxxxxxxx
1
HTTP/1.1 200 OK
2
...
3
4
Wonderland Trail
5
South Maroon Peak
6
Tour du Mont Blanc
7
Teton Crest Trail
8
Everest Base Camp via Cho La Pass
9
Kesugi Ridge
10
Pear Lake
УДАЛИТЬ поход
Джава
xxxxxxxxxx
1
http DELETE :8080/hikes hike=="South Maroon Peak"
Джава
xxxxxxxxxx
1
HTTP/1.1 200 OK
2
...
3
4
Wonderland Trail
5
Tour du Mont Blanc
6
Teton Crest Trail
7
Everest Base Camp via Cho La Pass
8
Kesugi Ridge
9
Pear Lake
Теперь попробуйте удалить несуществующий поход или отправить пустое значение:
Джава
xxxxxxxxxx
1
http DELETE :8080/hikes
Джава
xxxxxxxxxx
1
HTTP/1.1 400 Bad Request
2
...
3
4
Param 'hike' cannot be null.
Чтобы развернуть это на gradle apprun
работающем сервере, вы можете просто развернуть проект, который используется для запуска приложения с использованием встроенного сервера Jetty. Вы также можете развернуть его на внешнем сервере Jetty, создав файл war, используя gradle war
и скопировав файл war (найденный в build/libs
) на свой сервер.
ПРИМЕЧАНИЕ: это очень наивная реализация службы REST. Он использует оперативную память
ArrayList
в качестве источника данных, который не синхронизирован (и, следовательно, может столкнуться с проблемами многопоточности в реальном веб-сервлете). Для чего-либо, выходящего за рамки этого учебника, вам нужно реализовать какой-нибудь серверный бэкэнд. Для получения справки о том, как это сделать, см. Примеры сообщений в блогах, перечисленных в конце учебника. Обычно вы также добавляете конечную точку PUT и назначаете каждому элементу идентификатор для использования в качестве индекса, чтобы данные можно было обновлять, но это выходит за рамки данного руководства.
Пока что дела идут отлично. В следующем разделе вы заново создадите то же приложение Hikes ToDo, используя Spring Boot, с помощью JWT, для аутентификации токена приложения, используя Okta в качестве поставщика OAuth / OIDC.
Создать приложение OIDC
Теперь давайте немного отправимся в Okta и настроим OAuth / OpenID Connect (OIDC). Вместе они представляют собой набор открытых стандартов для реализации безопасной авторизации и аутентификации. В этом руководстве Okta будет выступать в роли поставщика удостоверений, а ваше приложение Spring Boot станет клиентом.
Вы уже должны были подписаться на бесплатную учетную запись разработчика в Okta. Перейдите на панель инструментов разработчика по адресу https://developer.okta.com . Если вы входите в систему впервые, вам может потребоваться нажать кнопку «Администратор».
Для настройки аутентификации и авторизации JWT необходимо создать приложение OIDC.
В верхнем меню нажмите кнопку «Приложение». Нажмите кнопку Добавить приложение.
Выберите тип приложения Web.
Нажмите «Далее.
Дайте приложению имя. Я назвал мой «Пружинная пристань».
В разделе URI перенаправления входа в систему добавьте два новых URI:
https://oidcdebugger.com/debug
http://localhost:8080/login/oauth2/code/okta
В разделе Разрешенные типы разрешений установите флажок Неявный (Гибридный).
Остальные значения по умолчанию будут работать.
Нажмите Готово.
Оставьте страницу открытой или запишите идентификатор клиента. Он понадобится вам немного позже, когда вы создадите токен.
ПРИМЕЧАНИЕ. Вы будете использовать URI перенаправления oidcdebugger.com и неявный тип предоставления для создания токена доступа, который вы можете использовать из командной строки с HTTPie. Второй URI является URI перенаправления по умолчанию, который Spring Security использует для Okta при использовании своей функции входа OAuth.
Создать проект Spring Boot с Jetty
Для создания проекта Spring Boot вы будете использовать Spring Initializr . Проверьте его проект GitHub, чтобы увидеть его код. Initializr имеет хорошую веб-форму для настройки и загрузки начальных проектов Spring Boot, но для этого проекта вы будете использовать его REST API.
Из оболочки выполните следующую команду, чтобы загрузить zip-файл настроенного начального проекта.
Джава
xxxxxxxxxx
1
http https://start.spring.io/starter.zip \
2
javaVersion==11 \
3
dependencies==web \
4
language==java \
5
type==gradle-project \
6
name==SpringBootJetty \
7
groupId==com.okta.springbootjetty \
8
artifactId==SpringBootJetty \
9
packageName==com.okta.springbootjetty -o SpringBootJetty.zip
Разархивируйте загруженный файл и откройте каталог в IDE по вашему выбору.
Сначала измените build.gradle
файл, чтобы проект использовал встроенный в Jetty контейнер вместо Tomcat по умолчанию. Добавьте spring-boot-starter-jetty
зависимость и исключите spring-boot-starter-tomcat
зависимость.
Измените build.gradle
файл, чтобы он соответствовал следующему:
Джава
xxxxxxxxxx
1
plugins {
2
id 'org.springframework.boot' version '2.2.0.RELEASE'
3
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
4
id 'java'
5
}
6
7
group = 'com.okta.springbootjetty'
8
version = '0.0.1-SNAPSHOT'
9
sourceCompatibility = '11'
10
11
repositories {
12
mavenCentral()
13
}
14
15
dependencies {
16
implementation 'org.springframework.boot:spring-boot-starter-web'
17
implementation 'org.springframework.boot:spring-boot-starter-jetty'
18
testImplementation('org.springframework.boot:spring-boot-starter-test') {
19
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
20
}
21
}
22
23
test {
24
useJUnitPlatform()
25
}
26
27
28
configurations {
29
compile.exclude module: "spring-boot-starter-tomcat"
30
}
Теперь добавьте WebController.java
файл.
src/main/java/com/okta/springbootjetty/WebController.java
Джава
xxxxxxxxxx
1
package com.okta.springbootjetty;
2
3
import org.springframework.stereotype.Controller;
4
import org.springframework.web.bind.annotation.*;
5
6
import javax.servlet.http.HttpServletResponse;
7
import java.util.ArrayList;
8
import java.util.Arrays;
9
import java.util.List;
10
11
12
public class WebController {
13
14
private List<String> hikes = new ArrayList<>(Arrays.asList(
15
"Wonderland Trail", "South Maroon Peak", "Tour du Mont Blanc",
16
"Teton Crest Trail", "Everest Base Camp via Cho La Pass", "Kesugi Ridge"
17
));
18
19
"/") (
20
21
public String indexGet() {
22
return String.join("\n", this.hikes);
23
}
24
25
"/") (
26
27
public String indexPost( String hike, HttpServletResponse response) {
28
if (hike == null) {
29
response.setStatus(400);
30
return "Param 'hike' cannot be null.";
31
}
32
else if (this.hikes.contains(hike)) {
33
response.setStatus(400);
34
return "The hike '"+hike+"' already exists.";
35
}
36
else {
37
this.hikes.add(hike);
38
return String.join("\n", this.hikes);
39
}
40
}
41
42
"/") (
43
44
public String indexDelete( String hike, HttpServletResponse response) {
45
if (hike == null) {
46
response.setStatus(400);
47
return "Param 'hike' cannot be null.";
48
}
49
else {
50
this.hikes.remove(hike);
51
return String.join("\n", this.hikes);
52
}
53
}
54
55
}
Этот контроллер воссоздает ту же функциональность, что и в первом приложении Jetty Hikes ToDo, но теперь с Spring Boot. Вы заметите, что Spring упростил некоторые синтаксисы. @ResponseBody
Аннотацию говорит Spring Загрузочный контроллер возвращает тело ответа напрямую (а не возвращали имя шаблона). Кроме того, обратите внимание, что код использует внедрение зависимостей, чтобы получить HttpServletResponse
параметры запроса и параметры.
Запустите службу Spring Boot REST (убедитесь, что другая ваша служба остановлена, или вы получите ошибку конфликта портов):
Джава
xxxxxxxxxx
1
gradle bootRun
Из второго окна оболочки ПОЛУЧИТЕ список походов (обратите внимание, что /hikes
ниже пути нет ).
Джава
xxxxxxxxxx
1
http :8080
Кроме того, попробуйте добавить и удалить новый поход.
ПОСТ новый поход:
Джава
xxxxxxxxxx
1
http -f POST :8080 hike="Pear Lake"
УДАЛИТЬ поход
Джава
xxxxxxxxxx
1
http DELETE :8080 hike=="South Maroon Peak"
Развернуть проект Spring Boot
Теперь у вас есть приложение Spring Boot, которое работает на встроенном контейнере Jetty. Чтобы развернуть его на рабочем сервере, создайте исполняемый файл JAR с помощью gradle bootJar
, скопируйте этот файл JAR на сервер и запустите его с помощью java -jar <your jar file name>.jar
. Нет необходимости в отдельном веб-сервере, так как этот jar содержит встроенный веб-сервер Jetty.
ПРИМЕЧАНИЕ. Для более старого развертывания на сервере приложений с несколькими отдельными приложениями на одном сервере необходимо создать файл war. Документы Spring о том, как это сделать, — отличный ресурс. По сути, вам нужно сделать две вещи: 1) добавить
war
плагин к зависимостям проекта и 2) изменить зависимость Jetty или Tomcat,providedRuntime
чтобы он не включался в упакованную войну. Затем вы создаете файл war и внедряете его в путь веб-приложения сервлета на сервере.
Добавить OAuth / OIDC Войти в приложение Spring Boot
Вы зарегистрировались в Okta и создали приложение OIDC. Теперь пришло время настроить приложение Spring Boot для использования OAuth / OIDC для аутентификации и авторизации.
Сначала добавьте ваш URI эмитента в src/main/resources/application.properties
файл. Вы должны заменить {yourOktaUrl}
свой фактический URL-адрес Okta. Если вы зайдете на https://developer.okta.com и перейдете к API и серверам авторизации, вы увидите URI эмитента для default
сервера авторизации.
Джава
xxxxxxxxxx
1
okta.oauth2.issuer=https://{yourOktaUrl}/oauth2/default
Пока вы находитесь в этом файле, добавьте идентификатор клиента и секрет клиента из приложения Spring Boot Jetty, которое вы создали ранее.
Джава
xxxxxxxxxx
1
okta.oauth2.clientId={clientId}
2
okta.oauth2.clientSecret={clientSecret}
Далее вам нужно добавить следующую зависимость в ваш build.gradle
файл в dependencies {}
блоке.
Джава
xxxxxxxxxx
1
implementation 'com.okta.spring:okta-spring-boot-starter:1.3.0'
Это включает в себя Okta Spring Boot Starter, хороший проект, который упрощает использование аутентификации и авторизации Okta с Spring Boot. Взгляните на страницу проекта для получения дополнительной информации .
Вам также необходимо обновить SpringBootJettyApplication
класс, чтобы он соответствовал следующему:
Джава
xxxxxxxxxx
1
package com.okta.springbootjetty;
2
3
import org.springframework.boot.SpringApplication;
4
import org.springframework.boot.autoconfigure.SpringBootApplication;
5
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
6
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
7
8
9
public class SpringBootJettyApplication extends WebSecurityConfigurerAdapter {
10
11
public static void main(String[] args) {
12
SpringApplication.run(SpringBootJettyApplication.class, args);
13
}
14
15
16
public void configure(HttpSecurity http) throws Exception {
17
http
18
.authorizeRequests()
19
.anyRequest().permitAll()
20
.and()
21
.oauth2Login()
22
.and()
23
.oauth2ResourceServer().jwt();
24
}
25
26
}
Защитите свои конечные точки DELETE и POST
Этот configure(HttpSecurity http)
метод настраивает приложение Spring Boot с использованием входа в систему OAuth 2.0 в качестве сервера ресурсов OAuth 2.0 и разрешает все запросы по умолчанию. Вы будете использовать @PreAuthorize
защиту на уровне метода через аннотацию для защиты конечных точек DELETE и POST ниже.
Наконец, добавьте @PreAuthorize("isAuthenticated")
аннотацию к indexPost()
и indexDelete()
методам WebController
класса.
Джава
xxxxxxxxxx
1
package com.okta.springbootjetty;
2
3
import org.springframework.security.access.prepost.PreAuthorize;
4
import org.springframework.stereotype.Controller;
5
import org.springframework.web.bind.annotation.*;
6
7
import javax.servlet.http.HttpServletResponse;
8
import java.util.ArrayList;
9
import java.util.Arrays;
10
import java.util.List;
11
12
13
public class WebController {
14
15
private List<String> hikes = new ArrayList<>(Arrays.asList(
16
"Wonderland Trail", "South Maroon Peak", "Tour du Mont Blanc",
17
"Teton Crest Trail", "Everest Base Camp via Cho La Pass", "Kesugi Ridge"
18
));
19
20
"/") (
21
22
public String indexGet() {
23
return String.join("\n", this.hikes);
24
}
25
26
"isAuthenticated") // <- ***ADDED*** (
27
"/") (
28
29
public String indexPost( String hike, HttpServletResponse response) {
30
if (hike == null) {
31
response.setStatus(400);
32
return "Param 'hike' cannot be null.";
33
}
34
else if (this.hikes.contains(hike)) {
35
response.setStatus(400);
36
return "The hike '"+hike+"' already exists.";
37
}
38
else {
39
this.hikes.add(hike);
40
return String.join("\n", this.hikes);
41
}
42
}
43
44
"isAuthenticated") // <- ***ADDED*** (
45
"/") (
46
47
public String indexDelete( String hike, HttpServletResponse response) {
48
if (hike == null) {
49
response.setStatus(400);
50
return "Param 'hike' cannot be null.";
51
}
52
else {
53
this.hikes.remove(hike);
54
return String.join("\n", this.hikes);
55
}
56
}
57
58
}
Теперь у вас есть защищенный веб-сервис. Вы можете делать запросы GET, но вы не сможете POST или DELETE. Перезагрузите сервер и проверьте это с помощью следующих команд HTTPie.
Джава
xxxxxxxxxx
1
http :8080
Джава
xxxxxxxxxx
1
HTTP/1.1 200 OK
2
...
3
4
Wonderland Trail
5
South Maroon Peak
6
Tour du Mont Blanc
7
Teton Crest Trail
8
Everest Base Camp via Cho La Pass
9
Kesugi Ridge
Джава
xxxxxxxxxx
1
http -f POST :8080 hike="Pear Lake"
Джава
xxxxxxxxxx
1
HTTP/1.1 403 Forbidden
2
...
3
4
{
5
"error": "Forbidden",
6
"message": "Forbidden",
7
"path": "/",
8
"status": 403,
9
"timestamp": "2019-09-07T16:13:59.474+0000"
10
}
Генерация JWT с использованием отладчика OIDC
Для доступа к защищенным конечным точкам вам нужно сгенерировать JWT. Для этого вы можете использовать OIDC Debugger . Вам потребуется идентификатор клиента из приложения OIDC, которое вы создали ранее, а также ваш базовый URI Okta (такой же, как базовый URI в URI эмитента).
Откройте отладчик OIDC.
Обновите URI авторизации, чтобы: https://{yourOktaUri}/oauth2/default/v1/authorize
Обновите идентификатор клиента до идентификатора клиента из приложения OIDC.
Положите что-нибудь в поле State. Для целей этого урока это может быть что угодно. Это значение используется для защиты от запросов подделки между сайтами.
Прокрутите вниз и нажмите Отправить запрос.
Скопируйте токен в буфер обмена и сохраните его в переменной оболочки в окне оболочки, которое вы используете для выполнения запросов.
Джава
xxxxxxxxxx
1
TOKEN=eyJraWQiOiJIb05xb01mNE9jREltWnBGRnBINjZGTkFOM0J...
Теперь попробуйте и отправьте новый поход, а затем удалите его.
Джава
xxxxxxxxxx
1
http -f POST :8080 hike="Pear Lake" "Authorization: Bearer $TOKEN"
Джава
xxxxxxxxxx
1
HTTP/1.1 200 OK
2
...
3
4
Wonderland Trail
5
South Maroon Peak
6
Tour du Mont Blanc
7
Teton Crest Trail
8
Everest Base Camp via Cho La Pass
9
Kesugi Ridge
10
Pear Lake
Джава
xxxxxxxxxx
1
http DELETE :8080 hike=="South Maroon Peak" "Authorization: Bearer $TOKEN"
Джава
xxxxxxxxxx
1
HTTP/1.1 200 OK
2
...
3
4
Wonderland Trail
5
Tour du Mont Blanc
6
Teton Crest Trail
7
Everest Base Camp via Cho La Pass
8
Kesugi Ridge
9
Pear Lake
Вы настроили это приложение на использование Spring Security oauth2Login()
. Это означает, что вы можете перейти http://localhost:8080/login
, щелкнуть URL-адрес своего эмитента и войти в систему таким же образом.
Заключение
В этом руководстве вы увидели, как создать простой сервис сервлетов Java и запустить его с Jetty. Вы также узнали, как воссоздать тот же сервис в Spring Boot, настроить его для использования Jetty и упростить свой код Java. Наконец, вы увидели, как использовать бесплатную учетную запись разработчика из Okta для добавления безопасности OAuth / OIDC в приложение Spring Boot.
Вы можете найти код для этого руководства на GitHub по адресу oktadeveloper / okta-spring-boot-jetty-example .
Если у вас есть какие-либо вопросы по поводу этого поста, пожалуйста, добавьте комментарий.
Дальнейшее чтение
5 курсов изучения веб-сервисов RESTful с использованием Java и Spring в 2019 году