X-Git-Url: https://juplo.de/gitweb/?p=percentcodec;a=blobdiff_plain;f=accelerator%2Fsrc%2Fmain%2Fjava%2Fde%2Fjuplo%2Faccelerator%2FCacheControlInterceptor.java;fp=accelerator%2Fsrc%2Fmain%2Fjava%2Fde%2Fjuplo%2Faccelerator%2FCacheControlInterceptor.java;h=10aaee1fc018ef0333041785be7583eabed06210;hp=0000000000000000000000000000000000000000;hb=a6e0e65cce68acb20abc6ca935471611a740c342;hpb=1d395c6002486d485bde0d5dc713886d70bd3f8a diff --git a/accelerator/src/main/java/de/juplo/accelerator/CacheControlInterceptor.java b/accelerator/src/main/java/de/juplo/accelerator/CacheControlInterceptor.java new file mode 100644 index 00000000..10aaee1f --- /dev/null +++ b/accelerator/src/main/java/de/juplo/accelerator/CacheControlInterceptor.java @@ -0,0 +1,83 @@ +package de.juplo.accelerator; + +import de.juplo.accelerator.AcceleratorFilter.AccelerationWrapper; +import de.juplo.accelerator.annotations.Cacheable; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +/** + * + * @author kai + */ +public class CacheControlInterceptor implements HandlerInterceptor { + private final static Logger log = LoggerFactory.getLogger(CacheControlInterceptor.class); + + + private CacheControl cacheControl; + + + @Override + public boolean preHandle( + HttpServletRequest request, + HttpServletResponse response, + Object handler + ) throws Exception + { + Cacheable cacheable = handler.getClass().getAnnotation(Cacheable.class); + if (cacheable == null) { + /** Der Handler ist nicht mit @Cacheable annotiert: keine Dekorationen anbringen! */ + return true; + } + + AccelerationWrapper wrapper = (AccelerationWrapper)request.getAttribute(AcceleratorFilter.RESPONSE_WRAPPER); + if (wrapper != null) + wrapper.supressGuessing(); + + /** CacheControll initialisieren (Handler nach annotierte Methoden scannen etc.) */ + cacheControl.init(handler, wrapper); + + if (cacheable.eager()) { + return cacheControl.decorate(request, response); + } + else { + return true; + } + } + + @Override + public void postHandle( + HttpServletRequest request, + HttpServletResponse response, + Object handler, + ModelAndView modelAndView + ) throws Exception + { + /** + * Dekoration nur dann anstossen, wenn sie nicht bereits von dem + * AcceleratorFilter ausgelöst wird. + */ + if (request.getAttribute(AcceleratorFilter.RESPONSE_WRAPPER) == null) + cacheControl.decorate(request, response); + } + + @Override + public void afterCompletion( + HttpServletRequest request, + HttpServletResponse response, + Object handler, Exception ex + ) throws Exception + { + cacheControl.release(); + } + + + @Autowired + public void setCacheControl(CacheControl cacheControl) { + this.cacheControl = cacheControl; + } +}