2010-05-20 20 views
40

Cầu cảng có một số CacheControl parameter (có thể được chỉ định webdefault.xml) xác định hành vi lưu vào bộ đệm của khách hàng (bằng cách ảnh hưởng đến tiêu đề được gửi tới khách hàng).Tomcat: Cache-Control

Tomcat có tùy chọn tương tự không? Tóm lại, tôi muốn tắt bộ đệm ẩn của tất cả các trang được cung cấp bởi máy chủ tomcat và/hoặc bởi một ứng dụng web cụ thể?

Cập nhật

Xin lưu ý rằng tôi không đề cập đến server-side bộ nhớ đệm. Tôi muốn máy chủ thông báo cho tất cả khách hàng (trình duyệt) không sử dụng bộ nhớ cache của riêng họ và luôn tìm nạp nội dung từ máy chủ. Tôi muốn làm điều đó cho tất cả các tài nguyên, bao gồm cả tài nguyên tĩnh (.css, .js, v.v.) cùng một lúc.

Trả lời

31

Tương tự như bài đăng ở trên, ngoại trừ một số vấn đề với mã đó. Thao tác này sẽ tắt tất cả bộ nhớ đệm của trình duyệt:

import javax.servlet.*; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 
import java.util.Date; 

public class CacheControlFilter implements Filter { 

    public void doFilter(ServletRequest request, ServletResponse response, 
         FilterChain chain) throws IOException, ServletException { 

     HttpServletResponse resp = (HttpServletResponse) response; 
     resp.setHeader("Expires", "Tue, 03 Jul 2001 06:00:00 GMT"); 
     resp.setDateHeader("Last-Modified", new Date().getTime()); 
     resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0"); 
     resp.setHeader("Pragma", "no-cache"); 

     chain.doFilter(request, response); 
    } 

} 

và sau đó ánh xạ trong web.xml như được mô tả trong Stu Thompson's answer.

+0

Điều này giải quyết được vấn đề cho tôi. Safari 6 (iOS) lưu trữ các yêu cầu POST và điều này đã giết chết tôi! Cảm ơn! – cbmeeks

0

có thể đây những gì bạn đang tìm kiếm:

http://tomcat.apache.org/tomcat-6.0-doc/config/context.html#Context%20Parameters

cachingAllowed : If the value of this flag is true, the cache for static 

resources will be used. If not specified, the default value of the flag is true. 

Cũng xóa thư mục bộ nhớ cache ứng dụng trong/công việc/Catalina/localhost sau khi thay đổi cờ này.

+0

Cảm ơn, nhưng điều này không giúp tôi. Tham số bạn đang đề cập đến ảnh hưởng đến bộ nhớ đệm phía máy chủ. Tôi muốn máy chủ thông báo cho tất cả khách hàng (trình duyệt) không sử dụng bộ nhớ cache của riêng họ và luôn tìm nạp nội dung từ máy chủ. Và, tôi muốn làm điều đó cho tất cả các tài nguyên cùng một lúc. –

+0

ah ok..afaik triển khai bộ lọc là một cách để thực hiện. – Inv3r53

+0

Dường như Không có bộ điều khiển bộ nhớ cache tích hợp trong Tomcat. – Inv3r53

13

Tôi không tin rằng có cấu hình để thực hiện việc này. Nhưng nó không phải là một nỗ lực để viết một bộ lọc để thiết lập tiêu đề Cache-Control trên mỗi cơ sở webapp. Ví dụ:

public class test implements Filter { 

     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
       throws IOException, ServletException { 

      chain.doFilter(request, response); 
      ((StatusResponse)response).setHeader("Cache-Control", 
        "max-age=0, private, must-revalidate"); 
     } 

     public void destroy() {} 

     public void init(FilterConfig arg0) throws ServletException {} 
} 

Và bạn sẽ đặt đoạn mã này vào tệp ứng dụng web của bạn web.xml.

<filter> 
    <filter-name>SetCacheControl</filter-name> 
    <filter-class>ch.dietpizza.cacheControlFilter</filter-class> 
</filter>      
<filter-mapping> 
    <filter-name>SetCacheControl</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

Điều này sẽ chỉ áp dụng cho các servlet hay các tệp tĩnh, ví dụ: css/images, được phục vụ bởi Tomcat? –

+0

@ClickUpvote Mọi thứ trong webapp - servlets & static files –

0

Thông số duy nhất tôi biết là disableProxyCaching trên các yếu tố <Valve>. Xem here.

1

Có một số yếu tố trong cấu hình Tomcat ảnh hưởng trực tiếp đến điều này. Xem tài liệu tại số http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html chẳng hạn.

Atlassian khuyến cáo hai câu sau đây để kích hoạt trình duyệt phía bộ nhớ đệm để Microsoft Internet Explorer sẽ có thể tải về một cách chính xác và xem các tài liệu kèm theo:

<Valve className="org.apache.catalina.authenticator.FormAuthenticator" securePagesWithPragma="false" /> 
<Valve className="org.apache.catalina.authenticator.NonLoginAuthenticator" securePagesWithPragma="false" /> 
37

Kể từ Tomcat 7 có một container cung cấp hết hạn lọc điều đó có thể hữu ích. Xem:

ExpiresFilter là một cổng API Java Servlet của Apache mod_expires.Bộ lọc này kiểm soát cài đặt của tiêu đề HTTP Expires và chỉ thị max-age của tiêu đề HTTP Cache-Control trong các phản hồi của máy chủ. Ngày hết hạn có thể được đặt là tương đối so với thời gian tệp nguồn được sửa đổi lần cuối hoặc vào thời điểm truy cập ứng dụng khách.

<filter> 
    <filter-name>ExpiresFilter</filter-name> 
    <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class> 
    <init-param> 
     <param-name>ExpiresByType image</param-name> 
     <param-value>access plus 10 days</param-value> 
    </init-param> 
    <init-param> 
     <param-name>ExpiresByType text/css</param-name> 
     <param-value>access plus 10 hours</param-value> 
    </init-param> 
    <init-param> 
     <param-name>ExpiresByType application/javascript</param-name> 
     <param-value>access plus 10 minutes</param-value> 
    </init-param> 
    <!-- Let everything else expire immediately --> 
    <init-param> 
     <param-name>ExpiresDefault</param-name> 
     <param-value>access plus 0 seconds</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>ExpiresFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
</filter-mapping> 
+2

Có thể ExpiresFilter được sử dụng để đặt bộ nhớ cache kiểm soát thành "no-cache" và "no-store" cùng một lúc không? Nếu có, làm thế nào để bạn đạt được nó trong mã trên? Đây sẽ là trợ giúp tuyệt vời. –

+3

Tôi không nghĩ vậy. Từ tài liệu hướng dẫn: 'Để sửa đổi chỉ thị kiểm soát bộ nhớ cache khác với độ tuổi tối đa (xem phần RFC 2616 14.9), bạn có thể sử dụng các bộ lọc servlet khác hoặc mô-đun mod_headers Apache Httpd.' – Jack

+0

Tôi đã chuyển ExpiresFilter tới Tomcat 6. Xem https://github.com/bnegrao/ExpiresFilter –