Java сервлет 404 ошибка Tomcat 8, но не Tomcat 6
У меня есть сервер, который я переворачиваю между 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), а НЕ в файле war. Это сделано специально, поскольку позволяет быстро добавлять 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.2009 обновление: используя прослушиватель контекста сервлета, я получаю следующее для своего сервера разработки:
[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>
1 ответ
Хорошо, нашел ответ, и это так просто. Так что быстрый ответ, и чтобы избавить людей от моей ошибки, не просто проверяйте сопоставления в 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".