我们试图解决的任务是使用 HttpService.registerResources() 为在 OSGi 环境中公开的静态资源(例如 Cache-Control
)设置自定义响应头。方法。
考虑到以下详细信息,实现此目标的最佳方式是什么:
- 可能有许多基于“资源”服务集的资源注册。这些 OSGi 服务提供有关静态资源路径和它们所在的包的信息。我们预计资源路径注册量在 50 到 200 之间。
- 实现应该是 OSGi 友好的。 Pax Web extensions 的用法是可以接受的。
- 实现应与网络服务器无关(例如,不直接了解 Jetty)。
我们想到的解决方案是:
在 HttpContext.handleSecurity 中设置响应 header
- 这种方法的缺点是处理安全性的方法也将负责与安全性完全无关的逻辑。
使用与资源 URI 相同的 URI 为每个
registerResource()
调用注册过滤器。过滤器将响应设置响应 header 。- 这种方法的缺点是可能有太多过滤器用于同一目的。但到目前为止,这似乎是最简单的解决方案。
在根路径上注册一个过滤器并将其配置为在请求 URI 对应于已知资源 URI 路径时设置响应 header 。
- 这种方法的缺点是必须对过滤器进行训练以了解资源路径,这意味着实现起来会稍微复杂一些。
我们渴望听到对建议解决方案的意见,并了解其他替代方案。
最佳答案
基于 Equinox Jetty 的 HttpService 实现已经支持开箱即用的所有资源注册的 If-None-Match
和 If-Modified-Since
请求 header 。
但是,如果它确实需要与框架无关并符合 HttpService 标准,并且您无论如何都以编程方式注册您的资源,那么我建议编写您自己的 servlet(例如 the one from Equinox)来处理资源请求。而不是使用 registerResources
直接使用此 servlet 和 registerServlet
包装任何资源注册。您可以在那里实现任何缓存策略。
关于caching - 为 OSGi 环境中服务的静态资源设置自定义响应 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11826853/