Java Servlet - 将servlet映射到除一个字符串以外的所有URL

11

我有一个Servlet配置为处理所有URL(*):

<servlet>
    <servlet-name>MyServ</servlet-name>
    <servlet-class>MyServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>MyServ</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

我需要让以/static/开头的URL从静态的WEB-INF中获取。也就是说,MyServ应该服务于除了/static之外的所有内容。

我该如何做到呢?


更新:澄清一下,我的要求是:

/*/ - 由MyServ处理
/static/dir/file.css - Jetty从/dir/中提供静态的file.css文件。

我不确定要在web.xml文件中怎么配置,也不知道在哪里放置静态文件。

我尝试添加了这个:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

但是,当我访问/static/ URL时,我只会得到:

HTTP ERROR 404

Problem accessing /static/dir/file.css. Reason: 
    Not Found

Powered by Jetty://

我不确定我的web.xml是否有误,还是我只是把文件放错了位置(我已经尝试将其放在src/main/webappsrc/main/webapp/lib/META-INF/resources/下)。


Jetty

我正在使用Jetty。 我想避免使用任何其他层,如Nginx、Apache等。

为了赢得悬赏,请确保您的答案适用于Jetty。


https://dev59.com/hHA75IYBdhLWcg3wv77A - Rocky Pulley
6个回答

5
您最好的选择可能是在 * 规则之前为静态资源设置一个规则。
URL路径映射规则:
按以下顺序使用。第一个成功匹配将被使用,不再进行尝试。
1. 容器将尝试找到请求路径与servlet路径的精确匹配。匹配成功将选择该servlet。 2. 容器将递归地尝试匹配最长的路径前缀。通过每次一级目录步进路径树,使用 '/' 字符作为路径分隔符来完成。最长匹配决定所选的servlet。 3. 如果URL路径中的最后一段包含扩展名(例如.jsp),则servlet容器将尝试匹配处理该扩展名的servlet。扩展名定义为最后一个 '.' 字符之后的部分。 4. 如果前三条规则都没有结果,则容器将尝试提供适合所请求资源的内容。如果应用程序定义了“默认”servlet,则将使用它。
因此,它将匹配 /static/ 规则,并停止匹配。

谢谢 - 但是什么类型的规则会告诉它使用本地资源?它不是一个servlet,只是静态文件。 - SRobertJames

4
您的问题可以通过使用Nginx解决。Nginx可以提供静态内容,如HTML文件、图像(.jpg, .png, .gif)、样式表(.css)和JavaScript文件(.js)。这些文件不需要经过Web服务器处理,Nginx会完成这项工作。
server {
  listen          80;
  server_name     YOUR_DOMAIN;
  root            /PATH/TO/YOUR/WEB/APPLICATION;
  location / {
    index index.jsp;
  }
  location ~ \.jsp$ {
    proxy_pass              http://localhost:8080;
  }
  location ^~/servlets/* {
    proxy_pass              http://localhost:8080;
  }
}

3

如果您要提供静态内容,甚至不需要使用servlet。您可以将静态内容放在一个文件夹中,该文件夹可以直接通过您的服务器访问。

例如,如果您的应用程序名称为TestApp,那么您可以将内容放在TestApp/static/dir目录中。基于此,您的目录结构应如下所示:

TestApp
   |
   |_____ WEB-INF
   |
   |_____ static
             |
             |____ dir

通过上述目录结构,您所有的静态内容(如Sample.css)将可以通过以下URL进行访问:
/TestApp/static/dir/Sample.css

请查看此问题以获取更多信息:如何从Tomcat提供静态内容 请注意,这样做将使您的静态目录对所有人开放,没有任何限制,这意味着任何人都可以在没有任何身份验证的情况下访问您的静态内容。但是,由于这是您的静态内容,我认为这没关系,除非您有任何理由要求限制访问权限。

1
首先,“WEB-INF”目录中的文件无法直接通过Web访问。
此外,我注意到您的条目“src/main/webapp/lib/META-INF/resources/”没有包括已提取的WAR目录,即Web应用程序文件夹。
例如:src/main/webapp/[WAR文件夹]/lib/META-INF/resources/
我假设您正在使用Tomcat。因此,在创建WAR文件后,请将其放入“webapp”目录中,然后启动Tomcat。WAR文件应该会被提取到与WAR文件同名的Web应用程序文件夹中。现在,您可以从浏览器访问“WEB-INF”之外的任何文件。
例如: localhost:8080/[web app folder name]/[some file] 希望这能帮到您,

1
将您的静态内容放入 webapp 目录中。这部分可以直接访问,使用 localhost:port/yourAppName/ResourceName

0

根据我的经验(正如Srinivasu Talluri所建议的),反向代理是解决您问题的答案。

您可以使用Nginx 查看详细配置 或配置Apache作为反向代理。

通过Nginx提供静态内容的详细配置可以在这里找到。

当静态内容由Web服务器本身处理时,您的Servlet配置可以按原样使用。因此,您的Servlet将仅提供动态资源。

希望能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接