Прямо из коробки фильтр заголовка кеш-контроля? - PullRequest
5 голосов
/ 13 июля 2010

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

Ответы [ 3 ]

12 голосов
/ 18 апреля 2011

Используйте 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>
5 голосов
/ 07 апреля 2011

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

 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-servlet):

<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>
2 голосов
/ 14 июля 2010

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

...