如何在具有默认servlet的情况下允许访问静态内容

3
我将所有请求映射到特定的servlet上。 这种配置隐藏了我的静态内容。
如何允许访问特定的文件(例如crossdomain.xml)?
4个回答

2
当您将 /* 映射到特定的 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将获取文件并将其作为响应返回。 您可以将该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。

1

示范:

  • 将您的控制器 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作为过滤器的。

0

还有一个直接的Servlet映射,像这样<servlet-mapping><servlet-name>StaticContentServlet</servlet-name><url-pattern>/crossdomain.xml</url-pattern></servlet-mapping>


0

可能你可以将你的静态内容放置在不同的URL下,例如/static/*,然后将此URL映射到一个Servlet,以响应静态内容。


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