我相信你应该允许IIS提供静态文件。您可以让HttpModule(或您的过滤器)将控制权转移回IIS--这意味着安全执行代码可能需要被复制。另一种方法是将应用程序服务器传输控制权交还给IIS来为文件提供服务(安全检查当然会发生在之前)。最后,如您所概述的,您的应用程序服务器可以注入响应标头,然后httpmodule会读取它们并将控制权传递给IIS。不确定关于Java,但在.NET中,您可以使用HttpResponse.TransmitFile方法将控制权交还给IIS - 这应该避免需要制作HttpModule服务文件。
最后,为了进行缓存,您可以始终发出缓存标头,以响应降级(代理或客户端缓存)。如果文件正在改变,那么你可以添加文件依赖等。
编辑:不知道这是否会为你工作。创建一个http处理程序(ashx)并将其标记为IIS中所需的SSL。所有媒体文件将由此处理程序提供。该处理程序将文件作为查询参数。现在,您可以传递一些文件标识符或加密的部分路径(相对于配置的基本路径到文件存储区),以便实际的文件名或路径对用户不可见。您甚至可以制作在一段时间内过期的令牌(基本上,附加文件ID &时间戳并对其进行加密),以便用户不能再使用相同参数请求相同的文件。为处理程序的伪代码将是
void ProcessRequest(HttpContext context)
{
// read file id/name token
var token = context.Request["q"];
// validate/decrypt token etc and get the actual path for file to be served
string filePath;
// set needed response headers - content-type, content-disposition and cache related
...
// ask IIS to serve the file
context.Response.TransmitFile(filePath);
}
+1有关如何在应用程序服务器和IIS之间来回发送安全信息的任何建议(如果我有后者进行服务)?而且,如果我采用我提出的方法,它看起来像preSendRequestContent和preSendRequestHeaders可能是我想在httpmodule上使用的两种方法?而且,我可以通过IIS可以读取的响应头来发送信息? – orangepips 2010-12-13 11:32:55
在你提出的方法中,你的应用程序服务器将是一个Http处理程序,所以IMO可以在http模块中使用'PostRequestHandlerExecute' - 这意味着App Server已经完成了请求,并且可能添加了头文件来告诉你的模块此请求需要由IIS提供服务。另请参阅我的编辑替代方法。希望这可以帮助! – VinayC 2010-12-13 11:52:09