2011-03-03 3 views
1

У меня есть файл CSS, динамически генерируемый контроллером Spring. Я установил заголовок ответа Cache-Control в методе обработчика, но по какой-то причине мой FireFox продолжает запрашивать файл CSS при запросе файла HTML, который ссылается на него, вместо использования кешированной версии.Динамически созданный файл CSS не кэшируется даже после установки Cache-Control

Вот код.

@Controller 
@RequestMapping("/foo.css") 
public class FooController { 
    @RequestMapping(method = RequestMethod.GET) 
    public void show(HttpServletResponse response) { 
     try { 
      response.setHeader("Cache-Control", "max-age=3600"); 
      response.getWriter().println("this is a test."); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 

     System.out.println(new Date()); 
    } 
} 

И файл HTML ссылается на файл CSS обычным способом.

<link rel="stylesheet" type="text/css" href="/foo.css" /> 

Что я здесь делаю неправильно?

ответ

2

Я О.П., но после дальнейших исследований, я решил, что вам нужно реализовать это самостоятельно. Вам нужно, чтобы сервер генерировал код ответа 304 для браузера клиента для использования кэшированного ресурса, но ни Spring, ни Tomcat не поддерживают этот готовый продукт.

1

Ну, в первую очередь, браузеры и прокси-серверы не должны соответствовать элементам управления HTTP-кэшем, размещенным в заголовках. Они только консультативные. Возможно, браузер игнорирует запрос на кеш и подчиняется тому, что настроено на его предпочтениях.

Другой способ сделать это - помещать случайный атрибут в url, созданный javascript. Что-то вроде:

<link type="text/css" href="/foo.css?d=328943298432" /> 

Вот хорошая статья на эту тему http://code.google.com/speed/page-speed/docs/caching.html

0

Это было поддержано весной в течение довольно долгого времени, и оно было улучшено в последних версиях. См. the reference documentation about this.

@Controller 
public class FooController { 

    @RequestMapping("/foo.css") 
    public ResponseEntity<String> show() { 

    String cssContent = generateCssContent(); 
    String version = hashCssContent(cssContent); 

    // automatically writes CacheControl + Etag headers 
    // generates HTTP 304 responses for conditional requests 
    return ResponseEntity 
     .ok() 
     .cacheControl(CacheControl.maxAge(30, TimeUnit.DAYS)) 
     .eTag(version) // lastModified is also available 
     .body(cssContent); 
    } 
}