背景
我希望缓存一些网页的HTML响应。由于ehCache已经在我的应用程序中使用,因此很明显在那里寻找解决方案。事实上,ehCache有一些开箱即用的过滤器,如SimplePageCachingFilter可用。
问题
这些过滤器通常使用包含 query string as keys的网址。在我的情况下,不同的用户将具有相同的URL,并且该页面的内容将是不同的。我无法在查询字符串中添加用户ID。因此,对我来说,解决方案可能是基于cookie [或使用其他一些唯一用户ID]作为密钥的一部分来缓存页面。
问题
我的问题是如何使用不同的键,而不是SimplePageCachingFilter使用的键。文档建议覆盖javax.servlet.http.HttpServletRequest以考虑重要的QS参数,但是没有谈论如何完全克服密钥的制定方式。
缺少示例代码也是一个问题所以如果有人能指出一些示例代码并更好地控制密钥,我将不胜感激。
此外,控制使缓存无效也不错,而不是仅仅等待内容自行过期,尽管对我的应用程序来说并不重要。
答案 0 :(得分:1)
从SimplePageCachingFilter的源代码中我们可以看到如何构建缓存的密钥:
protected String calculateKey(HttpServletRequest httpRequest) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(httpRequest.getMethod()).append(httpRequest.getRequestURI()).append(httpRequest.getQueryString());
String key = stringBuffer.toString();
return key;
您可以只覆盖此方法,以在密钥中包含session-id(每个用户唯一)(基于url),例如:
protected String calculateKey(HttpServletRequest httpRequest) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(httpRequest.getSession().getId()).append(httpRequest.getMethod()).append(httpRequest.getRequestURI()).append(httpRequest.getQueryString());
String key = stringBuffer.toString();
return key;
我首先添加sessionid的原因是(不同)可能性,一些queryString以有效的会话ID结束。