我有一个 Filter Servlet,用于过滤来自 Servlet 的请求。我不想对图像请求执行某些操作,因此我有以下代码:
if (baseURL.endsWith("png"))
{
chain.doFilter(servletrequest, servletresponse);
}
在过滤器的doFilter
方法上,我不做任何事情,只是调用chain.doFilter
,我期望响应图像能够正确发送然而在客户端中,返回的 Content-Type
是 "application/octet-stream"
而不是 "image/png"
知道为什么会发生这种情况吗?
最佳答案
I have a Filter Servlet that filters request from a Servlet. I do not want to do something on a request for a Image
如果 URL 模式也与请求 URL 匹配,FilterChain#doFilter()
不会阻止请求最终出现在您的 servlet 中。您似乎认为情况就是如此。因此这是不正确的。
如果您不希望图像请求最终出现在您的 servlet 中,那么您必须将 servlet 映射到更具体的 URL 模式。例如,/app/*
而不是 /*
。然后您可以按如下方式过滤请求:
if (httpServletRequest.getRequestURI().endsWith(".png")) {
chain.doFilter(request, response);
}
else {
request.getRequestDispatcher("/app" + httpServletRequest.getRequestURI()).forward(request, response);
}
/*
的 URL 模式不应在 servlet 上使用,而只能在过滤器上使用。
此外,默认情况下已根据文件扩展名自动确定内容类型。我假设您确实拥有 some.png
资源,而不是 somepng
资源,因为您的初始 endsWith()
参数值也会匹配。
另请参阅:
关于java - 过滤 servlet 导致图像不显示在客户端上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9924842/