在網頁中,每次的客戶端訪問服務器,有部分不用重復請求,如有些圖片,視頻等就沒有必要每次都請求,這樣會讓服務器增大工作量。為了防止這樣,我們采用過濾器來設置客戶端是都緩存。
HTTP1.1中啟用Cache-Control 來控制頁面的緩存與否,這里介紹幾個常用的參數:
no-cache,瀏覽器和緩存服務器都不應該緩存頁面信息;
public,瀏覽器和緩存服務器都可以緩存頁面信息;
no-store,請求和響應的信息都不應該被存儲在對方的磁盤系統中;
must-revalidate,對于客戶機的每次請求,代理服務器必須想服務器驗證緩存是否過時;
Last-Modified只頁面的最后生成時間,GMT格式;
Expires過時期限值,GMT格式,指瀏覽器或緩存服務器在該時間點后必須從真正的服務器中獲取新的頁面信息;
上面兩個值在JSP中設置值為字符型的GMT格式,無法生效,設置long類型才生效;
下面是設置不緩存的filter代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
<span style= "font-size:24px;" > package cn.hncu.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CacheFilter implements Filter { @Override public void destroy() { }</span> <span style= "font-size:24px;" > @Override public void doFilter(ServletRequest request , ServletResponse response, FilterChain chain) throws IOException, ServletException { // 過濾器有很多作用,這個用來設置客戶端是否設置緩存的問題,我們這里采用response通知客戶端設置不緩存 chain.doFilter(request, response); HttpServletResponse res=(HttpServletResponse) response; res.setHeader( "expries" , "-1" ); res.setHeader( "pragma" , "no-cache" ); res.setHeader( "cache-control" , "no-cache" ); /*上面的已經可以設置不緩存,但是還可以設置全面一點: //不允許瀏覽器端或緩存服務器緩存當前頁面信息。 /* response.setHeader( "Pragma", "no-cache" ); response.setDateHeader("Expires", "-1"); response.addHeader( "Cache-Control", "no-cache" );//瀏覽器和緩存服務器都不應該緩存頁面信息 response.addHeader( "Cache-Control", "no-store" );//請求和響應的信息都不應該被存儲在對方的磁盤 response.addHeader( "Cache-Control", "must-revalidate" );*/ //于客戶機的每次請求,代理服務器必須想服務器驗證緩存是否過時; } @Override public void init(FilterConfig arg0) throws ServletException { } }</span><span style= "font-size:18px;" > </span> |
下面是設置緩存的過濾器文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
package cn.hncu.filter; import java.io.IOException; import java.util.Date; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; public class CacheFilter2 implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest request , ServletResponse response, FilterChain chain) throws IOException, ServletException { // 過濾器有很多作用,這個用來設置客戶端是否設置緩存的問題,我們這里采用response通知客戶端設置緩存 //這里設置緩存1天,以實現讓圖片、視頻類的資源(在過濾器當中配置相應的攔截路徑)要求客戶瀏覽器緩存1天) //攔截路徑在web.xml中配置 chain.doFilter(request, response); //先進行請求,返回也會從過這里,返回進行攔截 HttpServletResponse res=(HttpServletResponse) response; Date d = new Date(); Long time=d.getTime()+ 60 * 60 * 24 ; // res.setHeader("expries", ""+time);//這樣就設置緩存一天 res.setDateHeader( "expries" , time); //和上面一句一樣 /* * Date date = new Date(); response.setDateHeader("Last-Modified",date.getTime()); //Last-Modified:頁面的最后生成時間 response.setDateHeader("Expires",date.getTime()+60*60*24); //Expires:過時期限值 response.setHeader("Cache-Control", "public"); //Cache-Control來控制頁面的緩存與否,public:瀏覽器和緩存服務器都可以緩存頁面信息; response.setHeader("Pragma", "Pragma"); //Pragma:設置頁面是否緩存,為Pragma則緩存,no-cache則不緩存 */ } @Override public void init(FilterConfig arg0) throws ServletException { } |
需要注意:上面的filter文件生效需要在web.xml中配置,根據配置的路徑來進行過濾。
以上所述是小編給大家介紹的JAVAEE Filter 過濾器設置是否緩存實例詳解的相關知識,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!