Читает ли Tomcat 8 файлы web.xml и context.xml в моем Java Rest API (война)?

Пожалуйста, не могли бы вы помочь? Я создал проект Java Rest API (Dynamic Web) в Eclipse, при необходимости включил библиотеки Javax и Jersey и развернул его на своем облачном сервере Tomcat 8. Он возвращает базовый ответ JSON, когда я вызываю его через HTTP, например. http://www.mydomain.co.uk:8080/MyJavaProject/context_string/path_params

Но когда я включил SSL / TLS на сервере с подлинным сертификатом, он выдает ошибку 404 Not Found in Postman.

https://www.mydomain.co.uk/MyJavaProject/context_string/path_params

Error.log показывает ошибку "файл не существует" в "/ path / MyJavaProject / context_string / path_params" (но файл не существует в качестве ссылочного параметра в моем остальном api, поэтому я не думаю, что Tomcat знает, как использовать файл WAR).

Я получаю навигатор по структуре каталогов, если вызываю просто: https://www.mydomain.co.uk/MyJavaProject

Журналы все в порядке и ошибок сейчас нет. Я слежу за бесчисленными сообщениями на форуме о настройках, но ни одна из них не работает. Я поместил значения безопасности в свой файл web.xml в свои приложения WEB-INF. Разрешения на папку war and the wars exploded 777.

Но я читал, что в этой области используется что-то под названием context.xml, но может или не может использоваться, если установлено autoDeploy-true (у меня).

Итак ... у меня вопрос, как я могу узнать, действительно ли Tomcat читает context.xml и web.xml в моем приложении? Никаких хороших уловок. Это моя последняя идея, чтобы попытаться решить мою ошибку 404.

Мои приложения web.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns = "http://java.sun.com/xml/ns/javaee" xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id = "WebApp_ID" version = "3.0">
  <display-name>MyProject</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>ServletAdaptor</servlet-name>
    <servlet-class>
com.sun.jersey.server.impl.container.servlet.ServletAdaptor</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletAdaptor</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
  <security-constraint>
<web-resource-collection>
<web-resource-name>MyProject</web-resource-name>
<url-pattern>/context_string/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
</web-app>

Мои приложения context.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<Context docBase = "" path = "" reloadable = "true">
</Context>

Большое спасибо

Расскажите подробнее о вашей настройке. Включили ли вы HTTPS на tomcat или на сервере переднего плана, расположенном перед tomcat?

RaviH 23.05.2018 09:56

Я считаю, что включил сам Tomcat. Настройте * .443 VirtualHost в файле conf, а также коннекторы 8443 в server.xml, как указано в сообщениях форума. Когда я ввожу URL-адрес в браузере (откуда я получаю структуру директорий файлов WAR), он отображается как «Безопасный», и я вижу, что используется правильный сертификат.

Think.Smart 23.05.2018 10:17

Конфликт в номерах портов. Либо используйте 8443 как в VirtualHost, так и в коннекторах, либо используйте 443 как в VirtualHost, так и в коннекторах.

RaviH 23.05.2018 10:23

Я заменил 8443 на 443 в .conf, но разницы не заметил

Think.Smart 23.05.2018 23:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
3 877
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужно использовать обратный прокси в apache2 или nginx, что бы вы ни использовали для внутреннего перенаправления запросов на tomcat.

https использует порт 443 по умолчанию на сервере. Итак, вам нужно либо определить новый порт с https, либо перенаправить его. Прочтите это и это, чтобы изменить apache2.

Это больше похоже на комментарий, но я не могу добавить комментарий.

Я попробую это. Вчера вечером я видел сообщение, в котором у кого-то были теги «обратного прокси» в (я думаю, это были) conf файле, так что я попробую. Спасибо

Think.Smart 23.05.2018 10:18

Реализовал это, и это заставило ошибку исчезнуть в error.log. Конфигурация Systemctl показывает, что все в порядке. Все журналы выглядят счастливыми. Я вижу, что изменения значения обратного прокси изменяют ошибку браузера 404. Но 404 все еще там, когда я использую Postman. Я все еще думаю, что что-то не хватает в моем web.xml или (теперь удаленном) context.xml. Спасибо

Think.Smart 23.05.2018 20:46
Ответ принят как подходящий

Решил проблему, используя оба комментария к этому звонку.

  1. Произошел конфликт портов, поэтому я изменил и server.xml, и apache2 /../ 000default.conf, чтобы использовать 8443 (я обнаружил, что 443 темпераментны). Следуя этому, я теперь включаю «8443» в качестве порта во все мои URL-вызовы, а не без порта.

  2. Я добавил это в файл .conf:

    SSLProxyEngine включен

    ProxyPass / MyProject / context https://www.mydomain.co.uk/MyProject/context

    ProxyPassReverse / MyProject / context https://www.mydomain.co.uk/MyProject/context

  3. Пришлось также a2enmod proxy_http а также установите для тега VirtualHost значение ip, а не '*', то есть ipaddress.8443 и для хорошей оценки проверьте, что он работает, используя

конфигурация apache2ctl

На самом деле я не особо много работал с web.xml в своем приложении, и я удалил context.xml из своего приложения.

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

Вот мои файлы для справки

apache2 / .. conf

<VirtualHost ipaddress:8443>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>

        LogLevel debug
        #SetEnv HTTPS on
        SSLEngine on
        SSLCertificateFile /etc/ssl/certs/mydomain_co_uk.crt
        SSLCertificateKeyFile /etc/ssl/private/www.mydomain.co.uk.key
       # SSLCertificateKeyFile /etc/ssl/certs/mydomain_co_uk.pem
        SSLCACertificateFile /etc/ssl/certs/mydomain_co_uk.ca-bundle
        ServerName www.mydomain.co.uk
SSLProxyEngine on
    ProxyPass /MyProject/context https://www.mydomain.co.uk/MyProject/context 
    ProxyPassReverse /MyProject/context https://www.mydomain.co.uk/MyProject/context

Alias /ProjectName"/var/lib/tomcat8/webapps/ProjectName"


<Directory "/var/lib/tomcat8/webapps/ProjectName">
Options Indexes FollowSymLinks
AllowOverride all
Allow from all
</Directory>



<Location />
Require all granted
</Location>



        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

Server.xml

<Connector
           protocol = "org.apache.coyote.http11.Http11AprProtocol"
           port = "8443" maxThreads = "200" clientAuth = "false"
           scheme = "https" secure = "true" SSLEnabled = "true"
           SSLCertificateFile = "/etc/ssl/certs/mydomain_co_uk.crt"
           SSLCertificateKeyFile = "/etc/ssl/private/www.mydomain.co.uk.key"
           SSLPassword = "planetx"
           SSLVerifyClient = "optional" SSLProtocol = "TLSv1+TLSv1.1+TLSv1.2"/>


    <Engine name = "Catalina" defaultHost = "localhost">

      <!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html  (simple how to)
          /docs/config/cluster.html (reference documentation) -->
      <!--
      <Cluster className = "org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->

      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
      <Realm className = "org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className = "org.apache.catalina.realm.UserDatabaseRealm"
               resourceName = "UserDatabase"/>
      </Realm>

      <Host name = "localhost"  appBase = "webapps"
            unpackWARs = "true" autoDeploy = "true">
        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className = "org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern = "common" -->
        <Valve className = "org.apache.catalina.valves.AccessLogValve" directory = "logs"
               prefix = "localhost_access_log" suffix = ".txt"
               pattern = "%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>
    </Engine>
  </Service>
</Server>

web.xml из моих приложений web-inf

<?xml version = "1.0" encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns = "http://java.sun.com/xml/ns/javaee" xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id = "WebApp_ID" version = "3.0">
  <display-name>Projectname</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>ServletAdaptor</servlet-name>
    <servlet-class>
com.sun.jersey.server.impl.container.servlet.ServletAdaptor</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletAdaptor</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
  <security-constraint>
<web-resource-collection>
<web-resource-name>Projectname</web-resource-name>
<url-pattern>/context</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
</web-app>

ИМХО - это не так сложно, если вы понимаете прокси, обратный прокси, коннекторы, их порты и то, как их организовать для достижения конечного результата.

RaviH 24.05.2018 16:53

Другие вопросы по теме