Stripes 1.5:在 Tomcat 上运行 - 控制 HTTP(缓存控制)标头的最佳方法?

发布于 2024-10-07 12:04:27 字数 922 浏览 3 评论 0原文

目前,我正在使用此处描述的 Servlet 过滤器的修改版本:

http://onjava.com/pub/a/onjava/2004/03/03/filters.html

并将其连接到 stripes 调度程序 servlet,如下所示:

 <filter-mapping>
        <filter-name>CacheControl</filter-name>
        <servlet-name>StripesDispatcher</servlet-name>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

哪个有效:但具有控制所有内容的效果我的内容 - 我如何才能在每个 JSP 和/或每个 actionBean 方法的基础上进行控制?

我打算尝试扩展“ForwardResolution”并在此处注入,但似乎无法在我自己的包结构中执行此操作? (我认为受保护的构造函数)。

我的另外两个想法(我不太喜欢听起来)是: 在

  1. 调用 ActionBean 的所有 JSP 上创建一个随机缓存键(从而使缓存控制无效 - 实际上)。
  2. 传入一个 HTTP 参数,然后我可以在 CacheControl 过滤器中检查该参数是否添加到缓存控制标头中。
  3. 我可以将该指令添加到我的 JSP 中吗?推荐的方法是什么?

[顺便说一句,似乎每次调用我的过滤器都会被调用两次...这可能是我将过滤器连接到 stripes servlet 的方式的副作用吗?]

Currently I'm using a modified version of a Servlet Filter described here:

http://onjava.com/pub/a/onjava/2004/03/03/filters.html

And have hooked it up to the stripes dispatcher servlet like this:

 <filter-mapping>
        <filter-name>CacheControl</filter-name>
        <servlet-name>StripesDispatcher</servlet-name>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

Which works: but has the effect of controlling all my content - how could I get control on a per JSP basis and/or a per actionBean method basis ?

I was going to try and extend 'ForwardResolution' and inject here, but don't seem to be able to do this in my own package-structure ? (Protected constructor I think).

Two other ideas I had (which I don't particular like the sound of) are:

  1. Creating a random cache key on all JSPs which call into the ActionBean (thereby invalidating the cache control - in effect).
  2. Passing in a HTTP parameter, which I can then check for in the CacheControl Filter as to whether to add in the cache-control headers.
  3. Can I just add the directive to my JSPs ? What's the recommended way of doing this.

[as an aside, it appears that my filter is being invoked twice for every invocation...is this a side-effect of the way I have hooked up a filter to the stripes servlet maybe?]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心房敞 2024-10-14 12:04:27

我将向后开始 - 您的过滤器被调用两次,可能是因为同一页面请求两个资源 - 例如页面和 css。或者进行 ajax 调用。

然后,如果您想控制每个请求的资源的缓存,这里有一个仅包含两个 servlet 的解决方案。我不知道条纹,所以可能有更好的:

  • 创建一个实用程序类+方法,例如CacheUtils.addCacheHeaders(response)。在此方法中,将所有缓存标头添加到响应中。在您喜欢的任何地方调用它 - 一行用于添加缓存。这是一种编程方法

  • 在过滤器的init-param 中定义请求 URL 列表(以逗号分隔)。 init(..) 方法中的解析参数,将其存储在列表中,仅当当前请求 uri (request.getRequestURI()) 匹配时才应用缓存列表中的一个。这是一种声明式方法

I'll start backwards - your filter is invoked twice, perhaps because the same page requests two resources - the page, and a css, for example. Or makes an ajax-call.

Then, if you want to control the cache per-requested resource, here are a two servlet-only solution. I don't know stripes, so there might be a better one there:

  • create an utility class+method, say CacheUtils.addCacheHeaders(response). In this method add all cache headers to the response. Invoke it anywhere you like - one line for adding caches. This is a programmatic approach

  • Define a (comma-separated) list of request urls in an init-param of the filter. The in the init(..) method parse the param, store it in a list, and apply cache only if the current request uri (request.getRequestURI()) matches one in the list. That's a declarative approach

夏九 2024-10-14 12:04:27

实际上 - 进一步挖掘发现 stripes 1.5 有一个用于控制 HTTP 缓存标头的注释机制:

http://www.stripesframework.org/display/stripes/News

//
客户端缓存控制。新的 @HttpCache 注释可以应用于 ActionBean 类和/或事件处理程序方法,以控制客户端缓存响应的方式。方法上的注释会覆盖类上的注释,并且注释是从超类继承的。这对于来自 IE 的 AJAX 调用特别有用。
//

Actually - further digging revealed that stripes 1.5 has a annotation-mechanism for controlling HTTP cache headers:

http://www.stripesframework.org/display/stripes/News

//
Client cache control. The new @HttpCache annotation can be applied to an ActionBean class and/or event handler method to control how the client caches the response. Annotations on methods override those on classes and the annotation is inherited from superclasses. This is especially useful for AJAX calls from IE.
//

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文