Cache recursos estaticos

1 resposta
J

Oi pessoal, tenho uma aplicação jsf rodando no glassfish 4.

O problema é que estou tentando ativar o cache para recursos estáticos (css, png, js) e não estou conseguindo.

Eu coloquei a classe no projeto (conforme orientação da oracle):

`package iwc;

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import java.util.TimeZone;

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 ExpiresFilter implements Filter {

private FilterConfig filterConfig;
    private String expires;
    private long nextDeploymentTime;

    public ExpiresFilter() {
            expires = nextDeploymentTime();
    }

    private String nextDeploymentTime() {
            // assume next deployment is M-F at 09:45
            Calendar c = Calendar.getInstance();

            int dayOffset = 1;
            
            if (c.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) {
                    dayOffset+=2;
            }
            
            if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
                    dayOffset++;
            }
            
            c.add(Calendar.DAY_OF_MONTH, dayOffset);
            c.set(c.get(Calendar.YEAR)+2, c.get(Calendar.MONTH), 
                  c.get(Calendar.DAY_OF_MONTH), 9, 45);
            
            nextDeploymentTime = c.getTimeInMillis();
            
            String pattern = "EEE, dd MMM yyyy HH:mm:ss z";
            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
            sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
            return sdf.format(c.getTime());
    }
    
    private void addCacheHeaders(ServletRequest request, ServletResponse response)
            throws IOException, ServletException {
            
            HttpServletResponse sr = (HttpServletResponse) response;
            sr.setHeader("Expires", expires);
            long now = (new Date()).getTime();
            
            long expireTime = nextDeploymentTime - now;
            expireTime /= 1000;
            sr.setHeader("Cache-Control", "max-age="+
                    Long.toString(expireTime)+";public;must-revalidate;");
    }

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

            addCacheHeaders(request, response);
            chain.doFilter(request, response);
    }

 
    private FilterConfig getFilterConfig() {
            return filterConfig;
    }

  
    private void setFilterConfig(FilterConfig filterConfig) {
            this.filterConfig = filterConfig;
    }

  
    public void destroy() {
    }


    public void init(FilterConfig filterConfig) {
            setFilterConfig(filterConfig);
    }


    @Override
    public String toString() {
            if (getFilterConfig() == null) {
                    return ("ExpiresFilter()");
            }
            StringBuffer sb = new StringBuffer("ExpiresFilter(");
            sb.append(getFilterConfig());
            sb.append(")");
            return (sb.toString());

    }

}`

Adicionei o filter no web.xml:

<filter> <filter-name>ExpiresFilter</filter-name> <filter-class>iwc.ExpiresFilter</filter-class> </filter> <filter-mapping> <filter-name>ExpiresFilter</filter-name> <url-pattern>/resources/\*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>

Mas continua não fazendo cache (Imagem anexo)

O que está faltando ser feito??

1 Resposta

J

mudando para isso:

<filter> <filter-name>ExpiresFilter</filter-name> <filter-class>iwc.ExpiresFilter</filter-class> </filter> <filter-mapping> <filter-name>ExpiresFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>
e no web.xml, mudei de:
<context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development/param-value> </context-param>

para:
<context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Production</param-value> </context-param>

Começou a exibir as tags Expires, Control Cache.

Mas agora mostra somente no response. E no request continua cache-control=max-age = 0.

E não faz cache.

Criado 22 de abril de 2016
Ultima resposta 24 de abr. de 2016
Respostas 1
Participantes 1