【问题标题】:How can I configure web.xml url-pattern to get specified location?如何配置 web.xml url-pattern 以获取指定位置?
【发布时间】:2013-09-25 12:00:16
【问题描述】:

我想使用“ProjectsServlet”处理对/Projects/Projects/SomeProject/ 的请求,但在访问/Projects/SomePath/SomeOtherSubPath 时返回404 错误代码。

项目名称经常更新,所以我不想每次发生时都重写我的 Servlet 代码,我已经编写了项目名称的简单解析器,并且 servlet 会加载指定的页面(如果存在)。

那么如何在 web.xml 中编写配置?现在看起来像:

<servlet>
  <servlet-name>ProjectsServlet</servlet-name>
  <servlet-class>com.example.ProjectsServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>ProjectsServlet</servlet-name>
  <url-pattern>/Projects/*</url-pattern>
</servlet-mapping>

但它也试图处理“项目”根目录/Projects/.../...之后的所有请求

在最好的情况下,我想写这样的映射:

<servlet-mapping>
  <servlet-name>ProjectsServlet</servlet-name>
  <url-pattern>/Projects</url-pattern>
  <url-pattern>/Projects/*/</url-pattern>
</servlet-mapping>

但这是不正确的。我该怎么做?

【问题讨论】:

    标签: jakarta-ee tomcat servlets web.xml


    【解决方案1】:

    根据我对问题的理解:

    如果你想要的东西是

      <servlet-mapping>
        <servlet-name>ProjectsServlet</servlet-name>
       <url-pattern>/Projects</url-pattern>
       <url-pattern>/Projects/*/</url-pattern>
     </servlet-mapping>
    

    您可以使用两个 Servlet 映射:

        <servlet-mapping>
          <servlet-name>ProjectsServlet</servlet-name>
           <url-pattern>/Projects</url-pattern>
       </servlet-mapping>   
        <servlet-mapping>
           <servlet-name>ProjectsServlet</servlet-name>
          <url-pattern>/Projects/*/</url-pattern>
       </servlet-mapping> 
    

    您还可以为“/Projects/*/”之类的 url 映射到过滤器(ProjectsServletFilter),并在此过滤器中处理请求(在此处决定是否需要发送 404 或继续链接到另一个 servlet 等)。

      <filter>
        <filter-name>ProjectsServletFilter</filter-name>
        <display-name>ProjectsServletFilter</display-name>
        <filter-class>ProjectsServletFilter</filter-class>
      </filter>
     <filter-mapping>
        <filter-name>ProjectsServletFilter</filter-name>
        <url-pattern>/Projects/*/</url-pattern>
    </filter-mapping>
    

    无论如何,如果上面的过滤器(ProjectsServletFilter)执行成功而没有返回任何404错误代码等,“/Projects” url servlet 将被执行。

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      您不能将多个 url 模式放入一个 servlet 映射中。您需要多个 servlet-mappings 具有相同的 servlet-name 但不同的 url-pattern。

      我的建议是将您的 servlet 映射到所有 /Projects/* URL 并实现简单的 servlet 过滤器,它将为任何带有子路径的 URL 返回 404(此检查也可以在您的 servlet 中进行,但如果您无法修改servlet,使用过滤器)。

      【讨论】:

        猜你喜欢
        • 2018-08-06
        • 1970-01-01
        • 1970-01-01
        • 2020-03-27
        • 1970-01-01
        • 1970-01-01
        • 2013-05-18
        • 1970-01-01
        相关资源
        最近更新 更多