Недостаток отключения кэша браузера на странице состоит в том, что пользователь увидит страницу с ошибкой браузера, если он использует браузер назад для перехода на предыдущую страницу.Таким образом, другое решение состоит в том, чтобы определить, приходит ли страница с сервера или из кэша браузера, используя javascript:
Сначала создайте простой компонент поддержки, который обслуживает уникальный идентификатор (в моем случае текущее системное время):
@Named("browserCacheController")
@RequestScoped
public class BrowserCacheController implements Serializable {
private static final long serialVersionUID = 1L;
/**
* Returns a unique increasing id for each request
* @return
*/
public long getCacheID() {
return System.currentTimeMillis();
}
}
Теперь вы можете проверить, обслуживается ли страница с сервера или браузера, и перенаправить пользователя, если текущая страница поступает из кэша браузера.См. Следующий код javascript, размещенный на странице jsf, который не должен кэшироваться браузером:
<script type="text/javascript">
// check for latestCacheID
if (!isValidCacheID(#{browserCacheController.cacheID})) {
//redirect to some page
document.location="#{facesContext.externalContext.requestContextPath}/index.jsf";
}
// test cacheID if it comes from the server....
function isValidCacheID(currentCacheID) {
if (!('localStorage' in window && window['localStorage'] !== null))
return true; // old browsers not supported
var latestCacheID=localStorage.getItem("org.imixs.latestCacheID");
if (latestCacheID!=null && currentCacheID<=latestCacheID) {
return false; // this was a cached browser page!
}
// set new id
localStorage.setItem("org.imixs.latestCacheID", currentCacheID);
return true;
}
</script>
Сценарий также можно поместить в facelet, чтобы сделать код jsf более чистым.