Есть ли право фильтра заголовка ответа на кеш-кеш, который позволит мне установить эти заголовки кеша на мои статические ресурсы без необходимости создания собственного фильтра? Это похоже на такую общую задачу. Есть ли пружинный фильтр? В настоящее время я использую Tomcat 6.0 и использую Spring's ShallowEtagHeaderFilter для установки etag на мои ресурсы, но мне также нужно добавить заголовки управления кешем.Прямо из окна фильтра заголовка кэша?
4
A
ответ
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>
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>
Фильтр-картография может содержать только один шаблон url. Возможно, вы имели в виду/* url-pattern>, так как bean-файл responseCachingFilter указывает на сопоставления кешей на основе расширения? –