2010-07-13 3 views
4

Есть ли право фильтра заголовка ответа на кеш-кеш, который позволит мне установить эти заголовки кеша на мои статические ресурсы без необходимости создания собственного фильтра? Это похоже на такую ​​общую задачу. Есть ли пружинный фильтр? В настоящее время я использую Tomcat 6.0 и использую Spring's ShallowEtagHeaderFilter для установки etag на мои ресурсы, но мне также нужно добавить заголовки управления кешем.Прямо из окна фильтра заголовка кэша?

ответ

2

Используйте DelegatingFilterProxy, указывая на свой собственный смысл WebContentGenerator для обработки заголовков кеша. WebContentGenerator вводится зависимым образом в DelegatingFilterProxy с использованием Spring. Ваш impl также будет реализовывать Filter и вызвать соответствующие методы настройки кеша WebContentGenerator из doFilter.

5

Подробная информация о решении Павла:

public class ResponseCachingFilter extends WebContentInterceptor implements 
      Filter { 

     @Override 
     public void doFilter(ServletRequest request, ServletResponse response, 
       FilterChain chain) throws IOException, ServletException { 
      try { 
       this.preHandle((HttpServletRequest) request, 
         (HttpServletResponse) response, chain); 
      } catch (Exception e) { 
       throw new ServletException(e); 
      } 
      chain.doFilter(request, response); 
     } 
... 

web.xml:

<filter> 
    <filter-name>responseCachingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>responseCachingFilter</filter-name> 
    <url-pattern>*.js</url-pattern> 
    <url-pattern>*.html</url-pattern> 
    <url-pattern>*.htm</url-pattern> 
    <url-pattern>*.jpg</url-pattern> 
    <url-pattern>*.gif</url-pattern> 
    <url-pattern>*.css</url-pattern> 
</filter-mapping> 

и в (верхнем уровне, то есть, не MVC-сервлетов) контекста приложения:

<bean id="responseCachingFilter" class="lala.ResponseCachingFilter"> 
    <property name="cacheSeconds" value="0" /> 
    <property name="useExpiresHeader" value="true" /> 
    <property name="useCacheControlHeader" value="true" /> 
    <property name="useCacheControlNoStore" value="true" /> 
    <property name="cacheMappings"> 
     <props> 
      <!-- cache for one month --> 
      <prop key="/**/*.html">2592000</prop> 
      <prop key="/**/*.htm">2592000</prop> 
      <prop key="/**/*.jpg">2592000</prop> 
      <prop key="/**/*.gif">2592000</prop> 
      <prop key="/**/*.css">2592000</prop> 
      <prop key="/**/*.js">2592000</prop> 
     </props> 
    </property> 
</bean> 
+0

Фильтр-картография может содержать только один шаблон url. Возможно, вы имели в виду /*, так как bean-файл responseCachingFilter указывает на сопоставления кешей на основе расширения? –

12

Использование mvc: ресурсы для статических файлов и mvc: перехватчики с WebContentInterceptor для нестатических файлов, например

<!-- cache for one month --> 
    <mvc:resources location="/css/" mapping="/css/**" cache-period="2592000"/> 

    <!-- don't send any cache headers, rely on last-modified timestamps only --> 
    <mvc:resources location="/img/" mapping="/img/**"/> 
    <mvc:resources location="/js/" mapping="/js/**"/> 

    <mvc:interceptors> 
    <mvc:interceptor> 
     <mvc:mapping path="/**/*.htm" /> 
     <bean id="responseCachingFilter" class="org.springframework.web.servlet.mvc.WebContentInterceptor"> 
      <property name="cacheSeconds" value="0" /> 
      <property name="useExpiresHeader" value="true" /> 
      <property name="useCacheControlHeader" value="true" /> 
      <property name="useCacheControlNoStore" value="true" /> 
      <property name="cacheMappings"> 
      <props> 
      <!-- cache for one month --> 
      <prop key="/**/*.htm">2592000</prop> 
      </props> 
     </property> 
     </bean> 
    </mvc:interceptor> 
    </mvc:interceptors>