我有一个过滤Servlet,用于过滤来自Servlet的请求。我不想对Image的请求做一些事情,所以我有这样的代码:
if (baseURL.endsWith("png"))
{
chain.doFilter(servletrequest, servletresponse);
}
在过滤器的doFilter
方法中,我没有做任何事情而只是调用chain.doFilter
,我希望响应图像将在客户端中正确发送,但是{{1返回的是Content-Type
而不是"application/octet-stream"
知道为什么会这样吗?
答案 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);
}