如何在使用默认servlet时允许访问静态内容

时间:2011-06-01 07:16:25

标签: java servlets

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

如何允许访问特定文件(例如crossdomain.xml)?

4 个答案:

答案 0 :(得分: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映射到类似/ 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 :(得分: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"过滤<init-param>

答案 2 :(得分:0)

还有一个(直接)servlet映射,如<servlet-mapping><servlet-name>StaticContentServlet</servlet-name><url-pattern>/crossdomain.xml</url-pattern></servlet-mapping>

答案 3 :(得分:0)

可能您可以将静态内容放在不同的URL(如/static/*)下,然后将此URL映射到使用静态内容响应的Servlet。