В этой статье описывается, как настроить плагин jetty-maven-plugin и контейнер сервлетов Jetty для запуска веб-приложения, использующего источник данных и требующего входа пользователей, что является основными требованиями большинства веб-приложений. Я использую Jetty в разработке, потому что с ней быстро и легко работать.
Почему пристань?
Ну, потому что он намного быстрее, чем обычно используемый нами Websphere AS, и он действительно хорошо поддерживает быструю (или, скажем так, гибкую ) разработку благодаря быстрому изменению. И потому что это просто круто печатать
bash$ svn checkout http://example.com/repo/trunk/mywebapp bash$ cd mywebapp bash$ mvn jetty:run bash$ firefox http://localhost:8080/mywebapp
и иметь возможность немедленно войти в систему и взаимодействовать с приложением.
Однако следует отметить, что Jetty не является полнофункциональным сервером JavaEE и, следовательно, не всегда может использоваться.
Настройка проекта
Общая конфигурация
Вам нужно добавить плагин Jetty в ваш pom.xml :
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>mywebapp</artifactId> <packaging>war</packaging> ... <build> ... <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.0</version> <configuration> <scanIntervalSeconds>3</scanIntervalSeconds> ... </configuration> ... </plugin> ... </plugins> </build> </project>
Как видите, я использую Jetty 6.1.0.
Определение источника данных
Предположим, что приложение использует источник данных, настроенный на сервере, и получает к нему обычный доступ через JNDI. Затем мы должны определить ссылку на источник данных в src / main / webapp / WEB-INF / web.xml :
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> ... <servlet>...</servlet> ... <resource-ref> <res-ref-name>jdbc/LMSDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> </resource-ref> </web-app>
Далее нам нужно описать источник данных для Jetty. Есть несколько способов сделать это, я решил сделать это в src / main / webapp / WEB-INF / jetty-env.xml :
<?xml version="1.0"?> <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd"> <Configure class="org.mortbay.jetty.webapp.WebAppContext"> <New id="LMSDB" class="org.mortbay.jetty.plus.naming.Resource"> <Arg>jdbc/LMSDB</Arg> <Arg> <New class="com.ibm.db2.jcc.DB2SimpleDataSource"> <Set name="DatabaseName">LMSDB</Set> <Set name="User">myUser</Set> <Set name="Password">secret</Set> <Set name="ServerName">db.toronto.ca.ibm.com</Set> <Set name="PortNumber">3711</Set> </New> </Arg> </New> </Configure>
Обратите внимание, что используется класс DB2SimpleDataSource, а не драйвер JDBC. Это, конечно, потому что нам нужен источник данных, а не драйвер. Вики-страницы Jetty также содержат примеры конфигурации источника данных для других БД .
Наконец, мы должны сделать соответствующую реализацию JDBC доступной для Jetty, добавив ее к зависимостям плагина в pom.xml :
<plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.0</version> <configuration> <... </configuration> <dependencies> <dependency> <groupId>com.ibm.db2</groupId> <artifactId>db2jcc</artifactId> <version>9.7</version> <type>jar</type> <scope>system</scope> <systemPath>${basedir}/../lms.sharedlibraries/db2/db2jcc.jar</systemPath> </dependency> <dependency> <groupId>com.ibm.db2</groupId> <artifactId>db2jcc_license_cisuz</artifactId> <version>9.7</version> <type>jar</type> <scope>system</scope> <systemPath>${basedir}/../lms.sharedlibraries/db2/db2jcc_license_cisuz.jar</systemPath> </dependency> </dependencies> </plugin>
Пожалуйста, не пренебрегайте мной за использование системных зависимостей , иногда это, к сожалению, самый выполнимый способ.
Включение безопасности и настройка механизма аутентификации
Мы хотели бы ограничить доступ к приложению только для аутентифицированных пользователей в роли ADMIN, за исключением страниц в public /. Поэтому мы объявляем соответствующие ограничения безопасности в web.xml:
... <security-constraint> <display-name>authorizedUsers</display-name> <web-resource-collection> <web-resource-name>ALL URLs</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>ADMIN</role-name> </auth-constraint> <!--user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint--> </security-constraint> <security-constraint> <display-name>publicAccess</display-name> <web-resource-collection> <web-resource-name>Public pages</web-resource-name> <url-pattern>/public/*</url-pattern> </web-resource-collection> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>Learning@IBM Mini Person Feed Management</realm-name> </login-config> <security-role> <description>administrator access</description> <role-name>ADMIN</role-name> </security-role> ...
Помните, что Jetty не поддерживает HTTPS «из коробки» и, таким образом, если вы добавите ограничение данных КОНФИДЕНЦИАЛЬНО к любому ресурсу, вы автоматически получите HTTP 403 ЗАПРЕЩЕНО, независимо от того, что вы делаете. Вот почему я прокомментировал это выше. Возможно включить SSL в Jetty, но я не хотел беспокоиться о генерации сертификатов и т. Д.
Далее нам нужно рассказать Jetty, как аутентифицировать пользователей. Это делается через области, и мы будем использовать самую простую, основанную на файлах. Опять же, есть несколько способов его настройки, например, в pom.xml :
<plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.0</version> <configuration> <scanIntervalSeconds>3</scanIntervalSeconds> <userRealms> <userRealm implementation="org.mortbay.jetty.security.HashUserRealm"> <name>Learning@IBM Mini Person Feed Management</name> <config>src/test/resources/jetty-users.properties</config> </userRealm> </userRealms> </configuration> <dependencies>...</dependencies> </plugin>
Имя должно точно соответствовать имени области в web.xml. Затем вы определяете пользователей, их пароли и роли в объявленном файле, в этом случае в src / test / resources / jetty-users.properties :
user=psw,ADMIN
Формат файла: имя пользователя = пароль [, роль1, роль2, …].
Когда вы загрузите Jetty, вы найдете прекрасный пример использования JAAS с файловым сервером для аутентификации и авторизации в examples / test-jaas-webapp (вызовите mvn jetty: запустите из папки и перейдите по адресу http: // локальный: 8080 / причал-тест-JAAS /). Однако кажется, что JAAS вызывает дополнительные издержки, видимые как задержка в несколько секунд при запуске сервера, поэтому было бы предпочтительнее не использовать его.
Вывод
С Jetty легко включить защиту и создать источник данных, которые являются основными требованиями большинства веб-приложений. Тогда любой может очень легко запустить приложение, чтобы протестировать и разработать его. Разработка — это то, где Jetty действительно сияет при условии, что вам не нужны никакие функции, которых у нее нет.
При устранении неполадок вы можете указать Jetty регистрироваться на уровне отладки с помощью mvn -DDEBUG .. или регистрировать запросы , которые также можно настроить в файле jetty-env.xml.
Помните, что этот пост описывает конфигурацию для Jetty 6.1.0. Он может быть другим в других версиях и, конечно, другим в Jetty 7.