2013-09-30 5 views
1

Я создаю файл, используя Java и генерирую ссылку для скачивания.файл не загружается обновленный файл

Предположим, я создаю файл myFile.xls и имею ссылку, как показано ниже.

Please download data from <a href="#{msg['websiteWay']}ProjectUploadFiles/excel/#{MyLogin.loginname}_SurveyReport.xls">here</a>. 

Это будет выглядеть следующим образом.

Please download data from <a href="http://www.mywebsite.com/excel/admin_SurveyReport.xls">here</a>. 

Everytime создать новый файл, и нажмите на ссылку выше, я всегда вижу ранее файл, который я скачал в первый раз.

Это происходит, потому что jsf кэширует файлы?

Примечание: Когда я загружаю файл вручную, я всегда вижу обновленный файл.

Однако, используя ссылку, я всегда вижу первый файл.

Любая идея, почему это происходит?

Я думаю, что это из-за кеширования. Если да, как я могу игнорировать это только для этого файла excel?

+0

Существуют ли другие части HTML-файла, который вы хотите кэшировать? Если нет, есть [более старая почта] (http://stackoverflow.com/questions/1341089/using-meta-tags-to-turn-off-caching-in-all-browsers), в которой обсуждается, как предотвратить кеширование. – Shabab

+0

, чтобы они были применимы только для этой страницы? –

+1

Итак, я нашел [это другое сообщение] (http://stackoverflow.com/questions/728616/disable-cache-for-some-images), и мне интересно, не измените ли вы его немного. Например, изменение 'href', чтобы включить вновь созданную метку времени с каждым новым файлом Excel. – Shabab

ответ

1

JSF не кэширует эти ресурсы вообще. JSF находится в контексте этого вопроса только как контроллер HTTP-трафика и генератор кода HTML. Это веб-браузер, который их кэширует. Вы можете контролировать это, установив правильные заголовки ответов, перечисленные в этом ответе: How to control web page caching, across all browsers?.

Самый простой способ - создать фильтр сервлета, который будет отображаться по шаблону URL, соответствующему этим загрузкам, например. /excel/* (ваш исходный код JSF и фактический адрес не совпадают друг с другом, так что это несколько угадывает здесь), и установить заголовки в doFilter() методе:

@WebFilter("/excel/*") 
public class NoCacheFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletResponse response = (HttpServletResponse) res; 
     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. 
     chain.doFilter(req, res); 
    } 

    // ... 
} 

Или, если вы обслуживаете эти файлы с помощью сервлет, тогда вы также можете просто установить эти заголовки там.

Альтернативой является обмануть веб-браузер, что это новый ресурс, введя строку запроса с меткой времени.

Please download data from <a href="#{msg['websiteWay']}ProjectUploadFiles/excel/#{MyLogin.loginname}_SurveyReport.xls?#{now.time}">here</a>. 

где #{now} только в java.util.Date зарегистрирован как запрос в область действия боб faces-config.xml (в случае, если вы используете JSF utility library OmniFaces, он уже один встроено в него). Webbrowser будет обрабатывать любой ресурс с другой строкой запроса как уникальный и независимый ресурс и, следовательно, не повторно использовать кэшированную версию ресурса в том же URI (если строка запроса отличается).

+0

yep, я сделал то же самое ... хотя спасибо за ваш ответ ... Я добавил время в конце –

+0

Добро пожаловать. – BalusC

Смежные вопросы