Servlet 无法使用 Tomcat 8 中的某些路径

Servlet not working with some paths in Tomcat 8

我需要为我的应用程序中的所有 PDF 文件设置 content-disposition header 响应。所以我认为最好的方法是使用 servlet:

public class PdfServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("---> Servlet working");
    //Some code here
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    System.out.println("---> Servlet working");
    //Some code here
}

}

我这样配置我的应用 web.xml:

<servlet>
    <servlet-name>pdfServlet</servlet-name>
    <servlet-class>net.universia.pymes.servlets.PdfServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>pdfServlet</servlet-name>
    <url-pattern>*.pdf</url-pattern>
</servlet-mapping>

我需要获取的 PDF 是在 {TOMCAT_HOME}/webapps/resources/files/*.pdf 中发布的静态文件,问题是当我指出 Url (localhost:8080/resources/files/myPDF.pdf) 在浏览器中,servlet 不打印任何内容,它不调用 servlet。但是当我从浏览器中点击 docbase 文件夹中的 PDF 时,{TOMCAT_HOME}/webapps/FRONTEND_BANCO_CO/res/myPDF.pdf --> localhost:8080/res/myPDF.pdf,它确实有效,它打印我在 doGet() 方法中的消息。即使我点击了一个不存在但最后有 .pdf 的 url,它也会执行 servlet 并正常工作。

我尝试将资源文件夹从 {TOMCAT_HOME}/webapps/resources/ 移动到 {TOMCAT_HOME}/webapps/FRONTEND_BANCO_CO/resources/ 并且成功了。所以我得出结论,它与 server.xml:

中上下文标记中的路径属性有关
<Context path="" reloadable="true" docBase="FRONTEND_BANCO_CO"></Context>

我无法更改路径属性,所以这不是一个选项。我也不能将资源文件夹留在 docbase 文件夹中。有什么建议吗? 请帮忙,我整天都被这个问题困住了:'(

是的,网络应用程序是独立的应用程序。一般来说,一个应用程序真的不知道另一个应用程序。 Tomcat 中 webapps 下的每个 文件夹都是一个不同的应用程序

你有三个选择:

  1. 使文件夹 resources 成为一个完整的 webapp(至少有一个 WEB-INF 目录)并且 link 到 /resources/files/myPDF.pdf.
  2. 将 PDF 移动到您的网络应用程序下,我相信您说的是不可能的。
  3. 获取您的 webapp 的文件源路径并创建一个可以发送这些文件的文件服务器 servlet。

最简单的选项是 1。您没有提及任何关于安全性的内容(这意味着 任何人 都可以访问您服务器上的 /resources)但最简单的是在 resources 目录下创建一个 WEB-INF/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">
</web-app>

现在您应该可以点击 http:://localhost:8080/resources/files/myPDF.pdf,因为 resources 目录现在是一个 JEE 网络应用程序。

如果您需要修改默认值 HttpResponse,那么您还需要 resources 网络应用中的一些代码。