过滤servlet导致图像不显示在客户端上

时间:2012-03-29 11:56:38

标签: java servlets

我有一个过滤Servlet,用于过滤来自Servlet的请求。我不想对Image的请求做一些事情,所以我有这样的代码:

if (baseURL.endsWith("png")) 
{
 chain.doFilter(servletrequest, servletresponse);
}

在过滤器的doFilter方法中,我没有做任何事情而只是调用chain.doFilter,我希望响应图像将在客户端中正确发送,但是{{1返回的是Content-Type而不是"application/octet-stream"

知道为什么会这样吗?

3 个答案:

答案 0 :(得分:2)

  

我有一个过滤Servlet来过滤来自Servlet的请求。我不想在请求图像

时执行某些操作

FilterChain#doFilter()如果其URL模式也与请求URL匹配,则不会阻止请求在servlet中结束。你似乎在想这就是这种情况。因此这是不正确的。

如果您不希望图像请求最终出现在您的servlet中,则必须将servlet映射到更具体的URL模式。例如,/app/*而不是/*。然后,您可以按如下方式过滤请求:

if (httpServletRequest.getRequestURI().endsWith(".png")) {
    chain.doFilter(request, response);
}
else {
    request.getRequestDispatcher("/app" + httpServletRequest.getRequestURI()).forward(request, response);
}

/*的网址格式不应在servlet上使用,而应仅在过滤器上使用。

此外,默认情况下,内容类型已根据文件扩展名自动确定。我假设您确实拥有some.png资源,而不是somepng资源,因为您的初始endsWith()参数值也会匹配。

另见:

答案 1 :(得分:1)

发出return;声明

if (baseURL.endsWith("png")) 
{
 chain.doFilter(servletrequest, servletresponse);
 return;
}

答案 2 :(得分:1)

您应该从过滤器链中退出并设置内容类型:

    if(baseURL.endsWith("png")) {
        response.setContentType("image/png");
    } else {
        chain.doFilter(request, response);
    }