我将对/ *的所有请求映射到特定的servlet。 我的静态内容被此配置隐藏。
如何允许访问特定文件(例如crossdomain.xml)?
答案 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。