Как настроить Spring, чтобы избежать установки Pragma No-Cache - PullRequest
8 голосов
/ 23 января 2012

Моя система основана на Spring MVC, и я проверил, что Spring автоматически устанавливает PRAGMA: no-cache . Система доступна пользователям через SSL. Когда пользователи пытаются загрузить что-либо с помощью INTERNET EXPLORER 7 или 8, появляется сообщение об ошибке типа «Internet Explorer не может загрузить файл с сервера» (более подробная информация: http://support.microsoft.com/default.aspx?scid=KB;EN-US;q316431&).

Я пытался настроить WebContentInterceptor , как показано ниже, но не работает:

<mvc:interceptors>
    <bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor">
        <property name="cacheSeconds" value="2100" />
        <property name="useExpiresHeader" value="false" />
        <property name="useCacheControlHeader" value="false" />
        <property name="useCacheControlNoStore" value="false" />
    </bean>
</mvc:interceptors>

Что я могу сделать, чтобы Spring отправлял Pragma: no-cache и связан с Cache Control?

Привет!

Ответы [ 4 ]

7 голосов
/ 23 января 2012

Вы можете написать свой собственный перехватчик и установить значения заголовка для объекта ответа. Перехватчики - это не что иное, как фильтры, поэтому переопределите фильтр и используйте

prehandle и posthandle для установки заголовков запроса и ответа соответственно.

Дайте мне знать, если вы хотите, чтобы конкретные примеры делали это.

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <beans:bean id="customInterceptor"
            class="org.example.interceptors.CustomInterceptor">
        </beans:bean>
    </mvc:interceptor>

</mvc:interceptors>




 public class CustomInterceptor implements HandlerInterceptor{

     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView modelAndView) throws Exception {
     response.setHeader(...);}
}
2 голосов
/ 12 февраля 2014

Простейший подход, вероятно, состоит в том, чтобы просто предотвратить запись заголовка с помощью фильтра сервлета. Таким образом, нет необходимости изменять конфигурацию Spring, и вы бесплатно получаете правильную функциональность кеша.

public class PragmaFilter implements Filter {

    private static String PRAGMA_HEADER = "Pragma";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request, new NoPragmaHttpServletResponseWrapper(response));
    }

    @Override
    public void destroy() { }

    private final class NoPragmaHttpServletResponseWrapper extends HttpServletResponseWrapper {

        private NoPragmaHttpServletResponseWrapper(ServletResponse response) {
            super((HttpServletResponse) response);
        }

        @Override
        public void addHeader(String name, String value) {
            if (PRAGMA_HEADER.equals(name)) {
                return;
            }
            super.addHeader(name, value);
        }

        @Override
        public void setHeader(String name, String value) {
            if (PRAGMA_HEADER.equals(name)) {
                return;
            }
            super.setHeader(name, value);
        }
    }

}
2 голосов
/ 23 января 2012

Попробуйте установить в секундах кэша отрицательное значение.


Если это не поможет, вам потребуется переопределить:

   protected final void preventCaching(HttpServletResponse response)

или

  protected final void applyCacheSeconds(HttpServletResponse response, int seconds, boolean mustRevalidate)

Оба метода являются инструментами WebContentGenerator

1 голос
/ 10 февраля 2012
<mvc:interceptors>
    <bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor">
        <property name="cacheSeconds" value="2100" />
        <property name="useExpiresHeader" value="false" />
        <property name="useCacheControlHeader" value="false" />
        <property name="useCacheControlNoStore" value="false" />
        <property name="cacheMappings">
            <props>
                <prop key="/**/**">-1</prop><!-- removes pragma no-cache -->
            </props>
        </property>
    </bean>
</mvc:interceptors>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...