У меня есть сервер, который я переключаю между tomcat 6 и tomcat 8. Когда я отправляю сообщение HTTP с помощью команды
curl -v -X POST -d @webOpenCnsRealCheatsheet.xml -H Referrer:mobileWMS,LLC -H Content-Type:text/xml http://localhost:8080/fortive2/tsmService
Я получаю разные результаты между разными версиями tomcat.
Прежде всего, для tomcat 8 я получаю:
* About to connect() to localhost port 8080 (#0)
* Trying ::1... connected
* Connected to localhost (::1) port 8080 (#0)
> POST /fortive2/tsmService HTTP/1.1
> User-Agent: curl/7.19.7 (i386-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: localhost:8080
> Accept: */*
> Referrer:mobileWMS,LLC
> Content-Type:text/xml
> Content-Length: 218
>
< HTTP/1.1 404
< Content-Length: 0
< Date: Mon, 20 May 2019 16:17:36 GMT
<
* Connection #0 to host localhost left intact
* Closing connection #0
Затем для tomcat 6 я получаю правильный ответ, без ошибки 404. Что происходит? Это буквально тот же сервер, тот же файл WAR. Мои сервлеты определены в основном файле tomcat web.xml ($ CATALINA_HOME / conf / web.xml), а НЕ в файле войны. Это сделано специально, так как это позволяет мне быстро добавлять URL-адреса веб-сервисов для новых клиентов, не изменяя файл war.
Кроме того, я скажу, что несколько веб-приложений ссылаются на один и тот же файл войны (несколько клиентов, поэтому несколько веб-сайтов с небольшими разными конфигурациями, но с одним и тем же пользовательским интерфейсом). Это всегда отлично работало для сервлетов в Tomcat 6, поэтому я просто предположил, что это будет работать и для Tomcat 8. Может ли это вызвать проблему?
Кроме того, в качестве дополнительной точки я могу легко получить доступ к порту 8080 в браузере, потому что именно так я иногда попадаю на веб-сайт или в диспетчер tomcat (когда SSL дает мне проблемы с сертификатами). Так что это не порт.
Кроме того, в качестве дополнительной информации у меня есть это для ОДНОГО из моих сервлетов (не того, который я использую, совершенно другого сервлета):
@WebServlet(urlPatterns = "/*", name = "WmsServlet", asyncSupported = true)
@VaadinServletConfiguration(ui = WmsUI.class, productionMode = false)
@SuppressWarnings("serial")
public class WmsServlet extends VaadinServlet {
@Override
protected final void servletInitialized() throws ServletException {
super.servletInitialized();
getService().addSessionInitListener(new WmsSessionInitListener());
}
}
А вот несколько примеров конфигураций сервлета $ CATALINA_HOME / conf / web.xml:
<servlet>
<servlet-name>veeder-ws</servlet-name>
<servlet-class>com.wmsvision.servlet.WMSProcessorServlet</servlet-class>
<init-param>
<param-name>socketType</param-name>
<param-value>VEEDER-WS</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>spence-ws</servlet-name>
<servlet-class>com.wmsvision.servlet.WMSProcessorServlet</servlet-class>
<init-param>
<param-name>socketType</param-name>
<param-value>SPENCE-WS</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>veeder-ws</servlet-name>
<url-pattern>/veeder-ws/tsmService</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>spence-ws</servlet-name>
<url-pattern>/spence-ws/tsmService</url-pattern>
</servlet-mapping>
Обновление 21.05.2019: используя прослушиватель контекста сервлета, я получаю для своего сервера разработки следующее:
[2019-05-21 13:11:47 EDT] FINE com.mobiwms.website.WmsContextListener logCurrentServlets Servlet name: WMSWebsite-NEWCUST; Mappings: /NEWCUST-WebsiteXML
[2019-05-21 13:11:47 EDT] FINE com.mobiwms.website.WmsContextListener logCurrentServlets Servlet name: default; Mappings: /
[2019-05-21 13:11:47 EDT] FINE com.mobiwms.website.WmsContextListener logCurrentServlets Servlet name: WmsServlet; Mappings: /*
[2019-05-21 13:11:47 EDT] FINE com.mobiwms.website.WmsContextListener logCurrentServlets Servlet name: FortivePFC; Mappings: /Fortive-PFC
[2019-05-21 13:11:47 EDT] FINE com.mobiwms.website.WmsContextListener logCurrentServlets Servlet name: Fortive3; Mappings: /fortive3/tsmService
[2019-05-21 13:11:47 EDT] FINE com.mobiwms.website.WmsContextListener logCurrentServlets Servlet name: jsp; Mappings: *.jspx, *.jsp
[2019-05-21 13:11:47 EDT] FINE com.mobiwms.website.WmsContextListener logCurrentServlets Servlet name: Fortive2; Mappings: /fortive2/tsmService
[2019-05-21 13:11:47 EDT] FINE com.mobiwms.website.WmsContextListener logCurrentServlets Servlet name: WMSWebsite-NEWCUST2; Mappings: /NEWCUST2-WebsiteXML
И разделы сервлетов глобального web.xml (то есть $ CATALINA_HOME / conf / web.xml) для моей машины разработчика, на которой был напечатан вышеуказанный журнал:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- snipped unrelated config -->
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- snipped unrelated config -->
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<!-- snipped unrelated config -->
<!-- ================ Built In Servlet Mappings ========================= -->
<!-- The servlet mappings for the built in servlets defined above. Note -->
<!-- that, by default, the CGI and SSI servlets are *not* mapped. You -->
<!-- must uncomment these mappings (or add them to your application's own -->
<!-- web.xml deployment descriptor) to enable these services -->
<!-- The mapping for the default servlet -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
<!-- snipped unrelated config -->
<!-- ==================== Custom WMS servlet setup ===================== -->
<servlet>
<servlet-name>FortivePFC</servlet-name>
<servlet-class>com.wmsvision.servlet.WMSProcessorServlet</servlet-class>
<init-param>
<param-name>socketType</param-name>
<param-value>Fortive_PFC</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>Fortive2</servlet-name>
<servlet-class>com.wmsvision.servlet.WMSProcessorServlet</servlet-class>
<init-param>
<param-name>socketType</param-name>
<param-value>Fortive2</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>Fortive3</servlet-name>
<servlet-class>com.wmsvision.servlet.WMSProcessorServlet</servlet-class>
<init-param>
<param-name>socketType</param-name>
<param-value>Fortive3</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>WMSWebsite-NEWCUST</servlet-name>
<servlet-class>com.wmsvision.servlet.WMSWebsiteServlet</servlet-class>
<init-param>
<param-name>socketType</param-name>
<param-value>WMSWebsite-NEWCUST</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>WMSWebsite-NEWCUST2</servlet-name>
<servlet-class>com.wmsvision.servlet.WMSWebsiteServlet</servlet-class>
<init-param>
<param-name>socketType</param-name>
<param-value>WMSWebsite-NEWCUST2</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>FortivePFC</servlet-name>
<url-pattern>/Fortive-PFC</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Fortive2</servlet-name>
<!-- <url-pattern>/turnsmith/tsmService</url-pattern>-->
<url-pattern>/fortive2/tsmService</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Fortive3</servlet-name>
<!-- <url-pattern>/NEWCUST/tsmService</url-pattern>-->
<url-pattern>/fortive3/tsmService</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>WMSWebsite-NEWCUST</servlet-name>
<url-pattern>/NEWCUST-WebsiteXML</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>WMSWebsite-NEWCUST2</servlet-name>
<url-pattern>/NEWCUST2-WebsiteXML</url-pattern>
</servlet-mapping>
</web-app>
Хорошо, нашел ответ, и это так просто. Так что быстрый ответ, и чтобы уберечь людей от моей ошибки, не просто проверяйте сопоставления в web.xml, убедитесь, что контекст присутствует, или убедитесь, что ваш URL-адрес включает допустимый контекст. Поэтому, если вы не включаете контекст в URL-адрес, убедитесь, что там есть конфигурация ROOT.xml.
Итак, чтобы быть более конкретным, в моем случае я удалил $ CATALINA_HOME / conf / Catalina / localhost / ROOT.xml, но отправлял в корневой контекст. Итак, с моим тестом выше,
curl -v -X POST -d @webOpenCnsRealCheatsheet.xml -H Referrer:mobileWMS,LLC -H Content-Type:text/xml http://localhost:8080/fortive2/tsmService
"fortive2" НЕ является контекстом, это часть моей ссылки на сервлет. Вы можете увидеть это в моих фрагментах web.xml. Поскольку в конфигурации tomcat8 не было ROOT.xml, ошибка 404 была невозможна. Но tomcat6 работал, потому что я никогда не удалял ROOT.xml из этого каталога "localhost".