Как прикрепить домен или субдомен к проекту на Java EE / Tomcat, если у вас на сервере еще и Vesta CP со своим Apache/PHP

👁 36 просмотров

Допустим, есть такая ситуация, когда на сервере с одним IP — адресом вы хотите разместить параллельно и проекты PHP сервером Apache на порту 80/8080 и проекты Java EE, которые запущены на любом порту, к примеру на 8085, так как к порту 80/8080 уже не привяжешь. Сервер с PHP проектами управляются при помощи Vesta CP, поэтому весь арсенал управления доменами делаем и него. Ниже список операций для прикрепления.

  1. Первым делом прикрепляем наш домен, если он у нас другом ресурсе к нашему серверу через записи NS;
  2. Создаем новый WEB — хостинг с эти доменом через панель Vesta CP;
  3. После создания хостинга с этим доменом или поддоменом залезаем в корень хостинга и кидаем туда .htaccess с записями перенаправления на наш Java EE проект с его портом
RewriteEngine on
RewriteRule ^(.*)$ http://localhost:port/MyJavaProject/$1 [P]
#localhost - ip адрес нашего сервера
#port - порт, на котором запушен наш Tomcat
#MyJavaProject - контекст проекта

Деплой проекта war под Tomcat в среде Java EE. Статья 1001.

👁 61 просмотров

Почему статья 1001? Потому что любой, кто сталкивался первый раз с развертыванием проекта в Java EE подтвердит неоднозначные трудности. В данной статье, в виде различных ситуаций дадим решения данной проблемы.

1.Есть готовый .war — проект, который надо развернуть на удаленном или локальном сервере

Что мы делаем:

  • берем ProjectName.war — проект и кидаем в папку webapps не меняя ни название и ни расширение после компиляции;
  • перезапускаем сервер Tomcat. В виндовс это можно сделать любым способом, а на сервере Linu[ выполняем команду:
sudo service tomcat9 restart
  • далее идем в строку нашего браузера запускаем в адресной сроке наш проект http://hostname:8085/ProjectName/ и ждем, в зависимости от веса вашего проекта через секунды или минуты задеплоится ваш проект и запустится;
  • закинутый исходник ProjectName.war в папке webapps не удалять, иначе проект раздеплоится, хотя и создается папка work/localhost/ProjectName/, но она пустая.

 

2. Есть готовый war — проект, нужно его задеплоить на сервер Tomcat при помощи менеджера проектов Tomcat

Что мы делаем:

  • Первым первым делом настраиваем сервер, чтобы иметь права на управление скриптами и проектами, для этого идем в папку /conf и редактируем там файл tomcat-users.xml, там, где упоминается юзер, примерно так
 <role rolename="manager-gui"/>
 <role rolename="manager-script"/>
 <role rolename="manager-jmx"/>
 <role rolename="manager-status"/>
 <role rolename="admin-gui"/>
 <role rolename="admin-script"/>
 
 <user username="user" password="password" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>
  • далее устаналиваем права на папку webapps, как 777, если не будет работать то и на папку work. Потому что, есть случай, когда менеджер не может задеплоить ваш проект по причине нехватки прав на запись в эти папки, учитывая то, что он загружает в эти папки ваш проект и в случае ошибки может выдать вот такой текст
    <em>FAIL - Deploy Upload Failed, Exception: [java.io.FileNotFoundException: </em>
  • идем по адресу http://hostname:8085/manager/, страница запросит данные юзера, которые мы выше прописали в файле tomcat-users.xml в виде логина: user и пароля: password. После авторизации находим кнопку загрузки на сервер и загружаем наш проект ProjectName.war и запускаем по адресу  http://hostname:8085/ProjectName/

 

Установка сервера Tomcat 8/9 на Ubuntu 16

👁 57 просмотров

В данной теме рассмотрим установку Apache Tomcat 8/9 на ОС Ubuntu 16.

Обновление пакетов Ubuntu

Первым делом нам нужно обновить все пакеты Linux/Ubuntu командой в терминале

apt-get update && apt-get upgrade

Установка JDK

Вторым делом, конечно же, нам нужна среда выполнения Java, на котором, собственно, и написан данный сервер. Для установки JDK набираем команду

apt-get install default-jdk

Для проверки удачной установки выполнил команду вывода установленной версии JDK

java -version

Это должно вывести что-то на подобие

openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-8u111-b14-2ubuntu0.16.04.2-b14)
OpenJDK 64-Bit Server VM (build 25.111-b14, mixed mode)

Добавление нового пользователя для работы с сервером

Это не обязательно, но из-за соображения безопасности не рекомендуется работать с сервером из пользователя root и поэтому, добавим нового пользователя для этого в систему

useradd -r username --shell /bin/false

 

Скачка архива Tomcat 8/9 и установка

Для установки нам надо будет скачать архив с Tomcat 8 или Tomcat 9. В данном примере установим версию 9. Разницы в установке версий 8 и 9 нет. Для скачки нужно знать текущее зеркало загрузки, они могут меняться и на данный момент, официальным зеркалом была ссылка на странице загрузки

копируем эту ссылку в буфер, заходим в раздел /opt

cd /opt

и скачиваем в данный раздел архив с сервером

wget http://apache-mirror.rbc.ru/pub/apache/tomcat/tomcat-9/v9.0.0.M22/bin/apache-tomcat-9.0.0.M22.tar.gz

Не обязательно скачивать через терминал, можно загрузить через любой файловый менеджер и делаем разархивацию содержимого

tar -zxf apache-tomcat-9.0.0.M22.tar.gz

Делаем символическую ссылку на разархивированную папку с сервером для удобной навигации по имени ссылки и устанавливаем привилегии на папку с новым пользователем, которого мы до этого создали

ln -s apache-tomcat-9.0.0.M22 tomcat-latest
chown -hR username: tomcat-latest apache-tomcat-9.0.0.M22

Создание сервиса для работы с сервером

Для работы с сервером в виде сервиса из командной строки необходимо создать специальный файл с именем сервиса и расширением *.service в папке /etc/systemd/system/, в данном случае именуем данный сервис как tomcat.service, в котором пропишем список операций для запуска, рестарта и остановки сервера Tomcat

[Unit]
Description=Tomcat9
After=network.target

[Service]
Type=forking
User=username
Group=usergroup

Environment=CATALINA_PID=/opt/tomcat-latest/tomcat.pid
Environment=JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
Environment=CATALINA_HOME=/opt/tomcat-latest
Environment=CATALINA_BASE=/opt/tomcat-latest
Environment="CATALINA_OPTS=-Xms512m -Xmx512m"
Environment="JAVA_OPTS=-Dfile.encoding=UTF-8 -Dnet.sf.ehcache.skipUpdateCheck=true -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+UseParNewGC"

ExecStart=/opt/tomcat-latest/bin/startup.sh
ExecStop=/opt/tomcat-latest/bin/shutdown.sh

[Install]
WantedBy=multi-user.target

Сохраняем данный файл и запускаем сервер

systemctl daemon-reload
systemctl start tomcat
systemctl enable tomcat

 

Настройка сервера

Это базовый список операций для установки, далее нужно настроить установленный Tomcat, чтобы он работал на сервере через терни безопасности.

Tomcat на локальном сервере и удаленном работает по дефолту по разному. На локальном не возникают проблемы с правами и безопасностью, а на удаленном можно встретиться со всем этим сюрпризом и можно на этом убить немало времени.

Нам нужно, сначала дать полные права под папку проектов на удаленном сервере

далее, создать пользователя в файле конфигурации Tomcat — conf/tomcat-users.xml в каждом разделе в папке META-INF отредактировать файл context.xml.

Проблема входа в разделы менеджера приложений Tomcat 8/9 связана с блокировкой текущего URL, по которому мы пытаемся открыть сайт. Данная проблема решается , в дополнении с прописью ролей в tomcat-users.xml

 <role rolename="manager-gui"/>
 <role rolename="manager-script"/>
 <role rolename="manager-jmx"/>
 <role rolename="manager-status"/>
 <role rolename="admin-gui"/>
 <role rolename="admin-script"/>
 <user username="username" password="password" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>

Еще и редактированием, точнее, закоментированием тега Valve в файле context.xml в папке META-INF открываемого проекта

<?xml version="1.0" encoding="UTF-8"?>
...
<Context antiResourceLocking="false" privileged="true" >
...
<!--
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
...
</Context>

Файл context.xml может находится в любом проекте и отвечает за доступ к проекту из удаленного URL.

Вывод сообщения 403 Access Denied на Tomcat 8/9 в разделе Manager App/Host Manager/Server Status

👁 128 просмотров

В данном посте режим проблемы доступа в разделы менеджера и вообще, любого проекта, который мы ходим настроить на УДАЛЕННОМ СЕРВЕРЕ.


Почему именно на удаленном сервере? Потому что, работа Tomcat на локальном сервере и удаленном работает по дефолту по разному. На локальном не возникают проблемы с правами и безопасностью, а на удаленном можно встретиться со всем этим сюрпризом и можно на этом убить немало времени.

Нам нужно, сначала дать полные права под папку проектов на удаленном сервере

далее, создать пользователя в файле конфигурации Tomcat — conf/tomcat-users.xml в каждом разделе в папке META-INF отредактировать файл context.xml.

Проблема входа в разделы менеджера приложений Tomcat 8/9 связана с блокировкой текущего URL, по которому мы пытаемся открыть сайт. Данная проблема решается , в дополнении с прописью ролей в tomcat-users.xml

 <role rolename="manager-gui"/>
 <role rolename="manager-script"/>
 <role rolename="manager-jmx"/>
 <role rolename="manager-status"/>
 <role rolename="admin-gui"/>
 <role rolename="admin-script"/>
 <user username="username" password="password" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>

Еще и редактированием, точнее, закоментированием тега Valve в файле context.xml в папке META-INF открываемого проекта

<?xml version="1.0" encoding="UTF-8"?>
...
<Context antiResourceLocking="false" privileged="true" >
...
<!--
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
...
</Context>

Файл context.xml может находится в любом проекте и отвечает за доступ к проекту из удаленного URL.

Основные понятия в разработке Java EE

👁 36 просмотров

SNAPSHOT


Вопрос. Что значит приставка «-snapshot» в релизе «x.x.x-snapshot»?

  • Ответ 1. SNAPSHOT это зафиксированное состояние в системе управления версиями. Делаются ежедневно(или еженедельно, как разработка двигается). SNAPSHOT-версии могут оказаться вовсе не рабочими
  • Ответ 2. SNAPSHOT иногда означает, что это почти окончательный вариант данной версии. Что-то наподобие release candidate. Если обычная версия это полностью законченный продукт, то версии SNAPSHOT могут получать обновления, т.к. предполагается, что продукт ещё находится в стадии разработки. Более подробно можно почитать на английском SO здесь.
  • Ответ 3. SNAPSHOT означает, что исходники будут дорабатываться в пределах данной версии. Условно говоря, если твоё приложение использует некую библиотеку, помеченную как SNAPSHOT, то её автор, найдя баг или просто внеся дополнительный функционал, а может и удалив что-то, может залить новый jar’ник библиотеки (артефакта), при этом не поменяв версию. Совесть автора будет чиста, а вот твоё приложение, заново потянув библиотеку из репозитория может уже не собраться.

METADATA/meta data


Вопрос. Что такое METADATA/Метаданные?

  • Ответ 1. Метаданные — это субканальная информация об используемых данных.
  • Ответ 2. Структурированные данные, представляющие собой характеристики описываемых сущностей для целей их идентификации, поиска, оценки, управления ими или набор допустимых структурированных описаний, которые доступны в явном виде и предназначение которых может помочь найти объект.
  • Ответ 3. Термин используется в контексте поиска объектов, сущностей, ресурсов.
  • Ответ 4. Данные из более общей формальной системы, заданную с описывающей свойства системы данных.
  • Ответ 5. Информация о содержащейся на веб-странице свойств информации (создателе и т. п.). Пример: Имя автора правки в тексте. Этот термин в широком смысле слова используется для любой информации о данных: именах таблиц, колонок в таблице в реляционных базах данных, номер версии в файле программы (то есть как информативная часть в бинарном файле) и т. п.

WEB-INF


Вопрос. Что хранится в папке WEB-INF в проекте Java EE?

  • Ответ 1. Папка WEB-INF была создана специально, что-бы разграничить файлы классов и библиотеки классов используемые приложением от остальных html, jpg и прочих файлов, к которых пользователь должен иметь прямой доступ по протоколу http.
  • Ответ 2. Наличие папки WEB-INF — это одно из требований при развертке проекта Java EE:
    • Контейнер сервлетов (например, Tomcat) — если вы используете Apache Tomcat, корневой каталог приложения должен быть помещен в папку webapp. Это может быть другим, если вы используете другой контейнер сервлетов или сервер приложений.
    • API-интерфейс Java Servlet — Java Servlet Java Servlet API заявляет, что ваш корневой каталог приложения должен иметь следующую структуру:
      ApplicationName
      |
      |--META-INF
      |--WEB-INF
            |_web.xml       <-- Here is the configuration file of your web app(where you define servlets, filters, listeners...)
            |_classes       <--Here goes all the classes of your webapp, following the package structure you defined. Only 
            |_lib           <--Here goes all the libraries (jars) your application need

       

    • Ваш домен приложения — теперь, когда вы выполнили требования к контейнеру Servlet (или серверу приложений) и требованиям API Java Servlet, вы можете организовать другие части вашего веб-сервера на основе того, что вам нужно:
      • вы можете поместить свои ресурсы (файлы JSP, текстовые файлы, файлы сценариев) в корневой каталог приложения. Но тогда люди могут обращаться к ним напрямую из своего браузера, вместо того, чтобы их запросы обрабатывались по некоторой логике, предоставленной вашим приложением. Таким образом, чтобы ваши ресурсы не были доступны напрямую, вы можете поместить их в каталог WEB-INF, содержимое которого доступно только для сервера;
      • если вы используете некоторые фреймворки, они часто используют файлы конфигурации. Большинство этих фреймворков (классы, директории, …).
  • Ответ 3. Вы должны помещать WEB-INF любые страницы или части страниц, которые вы не хотите публиковать. Обычно JSP или facelets находятся вне WEB-INF, но в этом случае они легко доступны для любого пользователя. Если у вас есть некоторые ограничения авторизации, для этого можно использоваться WEB-INF.
  • Ответ 4. WEB-INF/lib может содержать сторонние библиотеки, которые вы не хотите упаковывать на системный уровень (JAR могут быть доступны для всех приложений, запущенных на вашем сервере), но только для этого конкретного приложения.
  • Ответ 5. Что касается WEB-INF/classes — он существует в любом веб-приложении, потому что это папка, в которой размещены все скомпилированные источники (а не JARS, а скомпилированные .java-файлы, которые вы написали сами).
  • Ответ 6. Вообще говоря, многие файлы конфигурации также входят в WEB-INF.
  • Ответ 7. Размещение файлов в WEB-INF соблюдается по соображениям безопасности. Например, если несанкционированному лицу разрешен доступ к корневому JSP-файлу непосредственно из URL-адреса, он может перемещаться по всему приложению без какой-либо проверки подлинности и получать доступ ко всем защищенным данным.

META-INF


Вопрос. Что хранится в папке META-INF в проекте Java EE?

  • Ответ 1. Вообще говоря, вы не должны вводить ничего в META-INF самостоятельно.
  • Ответ 2. Следующие файлы / каталоги в каталоге META-INF распознаются и интерпретируются платформой Java 2 для настройки приложений, расширений, загрузчиков классов и служб:
    • MANIFEST.MF — файл манифеста, который используется для определения данных, связанных с расширением и пакетом.
    • INDEX.LIST — файл генерируется новой -iопцией «» инструмента jar, которая содержит информацию о местоположении для пакетов, определенных в приложении или расширении. Он является частью реализации JarIndex и используется загрузчиками классов для ускорения процесса загрузки классов.
    • x.SF — файл подписи для файла JAR. «X» обозначает имя базового файла.
    • x.DSA — Файл блока подписи, связанный с файлом подписи с тем же именем базового файла. Этот файл хранит цифровую подпись соответствующего файла подписи.
    • services/ — в этом каталоге хранятся все файлы конфигурации поставщика услуг.
  • Папка META-INF — это домашний файл MANIFEST.MF . Этот файл содержит метаданные о содержимом JAR. Например, есть запись под названием Main-Class, которая указывает имя класса Java со статическим main () для исполняемых JAR-файлов.

 

Установка и настройка почтового SMPT-сервера Apache James 3.0

👁 117 просмотров

Проект Apache James предоставляет богатый набор модулей и библиотек, написанные на Java, связанные с Интернет — почтой, которые позволяют строить продвинутые почтовые сервера на уровне предприятий.

Все могут участвовать в сообществе разработки данного проекта при помощи подписки или следить за новостями в официальном аккаунте в Twitter — @ApacheJames.

Можно, также, посетить раздел wiki (рассказано как и кто используют Apache James,…)

Также, как и другие  Apache -проекты, Apache James был спроектирован открытым и на основе сотрудничества.

Что будет в статье?

В статье будет рассказано о том, как установить и запустить почтовый SMPT — сервер Apache James на Windows. Разрешим некоторые ситуации с ошибками и запустим сервер на локальном хосте.

Скачивание и установка

Есть 2 основных версий James Apache  — версия 2.3.x и версия 3.0(на момент написания данной статьи имела бета-версию 4). Оба версии в корне отличаются в плане настройки и развертывания и, так как, в статье рассмотрим версию 3.0, то у него есть свои ньюансы и дополнительные библиотеки, которые нужно будут скачать и включить в проект под Windows.

Установка сервера заключается в обычном разархивировании проекта, скачанного по ссылке.

Настройка конфигурации

В голом виде запустить Apache James не удастся, пока не будет сделана конфигурация. Для этого открываем файл конфигурации, находящийся в папке Apache James 3.0\conf\wrapper.conf.
В данном файле меняем, пока, 2 строчки кода:

...
wrapper.java.command=C:/Program Files/Java/jdk1.8.0_92/bin/java
...
wrapper.java.classpath.2=../conf/lib*
...

В первой строке мы изменили путь к java, который у нас установлен, а во второй указываем папку библиотек Apache James, которую мы будем использовать.

Это предварительная настройка Apache James, в дополнение нужно в переменных средах добавить путь к JDK, с с созданием новой переменной JAVA_HOME, если у вас это не настроено.

Запуск Apache James, забегая вперед

Забегая вперед, расскажу про ошибку, которая, возможно, вылетит после первоначальной настройки Apache James. Данный этап настройки и конфигурации считается законченной, но, если мы, сейчас попытаемся запустить, то Apache James выведет ошибку в консоли «wrapper | The Apache James Server App service was launched, but failed to start.»:

apache-james-server-start-failed

А если попытаемся запустить в службах Windows, то выведет ошибку «Ошибка 1067. Процесс был неожиданно завершен» или «Error 1067. The process terminated unexpectedly»:

apache-james-server-start-failed-from-services

Для решения проблемы с запуском сделаем дополнительную настройку с установками зависимостей.

Установка зависимостей

Для решения вышеизложенных проблем нужно сделать следующие шаги:

  • Добавляем новую сущность в classpath Apache James в файле wrapper.conf
    wrapper.java.classpath.120=../conf/lib/jaxb-impl-2.1.jar
    и скачиваем данную библиотеку через ссылку jaxb-impl-2.1.jar, после скачивания кидаем эту библиотеку в директорию Apache James 3.0/conf/lib
  • Скачиваем библиотеку JAXB2_20100510.jar и после скачивания кидаем эту библиотеку, так же, в директорию Apache James 3.0/conf/lib

Запуск Apache James

Для запуска сервера James мы должны запустить консоль с правами администратора, перейти в папку C:\Servers\Java\Apache James 3.0\bin и набрать в консоли команду:

>run.bat

Далее нужно установить Apache James в виде службы Windows, ля этого запускаем команду:

>james install

apache-james-server-start-failed

После запуска мы увидим его в списке служб Windows и для старта сервера нужно дать команду запуска:

>james start

Аналогично, для остановки:

>james stop

Для перезапуска:

>james restart

Чтобы удалить из спуска служб Windows набираем команду:

>james remove

Все, на этом установка, настройка и запуска SMPT-сервера на локальном Windows закончена.

Отправка AJAX — запросов к сервлету Java

👁 307 просмотров

Для взаимодействия пользователя серверной частью очень часто нужно использовать запросы, которые позволяют отправлять и принимать данные без обновления текущей страницы иначе говоря асинхронные AJAX — запросы. В сегодняшнем примере покажем, как сделать запрос со страницы пользователя на сервер, где у нас стоит сервер Tomcat 8, а серевер будет асинхронно отвечать пользователю.

Для того, чтобы отправить ассинхронные запросы можно воспользоваться еще и апплетами, которые будут грузиться в HTML — код на стороне клиента, но минусом такого подхода является необходимость дополнительно устанавливать клиенту плагины для браузера, а иногда, этот плагин, из-за несовметимости или блокировки будет не работать и нам эта возня, как и клиенту вообще не нужно…

Что потребуется? Потребуется:

  • Пользовательская HTML — страница, на котором работает AJAX — код через jQuery;
  • Сервер, на котором установлен Tomcat … 7 — 8 … или любой другой, поддерживающий сервлеты;
  • Любимая Java — IDE(NetBeans, Eclipse, IntelliJ IDEA, …).

Постановка задачи

Допустим есть страница index.html, на котором есть формы ввода пароля и логина. Наша задача:

  • асинхронно отправить со стороны клиента index.html данные вводимого пользователя на сторону сервера через AJAX;
  • обработать эти данные(проверить наличие в БД, проверить на допустимость символов, на количество символов и т.д.) через сервлет AuthServlet.java;
  • асинхронно отправить данные о статусе входа со стороны сервера на сторону клиента через тот же AJAX.

Практика

HTML — страница, которая показывается клиенту состоит из пару полей логина и пароля и одной кнопки

auth-forms-of-post-servlet-ajax-login

Ниже представлен код клиентской страницы auth.html

<!DOCTYPE html>
<html>
    <head>
        <title>Авторизация через через AJAX-JAVA</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script type="text/javascript" src="jquery-1.11.1.min.js"></script>
        <script type="text/javascript" src="script.js"></script>
        <style>
            body{
                background-color: azure;
                text-align: center;
                font-family: "Lucida Sans Unicode"
            }
            .auth-forms{
                width: 30%;
                margin: auto;
                background-color: background;
                text-align: center;
                margin-top: 200px;
            }
            .auth-forms input, button{
                margin: 10px;
                height: 30px;
                padding: 3px;
                border: none;
                border-radius: 2px;
            }
            #auth-info{
                margin: 5px;
                height: 50px;
                text-align: center;
                padding: 5px;
            }
        </style>
    </head>
    <body>
        <div>
            <form class="auth-forms">
                <div id="auth-info"></div>
                <input type="text" placeholder="Логин" id="login"/>
                <br/>
                <input type="password" placeholder="Пароль" id="password"/>
                <br/>
            </form>
            <br/>
            <button id="button">Вход</button>
        </div>
    </body>
</html>

Код для обработки событий на стороне клиента в виде файла JavaScript — script.js

$(document).ready(function(){
    $("#button").click(function(){
        var data = {};
        data = {"login":$("#login").val(), "password":$("#password").val()};
        //
        $.ajax
        ({
            type: "POST",//Метод передачи
            data: data,//Передаваемые данные в JSON - формате
            url: 'AuthServlet',//Название сервлета
            success:function(serverData)//Если запрос удачен
            {
                $("#auth-info").css({"background-color":serverData.backgroundColor, "height": "50px", "color":"white"});
                $("#auth-info").html(serverData.serverInfo);
            },
            error: function(e)//Если запрос не удачен
            {
                $("#auth-info").css({"background-color":"#CC6666", "height": "50px", "color":"white"});
                $("#auth-info").html("Запрос не удался!");
            }
        });
    });
});

Код для проверки и переотправки информационных сообщений о статусе авторизации представлен сервлетом AuthServlet.java

package ru.websofter.smilerado;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONException;
import org.json.JSONObject;

/**
 *
 * @author WebSofter
 */
@WebServlet(name = "AuthServlet", urlPatterns = {"/AuthServlet"})
public class AuthServlet extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, JSONException {
        response.setContentType("application/json");//Отправляем от сервера данные в JSON -формате
        response.setCharacterEncoding("utf-8");//Кодировка отправляемых данных
        try (PrintWriter out = response.getWriter()) {
            JSONObject jsonEnt = new JSONObject();
            if(request.getParameter("login").equals("myLogin")&&request.getParameter("password").equals("myPassword"))
            {
                jsonEnt.put("backgroundColor","#99CC66");
                jsonEnt.put("serverInfo", "Вы вошли!");
            }else
            {
                jsonEnt.put("backgroundColor","#CC6666");
                jsonEnt.put("serverInfo", "Введен неправильный логин или пароль!"); 
            }
            out.print(jsonEnt.toString());
        }
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (JSONException ex) {
            Logger.getLogger(AuthenticationServlet.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (JSONException ex) {
            Logger.getLogger(AuthenticationServlet.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    @Override
    public String getServletInfo() {
        return "Short description";
    }// 

}

После ввода логина и пароля сервер проверяет на наличие и соответствие и, в соответствии со статусом авторизации, выдает сообщение либо о  правильности ввода или об ошибочности

auth-forms-of-post-servlet-ajax-login-ok-info

 

auth-forms-of-post-servlet-ajax-login-no-ok-info

Запуск сервера Tomcat 8 на порту 80 под Linux

👁 72 просмотров

Данную проблему можно решить 2 -мя, известными для меня, способами:

  1. через дополнительный сервис authbind;
  2. через перенаправление в таблице IP адресов.

В посте расскажем про второй способ, так как он более, легок и быстр.
Как правило, запуск сервера Tomcat на 80 порту, и вообще с портами ниже 1024, осложнено в виду безопасности или занятости другими сервисами или службами. Перед тем, как работать с 80 портом на Linux-подобных системах с Tomcat 8 необходимо освободить этот порт от других служб. Особенно, этот порт любит сервер Apache и, желательно, решить проблему замены этого порта на другой.

Одним из решением данной проблемы является перенаправление трафика запросов с 80 порта на порт выше 1024, на котором работает наш сервер Tomcat 8, по умолчанию, это порт 8080 и он определен в файле конфигурации tomcat/conf/server.xml. Для перенаправления изменим конфигурацию в iptables двумя командами:

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080    
iptables -t nat -A PREROUTING -p udp -m udp --dport 80 -j REDIRECT --to-ports 8080

И все, проблема с привязкой Tomcat 8 к порту 80 решена.

Часть 2. Java EE. Развертывание проекта Tomcat 8 на OpenShift

👁 61 просмотров

В первой части данной статьи рассматривалась тема про интеграцию и запуск первого проекта на Tomacat 8 с IDE Netbeans 8.2. В данной части рассмотрим пример развертывания, или, иначе говоря,загрузка готового релиза проекта на удаленный сервер, где он будет уже использоваться клиентами. В роли сервера можно использовать люубую платформу, где стоит ОС Windows, Ubuntu, Mint, CentOS, Red Hat и т.д., для которых есть релизы сервера Tomcat. В данном примере рассмотрим пример развертки нашего проекта на бесплатном облачном хостинге OpenShift, который предлагает сервер на Red Hat. По сути дела, OpenShift — это отдельный проект от той же Red Hat для масштабируемых проектов в облачной вычислительной системе, которая работает на ОС Red Hat. OpenShift предлагает сервер c характеристиками:

512 MB RAM
100 MB swap
1 GB disk space

чего очень даже предостаточно для мелких проектов.

Система OpenShift представляет из себя сервис из рода PaaS. Platform as a Service (PaaS, «платформа как услуга») — модель предоставления облачных вычислений, при которой потребитель получает доступ к использованию информационно-технологических платформ: операционных систем, систем управления базами данных, связующему программному обеспечению, средствам разработки и тестирования, размещённым у облачного провайдера.

 

Доступ клиентов к проекту

Перед тем, как создать проект нужно создать доменное имя третьего уровня для проектов в доменной зоне второго уровня rhcloud.com. Это логично, потому что мы делаем наш проект доступным для клиентов, а клиенты могут увидеть наш проект через браузер и через доменную часть проекта. Делается это бесплатно в самой системе OpenShift. На самом деле, это будет частью доменного имени для нескольких проектов, а другая часть будет добавляться в зависимости от того, как вы назовете часть доменного имени конкретного проекта. К примеру, вы создали доменную зону projectsdomain.rhcloud.com, где projectsdomain — общее , уникальное в пределах OpenShift и доменная зона под ваши проекты. А остальная часть будет добавляться через дефис. К примеру, вы сделали чат на Tomcat и назвали домен данного чата, как chatproject, то полноценная ссылка, по которой будет доступен ваш чат на OpenShift будет выглядеть, как chatproject-projectsdomain.rhcloud.com. На самом -то деле, такое длинное название для ссылки на проект — это не приговор, а необходимость OpenShift и это ограничение окупается бесплатностью облачной системы и возможностью дополнить название домена уникальным образом. Вариантом решения данной проблемы является регистрация домена проекта на стороннем регистраторе доменов и указание в панели управления данного домена ссылки на projectchat-projectsdomain.rhcloud.com и делается это через поля CNAME, указав в роли параметра новый домен, а в роли значения — ссылку  chat-mydomain.rhcloud.com на наш проект на OpenShift

overview-platform-features-14

Подробнее об этом можно почитать по ссылке официальной документации.

 

Установка необходимого ПО на сервер

Вся структура управления проектом производится, в основном из командной строки Red Hat, а начальную установку необходимого ПО можно произвести и из панели управления через аккаунт консоли OpenShift. Весь набор ПО, которую можно «юзать» представлен на странице, через кнопку «Add application…». На странице добавления программы в проект есть множество ПО, начиная от БД и заканчивая интерпретаторами Python.

openshift-tomcat-dep-app-page

Из всего этого разнообразия, исходя из темы данной статьи, нам нужен сервер на основе Tomcat 8. На момент написания статьи Tomcat 8 не предоставлен на сервисе OpenShift и это можно решить выбором Tomcat 7 и принципиальных отличий не будет, если проект не использует специфичные для Tomcat 8 функций.

create-tomca-tcatridge-on-openshift-png-of-article

На следующем шаге, после создания проекта мы попадем на панель, где будут все наши проекты и наш проект chatproject

created-tomcat-catridge-on-openshift

Нажав на данный проект мы попадем в панель управления данным проектом, где можно дополнительно поднастроить или дополнить наш проект. Особое внимание требует панель «Source Code», где находиться ссылка для доступа к коду проекта.

 

created-tomcat-catridge-on-openshift-info-on-panel

OpenShift не располагает какой-то панелью для редактирования и загрузки релиза проекта на сервер, но вместо этого он выдает ссылки для аутентификации и ссылку для доступа к исходному коду. Как этими ссылками пользоваться рассмотрим далее

Аутентификация и доступ к серверу Red Hat через канал SSH

Для того, чтобы управлять севером Red Hat будем пользоваться программой PuTTY, которая позволит нам осуществить связь с удаленным сервером из нашего компьютера через консоль и выполнять различные команды для настройки системы.

Принцип RSA — аутентификации заключается в генерации 2-х ключей: публичного и приватного. Приватный ключ должен быть у нас на компьютере для нашего PuTTY, а публичный — на сервере для OpenShift, далее.

Вместе с PuTTY загрузим и PuTTYgen для генерации RSA ключей, посредством которых мы можем связаться и аутентифицироваться на удаленном сервере через SSH протокол.

Для генерации ключей открываем программу PuTTYgen, жмем на кнопку «Generate» и проводим мышкой по области под процесс-баром

puttygen-create-private-and-public-keys-for-openshift-proj

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

puttygen-create-private-and-public-keys-for-openshift-proj-2

Далее, для подключения к удаленному серверу нам достаточно иметь под рукой:

  1. Приватный и публичны ключи, сгенерированные при помощи PuTTYgen;
  2. Логин к Red Hat серверу нашего проекта;
  3. Программа PuTTY для аутентификции и выполнения команд через консоль.

Логин к серверу проекта генерируется OpenShift и можно узнать, нажав на ссылку «Remote Access» на панели проекта

login-catridge-on-openshift-panel

А для того, чтобы OpenShift знал наш публичный ключ, то его надо прописать в поле регистрации SSH -ключей на панели «Settings», нажав на кнопку «Add a new key»

add-new-ssh-public-key-openshift-settings-panel

При добавлении нового ключа задаем имя и копируем текст публичного ключа, который был сгенерирован у нас программой PuTTYgen жмем create

process-add-new-ssh-public-key-openshift-settings-panel

И все, теперь нам нужно все нужные данные в PuTTY и соединиться с удаленным сервером на OpenShift, где царит мир команд Red Hat. Для этого открываем PuTTY

puttygen-create-new-session-of-openshift-connection

После ввода всех данных и нажатия кнопки «Open»мы попадаем в командную консоль Red Hat, где потребуется ввести ключевую фразу, которую мы вводили при регистрации приватного ключа и где уже можем творить что угодно с сервером, включая установку и удаление программ и файлов

puttygen-command-console-of-openshift-connection

Загрузка проекта на удаленный сервер OpenShift

После того, как выбрали и установили нужное ПО на наш сервер с определенным публичным доменном и настроили проект, необходимо подготовить инструменты для загрузки проекта из нашего компьютера на сервер Red Hat под нашим аккаунтом OpenShift.

Для этого есть несколько способов, но мы воспользуемся одним из них — загрузка через инструмента контроля версий GIT TortoiseGIT. После загрузки и установки данного инструмента нам необходимо настроить локальный GIT репозиторий. Для этого создаем папку на нашем компьютере, где будет репозиторий загружаемого проекта и внутри этой папки жмем левой кнопкой мыши на пустую область и выбираем пункт «Git Clone…»

git-clone-in-git-repositoriy

Далее выйдет окно предварительной настройки проекта, где вводим ссылку на исходники нашего проекта, скопировав его из OpenShift панели проекта и указав на файл приватных ключей, которую мы ранее сгенерировали

git-clone-in-git-repositoriy-settings-panel

После этого жмем «Ок» и исходники с сервера проекта скопируются в наш локальный Git — репозиторий. В данной папке заходим в папку webapps и копируем туда наш проект с раширением .war из папки дистрибутива, где его построил IDE NetBeans переименовав его в ROOT.war. Далее заходим в корневую папку скачанных исходников в репозитории и из меню ЛКМ выбираем пункт «Git commit -> «master» …»

commit-master-git-repo-proj

После нажатия выйдет окно настройки коммта. Коммит(commit) — это сеанс загрузки проекта на сервера из локального репозитория с комментарием об изменениях. В окне весь список того, чего нет на сервере или того, что не синхронизировано в соответствии с содержимым на сервере. Т.е., всякое изменение в локальной репозитории должно быть отражено в репозитории на сервере, поэтому, Git — инструмент и предназначен для управления всей этой «кашей»

commit-master-do-process-commiting

Далее нажимаем на кнопку «ОК» и выйдет окно с процессом и с кнопкой «Push…»

process-commit-master-do-process-commiting

на которую нажмем и выйдет окно с преднастройками

process-commit-master-do-process-commiting-width-presettings

Нажимаем «ОК» и вводим ключевую фразу для наших ключей, которую мы создали при генерации в PuTTY в появившемся окошке

process-commit-master-do-process-commiting-width-presettings-keyphrase

далее, жмем «ОК» и пойдет процесс переброски обновленных файлов из локального репозитория на репозиторий проекта на сервере OpenShift

process-commit-master-do-process-commiting-succes

Теперь, после удачной переброски, закрываем это окно и переходим по ссылке нашего проекта projectchat-projects.domain.rhcloud.com, где мы и увидим его в задеплоенном или, иначе говоря, в развернутом виде на нашем сервере.

 

Часть 1. Java EE. Интеграция Tomcat 8 и NetBeans 8.2 и создание проекта Hello World

👁 381 просмотров

Java EE(Java Platform, Enterprise Edition) — это платформа и набор спецификаций языка Java для серверных проектов на уровне средних и крупных предприятий.

Основное назначение данной платформы — это реализация процессов сетевого обмена информацией через Интернет. Это свободная платформа со свободными программными и инструментальными средствами разработки.

В данной статье будет подробно описано как создать свой первый проект на платформе Java EE.

Что потребуется?

Нам потребуются для этого 3 шага:

  • установить требуемое ПО;
  • интегрировать скачанное ПО;
  • создать проект и развернуть на сервере.

Установка требуемого ПО

Нам потребуется скачать и установить следующий перечень ПО:

  • Tomcat 8 — сервер для запуска проекта Java EE;
  • IDE NetBeans — для создания и развертывания проекта Java EE;
  • Дополнительные модули для NetBeans для поддержки создания проектов JavaME.

tomcay-logo-imgTomcat 8 скачивается с официального сайта Apache. Есть разные варианты установки, это инсталлятор с пошаговой установкой и  архив программы, не требующий инсталляции. Мы скачаем инсталлятор и проследуем подсказкам. После скачивания запускаем инсталлятор, жмем «Next», далее соглашаемся с лицензией и жмем «I Agree» и появится окно

tomcay-inst-next-choose-components

Оставляем все по умолчанию. Если кратко, то «Host Manager» — это менеджер проектов, который помогает развертывать и удалять проекты с сервера Tomcat через браузер. Нам он не нужен, не будем устанавливать, также, и примеры, пример мы сами создадим. Жмем «Next»

tomcay-inst-next-configВ данном окне нам необходимо придумать логин и пароль для нашего сервера, а в пункте «Roles» задать роли для пользователя. По умолчанию там стоит manager-gui и мы добавляем к нему, через запятые, еще две роли: manager-script и manager-admin. Они нам будут необходимы при интеграции с NetBeans, остальное оставляем как есть и жмем «Next» появится окно выбора папки Java -машины, если Tomcat нашел эту папку,  у меня она находится по пути «C:\Program Files\Java\jre1.8.0_45», то оставляем, если нет, то выбираем. Жмем «Next» и выйдет окно выбора папки установки, я оставил по умолчанию «C:\Program Files\Apache Software Foundation\Tomcat 8.0». Жмем «Next» и пойдет процесс установки

tomcay-inst-next-finish

После окончания оставляем галочку «Run Apache Tomcat» для запуска, а с «Show Readme» снимаем, жмем «Finish» и начнется запуск сервера. Мы можем в любой момент остановить и запустить сервер через Monitor Tomcat, который будет доступен трее в процессе запуска

tomcay-inst-next-tree

Если сервер запущен, то на значке будет зеленый треугольник, а если остановлен — красный. Если мы вышли из монитора нажав на пункт Exit, то сможем заново запустить через «Пуск» в категории «Apache Tomcat 8.0 Tomcat8»

tomcat-monitor-app-puskНа данный момент с Tomcat закончили. Переходим к следующей программе.

 

netbeans-logo-img

IDE NetBeans скачиваем с официального сайта NetBeans. При скачивании выбираем PHP — конфигурации с минимальным количеством модулей, остальные мы сам установим

netbeans-download-confПосле скачивания запускаем инсталлятор и следуем подсказкам, оставляя все по умолчанию, если у вас нет других требований.

Все, программы мы установили. Теперь запускаем NetBeans и устанавливаем необходимые модeли для разработки проектов Java EE. Для этого заходим в пункт меню «Tools» > «Plugins»

netbeans-tools-pluginИ в открывшмся диалоговом окне, в раскладке доступных модулей «Available Plugins» выбираем все модули с с категориями Java EE и Java WEB and EE

netbeans-tools-plugins-selectЖмем «Install», соглашаемся со всеми лицензиями и подтверждаем установки. После окончания NetBeans предложит перезагрузиться -соглашаемся и все, мы можем, теперь, через меню создавать стандартные проекты Java EE.

Интеграция Tomcat и Netbeans

В NetBeans, для того, чтобы посмотреть текущие активные серверы, нам необходимо открыть вкладку сервисов. Для этого переходим в пункт меню «Window» > «Services»

service-windowПосле этого откроется новая вкладка сервисов, где в пункте «Servers» мы увидим наш активный сервер Tomcat

nb-active-serversПри при попытке развернуть пункт «Web Applications» выйдет диалоговое окно, которое потребует с нас логин и пароль. Вводим логин и пароль, которые мы устанавливали в процессе установки Tomcat

nb-active-servers-depl-appsи мы увидим все текущие, развернутые, проекты, которые есть у нас на сервере.

На этом все, интеграция закончена. Далее создаем проект Java EE «Hello World».

Создаем проект  развертываем на сервере

Идем в меню «File» > «New Project…»

choose-new-proj-typeВыбираем тип проекта из категории «Java Web» > «Web Application» и жмем «Next»

type-np-tomcat-proj-nameЗадаем имя проекта и жмем «Next»

type-np-tomcat-proj-serverВыбираем наш сервер, версию Java EE и жмем «Finish», так как фреймфорки мы не будем использовать для нашего простого примера.

Структура проекта состоит из нескольких папок

np-tomcat-hw-projВ папке «Web Pages» будут храниться фронтенд — файлы: html, JavaScript, CSS…в папке «META-INF» могут храниться дополнительные библиотеки, в папке «WEB-INF» могут храниться файлы конфигурации. При развертывании проекта сюда, обычно добавляется конфигурационный файл web.xml с дополнительными параметрами обработки запросов. Папке «Source Packages» буде наш Java EE — код, который будет обрабатывать запросы.

Давайте добавим новый пакет «helloworld» с классом «HelloWorld.java» в папке исходников «Source Packages». Кода класса дан ниже

 

package helloworld;
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
/**
 *
 * @author admin
 */
public class HelloWorld extends HttpServlet {
  public void doGet (HttpServletRequest req,
                     HttpServletResponse res)
    throws ServletException, IOException
  {
    PrintWriter out = res.getWriter();//Создаем поток вывода
    out.println("<html>");
        out.println("<head>");
            out.println("<title>");
                out.println("Hello World Page");//Заголовок страницы
            out.println("</title>");
        out.println("</head>");
    out.println("<body>");
        out.println("<center>");
            out.println("Hello, world!");//Выводим видимую чсть HTML
        out.println("</center>");
    out.println("</body>");
    out.println("</html>");
    out.close();//Закрываем поток вывода
  }
}

В папку «META-INF» добавляем фал конфигурации web.xml со следующим содержимым

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http:/java.sun.com/dtd/web-app_2_3.dtd">
    <welcome-file-list>
        <welcome-file>
            index.html
        </welcome-file>
    </welcome-file-list>
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>helloworld.HelloWorld</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello

Данный код сообщит нашему серверу, чтобы при обращении к странице http://localhost:8080/hello/ у нас был выполнен Java — код из класса HelloWorld.java.
Давайте, изменим и код файла index.html для наглядности перепишем его содержимое так

<!DOCTYPE html>
<html>
    <head>
        <title>Hello World!</title>
        <meta charset="UTF-8">
       <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <div>It is the "Hello World" Java EE project!</div>
    </body>
</html>

index.html будет запрошен по умолчанию при обращении к странице через обычный адрес http://localhost:8080/HelloWorld/, так как мы задали это правило через web.xml. В итоге наш проект получится вот таким

nb-tomcat-ready-project
Проект готов, нам осталось его построить, развернуть и запустить. Для этого наводим мышкой на имя проекта и ЛКМ

nb-tomcat-ready-build-depl-runвыбираем сначала пункт «Build», потом «Deploy», что значит «Развернуть», потом «Run» и среда запустит страницу в браузере через адрес http://localhost:8080/HelloWorld/. По умолчанию у нас запуститься index.html, так как мы еще задали еще одну страницу http://localhost:8080/HelloWorld/hello/ через web.xml, который обрабатывает созданный нами класс, то давайте взглянем и на ее результат

nb-tomcat-ready-class-resКак видим, все отлично работает и код Java запускается через наш сервер, выводя HTML — код в виде страницы.

Дистрибутив сервлета «*.war» и развертывание вне среды NetBeans

Выше мы описали как развернуть проект внутри среды IDE NetBeans, это удобно в процессе проектирования, но что, ели нам требует закинуть на сервер Tomcat уже готовый проект? Давайте рассмотрим это поподробнее. Когда мы строим проект через команду «Build», то NetBeans создает конечный файл — дистрибутив, который является законченной реализацией проекта. Данный дистрибутив доступен в 2-х видах в 2-х папках проекта, это:

  • HelloWorld\build\web;
  • HelloWorld\dist.

В папке «HelloWorld\build\web» проект находиться в разархивированном виде. Это уже рабочий сервлет(так называются программы Java EE), который можно уже закинуть на сервер, а в папке «HelloWorld\dist» дистрибутив находиться в виде «HelloWorld.war». Формат «*.war» — это обычный «*.zip» формат и можно открыть архиватором и внутри него будет тоже самое, что и в папке HelloWorld\build\web. Для запуска на сервере можно использовать оба, но в архиве используют когда запускают сервлет на удаленном сервере, так как это удобно, когда весь сайт закачивают одним архивом.

Давайте развернем дистрибутив на наш сервер вне среды и чтобы наш проект был доступен не через адрес http://localhost:8080/HelloWorld/, а через адрес http://localhost/. Для этого переходим в корневую папку Tomcat и в папку готовых сервлетов «C:\Program Files\Apache Software Foundation\Tomcat 8.0\webapps» в данной папке у нас будут подпапки

nb-tomcat-apps-dirДанные папки — это развернутые приложения(сервлеты) по умолчанию. Особо следует выделить папку ROOT. Данная папка содержит приложение, котрое буде запускаться по умолчанию, т.е. по адресу http://localhost:8080/   и мы должны наш дистрибутив закинуть туда, удалив ее содержимое. После того, как мы закинули содержимое дистрибутива нам необходимо указать серверу Tomcat на необходимость обрабатывать запросы через порт 80, а не через 8080. Это даст нам возможность обращаться к хосту по адресу http://localhost/ для этого открываем файл server.xml в папке «C:\Program Files\Apache Software Foundation\Tomcat 8.0\conf»  и заменяем порт 8080 на 80 в

    <Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

и не забываем перезапустить сервер Tomcat, чтобы изменения в конфигурациях порта вступили в силу, а то проект не запустится. После всех описанных операций мы можем зайти на наш сайт теперь по адресу http://localhost/

nb-tomcat-depl-proj-localhostНа этом запуск примера закончена! 🙂