Проблема с кэшированием страниц - PullRequest
1 голос
/ 26 ноября 2010

Я использую JSP (Spring MVC) для показа информации удаленному пользователю. У меня есть некоторые проблемы с кэшированием страницы. Это выглядит так:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<html>
   <head>
       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
       <title>My Title</title>
   </head>
   <body>
       <jsp:include page="menu.jsp" flush="true" />
       <form method="post">
           Write here
           <input type="text" name="inputTxt" value="${txt}" />
           <input type="submit" value="OK" />
       </form>

       <table border="1">
           ...
       </table>                       
    </body>
</html>

На странице должна отображаться таблица предметов. Когда пользователь нажимает кнопку ОК, сервер добавляет информацию в базу данных и добавляет строку в таблицу. Все работает отлично. Но таблицы показывают, что информация зависит от зарегистрированного пользователя. Итак, когда я вхожу в первый раз, мое приложение работает отлично (показывает данные, соответствующие текущему пользователю). Но когда я выхожу из текущего пользователя и захожу из нового, на этой странице все еще отображаются данные для первого пользователя. Если я нажму F5, таблица обновит свои данные и покажет правильную информацию, которая соответствует текущему пользователю. Я думаю проблемы с кешированием. Как избежать этой проблемы? Есть идеи?

1 Ответ

3 голосов
/ 27 ноября 2010

Возможно, страница действительно кэшируется браузером. Вы можете проверить это в Firefox с помощью Firebug . Как правило, вы хотите отключить кэширование динамического содержимого на стороне клиента. Вы можете добиться этого, создав Filter, который сопоставлен с url-pattern из *.jsp и выполняет в основном следующую работу в методе doFilter().

HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1
httpResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0
httpResponse.setDateHeader("Expires", 0); // Proxies.
chain.doFilter(request, response);

Эти заголовки ответа будут указывать клиенту (веб-браузеру) не кэшировать ответ. Не забудьте очистить кеш браузера перед тестированием.

В Spring MVC вы можете создать перехватчик следующим образом:

public class DisableBrowserCachingInterceptor extends HandlerInterceptorAdapter {

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1
        response.setHeader("Pragma", "no-cache"); // HTTP 1.0
        response.setDateHeader("Expires", 0); // Proxies
    }
}
...