2010-08-16 9 views
7

Tôi có trang Java/Wicket tạo tệp JNLP khởi chạy phần mềm của công ty tôi. Lớp này sẽ tùy chọn lấy một số tham số url và nhúng chúng làm đối số trong JNLP. Khi người dùng khởi chạy tệp JNLP này, ứng dụng khách sẽ thực hiện một số chức năng dựa trên các tham số đó. Nếu phần mềm máy khách đang chạy trên máy, nhấn vào trang JNLP thay vào đó sẽ cố gắng nạp các thông số này thông qua một cuộc gọi từ xa đến máy khách đang chạy thay vì khởi chạy một trang mới.Java/Wicket - Làm cách nào để dừng trình duyệt khỏi các trang lưu trong bộ nhớ cache?

Phần này là nơi tôi đang gặp sự cố. Trên IE, Firefox và Chrome tôi có thể mở một ứng dụng khách mới, nhưng cố gắng nhấn lại cùng một URL, thay vào đó sẽ trả về một tệp JNLP. Tôi thấy rằng việc xóa bộ nhớ cache của trình duyệt sẽ khắc phục sự cố này trên tất cả các trình duyệt. Ngoài ra, tôi dường như không thể đạt được điểm ngắt trong lớp JNLP, điều này thực thi linh cảm của tôi rằng đây là vấn đề với yêu cầu hơn là một điều gì đó kỳ lạ với Wicket.

tôi đặt đoạn mã sau vào lớp trang của tôi, kéo dài org.apache.wicket.markup.html.WebPage:

@Override 
protected void setHeaders(WebResponse response) { 
    getPageMap().remove(this); 
    HttpServletResponse httpServletResponse = response.getHttpServletResponse(); 
    if (httpServletResponse != null) { 
     httpServletResponse.setDateHeader("Expires", 0); 
     httpServletResponse.addHeader("Cache-Control", "no-cache,no-store,private,must-revalidate,max-stale=0,post-check=0,pre-check=0"); 
     httpServletResponse.addHeader("Keep-Alive", "timeout=3, max=993"); 
    } 
} 

này dường như không làm việc, như Firefox 3.6 vẫn có vẻ để lưu trữ kết quả. IE 7 sẽ hoạt động nhưng chỉ sau khi thử liên kết tôi tạo vài lần. Tôi không biết nhiều về phát triển web và Wicket và điều này là mới đối với tôi vì vậy có thể tôi đang thiếu một cái gì đó đơn giản.

TL; DR: Làm thế nào để tôi có được một trang Wicket để không lưu vào bộ nhớ cache trên trình duyệt của khách hàng?

+0

bạn đã thử thêm '' vào đánh dấu trang chưa? – Gytis

Trả lời

5

Một hack được sử dụng trong một số nội bộ Wicket (xem ví dụ nguồn cho org.apache.wicket.markup.html.image.NonCachingImage) là thêm nhiễu ngẫu nhiên vào url.

Về cơ bản, nếu bạn đang tạo các url mà trình duyệt gọi, bạn có thể thêm tham số bị bỏ qua bởi ứng dụng web thay đổi ngẫu nhiên và làm cho trình duyệt bỏ qua bộ nhớ cache của nó.

+0

Điều này có vẻ là cách dễ dàng nhất, vì giải pháp của Joao Pinto không có vẻ hoạt động với bất kỳ trình duyệt nào, với các trang đang được Jetty phục vụ 6. –

2

Vui lòng kiểm tra trang sau đây: http://palisade.plynt.com/issues/2008Jul/cache-control-attributes/

Firefox nên tôn vinh "Cache-Control" tiêu đề.

+1

Trong khi điều này không trực tiếp giải quyết vấn đề của tôi, liên kết này thực sự tuyệt vời và giải thích những gì tất cả các chỉ thị này làm.Tôi không thực sự là một anh chàng web nên rất nhiều thứ này là một bí ẩn đối với tôi. –

0

Tôi không biết Wicket rất giỏi nhưng bạn đã thử sử dụng WebResponse.setLastModifiedTime(Time time) chưa? Tôi biết FF gửi tiêu đề If-Modified-Since mà máy chủ của bạn sẽ trả lời bằng 304 Not Modified hoặc phản hồi bình thường.

Có vẻ như tự nhiên với tôi rằng máy chủ của bạn sẽ kiểm tra số lastModifiedTime trên số WebResponse để quyết định.

Nếu điều đó không giúp tôi đề nghị bạn sử dụng Firebug cho Firefox và xem xét các yêu cầu và phản hồi.

0
response.setHeader("Expires", "0"); 
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0, private"); 
response.setHeader("Pragma", "no-cache"); 

Điều này làm việc với IE, Firefox và vân vân, trình duyệt duy nhất mà nó chắc chắn không hoạt động là konqueror.

0

Wicket 6.11.0: Application.get(). GetResourceSettings(). SetDefaultCacheDuration (Duration.NONE);

0

Bạn đã từng tải trang bằng window.location.replace chưa?