如何在具有默认 servlet 时允许访问静态内容



我将所有请求映射到/* 到特定的 servlet。我的静态内容被此配置隐藏。

如何允许访问特定文件(例如跨域.xml(?

当您将/* 映射到特定的 servlet 时,所有请求都将转发到该 servlet,除非您提供到另一个 servlet 的更明确的映射。

也就是说,如果你有/* 映射到 ServletA,并且/static/* 映射到 ServletB,那么下面的 Servlet 将被调用。

http://localhost:8080/abc.jpg            -> ServletA
http://localhost:8080/static/abc.jpg     -> ServletB
http://localhost:8080/xyz/abc.jpg        -> ServletA

因此,您有一个选择是编写一个 Servlet 来处理静态内容,它将获取文件并将其作为响应返回。您可以将该 servlet 映射到前缀为/static/* 之类的内容。这要求更新对静态文件的所有 URL 引用以包含此"/static"部分。

如果这对您来说不可行,那么您可能可以使用相同的 servlet,但映射到多个 URL 模式(可能通过扩展(,如下所示。

<servlet>
    <servlet-name>static-servlet</servlet-name>
    <servlet-class>xxx.yyy.StaticServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>static-servlet</servlet-name>
    <url-pattern>*.xml</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>static-servlet</servlet-name>
    <url-pattern>*.jpg</url-pattern>
</servlet-mapping>

如果您希望将其细粒度到每个文件的级别,也可以将 servlet 映射到您的文件 URL。

食谱:

  • 将控制器Servlet映射到更具体的url-pattern上,例如 /app/*
  • 将所有静态内容放在一个特定的文件夹中,例如 /static .
  • 创建一个映射到/*上的Filter,该透明地继续任何/static请求的链,并将其他请求分派给/app

所以,简而言之:

<filter>
    <filter-name>filter</filter-name>
    <filter-class>com.example.Filter</filter-class>
</filter>
<filter-mapping>
    <filter-name>filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
    <servlet-name>controller</servlet-name>
    <servlet-class>com.example.Controller</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>controller</servlet-name>
    <url-pattern>/pages/*</url-pattern>
</servlet-mapping>

过滤器doFilter()中具有以下内容:

String uri = ((HttpServletRequest) request).getRequestURI();
if (uri.startsWith("/static/")) {
    chain.doFilter(request, response); // Goes to default servlet.
} else {
    request.getRequestDispatcher("/app" + uri).forward(request, response);
}

不,您最终不会在 URL 中使用额外的/app路径。它是完全透明的。如有必要,请"/static"和/或"/app"过滤器的<init-param>

还有一个

像这样的(直接(servlet映射<servlet-mapping><servlet-name>StaticContentServlet</servlet-name><url-pattern>/crossdomain.xml</url-pattern></servlet-mapping>

也许您可以将静态内容放在不同的URL下,例如/static/*,然后将此URL映射到响应静态内容的Servlet。

最新更新