changeset 4436:9fca4d60fb7c

Reintroduce wrongly outbacked changes (rev 4418-4425).
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Wed, 07 Nov 2012 13:49:32 +0100
parents 471baa410470
children dd8a63002fb8
files flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.java flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.properties flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties flys-client/src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java flys-client/src/main/java/de/intevation/flys/client/server/GGInAFilter.java flys-client/src/main/java/de/intevation/flys/client/server/MapPrintServiceImpl.java flys-client/src/main/java/de/intevation/flys/client/server/RiverInfoServiceImpl.java flys-client/src/main/java/de/intevation/flys/client/server/filter/GGInAFilter.java flys-client/src/main/java/de/intevation/flys/client/server/filter/NoCacheFilter.java flys-client/src/main/webapp/WEB-INF/web.xml
diffstat 11 files changed, 328 insertions(+), 227 deletions(-) [+]
line wrap: on
line diff
--- a/flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.java	Wed Nov 07 13:40:00 2012 +0100
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.java	Wed Nov 07 13:49:32 2012 +0100
@@ -730,6 +730,8 @@
 
     String addWMS();
 
+    String printMapSettings();
+
     String addWMSTooltip();
 
     String adjustElevation();
--- a/flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.properties	Wed Nov 07 13:40:00 2012 +0100
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.properties	Wed Nov 07 13:49:32 2012 +0100
@@ -372,6 +372,7 @@
 getFeatureInfoTooltip = Information Tool
 getFeatureInfoWindowTitle = Informations for Map Layers.
 addWMS = images/add_map.png
+printMapSettings = images/print_map_settings.png
 addWMSTooltip = Load layers from external WMS service.
 adjustElevation = images/adjustElevation.png
 measureLine = images/measure_line.png
--- a/flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties	Wed Nov 07 13:40:00 2012 +0100
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties	Wed Nov 07 13:49:32 2012 +0100
@@ -373,6 +373,7 @@
 getFeatureInfoTooltip = Informationswerkzeug
 getFeatureInfoWindowTitle = Informationen zu Kartenebenen
 addWMS = images/add_map.png
+printMapSettings = images/print_map_settings.png
 addWMSTooltip = Laden von Kartenebenen eines externen WMS Dienstes.
 adjustElevation = images/adjustElevation.png
 measureLine = images/measure_line.png
--- a/flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties	Wed Nov 07 13:40:00 2012 +0100
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties	Wed Nov 07 13:49:32 2012 +0100
@@ -373,6 +373,7 @@
 getFeatureInfoTooltip = Information Tool
 getFeatureInfoWindowTitle = Informations for Map Layers.
 addWMS = images/add_map.png
+printMapSettings = images/print_map_settings.png
 addWMSTooltip = Load layers from external WMS service.
 adjustElevation = images/adjustElevation.png
 measureLine = images/measure_line.png
--- a/flys-client/src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java	Wed Nov 07 13:40:00 2012 +0100
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java	Wed Nov 07 13:49:32 2012 +0100
@@ -1,16 +1,5 @@
 package de.intevation.flys.client.client.ui.map;
 
-import org.gwtopenmaps.openlayers.client.Bounds;
-import org.gwtopenmaps.openlayers.client.Map;
-import org.gwtopenmaps.openlayers.client.control.DragPan;
-import org.gwtopenmaps.openlayers.client.control.SelectFeature;
-import org.gwtopenmaps.openlayers.client.control.SelectFeatureOptions;
-import org.gwtopenmaps.openlayers.client.control.ZoomBox;
-import org.gwtopenmaps.openlayers.client.event.MapZoomListener;
-import org.gwtopenmaps.openlayers.client.feature.VectorFeature;
-import org.gwtopenmaps.openlayers.client.layer.Vector;
-import org.gwtopenmaps.openlayers.client.util.Attributes;
-
 import com.google.gwt.core.client.GWT;
 import com.smartgwt.client.types.Alignment;
 import com.smartgwt.client.types.SelectionType;
@@ -30,8 +19,20 @@
 import de.intevation.flys.client.shared.model.Collection;
 import de.intevation.flys.client.shared.model.ThemeList;
 
+import org.gwtopenmaps.openlayers.client.Bounds;
+import org.gwtopenmaps.openlayers.client.Map;
+import org.gwtopenmaps.openlayers.client.control.DragPan;
+import org.gwtopenmaps.openlayers.client.control.SelectFeature;
+import org.gwtopenmaps.openlayers.client.control.SelectFeatureOptions;
+import org.gwtopenmaps.openlayers.client.control.ZoomBox;
+import org.gwtopenmaps.openlayers.client.event.MapZoomListener;
+import org.gwtopenmaps.openlayers.client.feature.VectorFeature;
+import org.gwtopenmaps.openlayers.client.layer.Vector;
+import org.gwtopenmaps.openlayers.client.util.Attributes;
+
 
 /**
+ * Toolbar for the Map views.
  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
  */
 public class MapToolbar
@@ -60,6 +61,7 @@
     protected ImgButton removeButton;
     protected ImgButton elevationButton;
     protected ImgLink   printMapLink;
+    protected ImgButton printMapSettings;
 
     protected Label epsgLabel;
 
@@ -123,6 +125,9 @@
 
             printMapLink = createPrintMapLink();
             addMember(printMapLink);
+
+            printMapSettings = createMapPrintSettingsControl();
+            addMember(printMapSettings);
         }
 
         addMember(zoomToMaxButton);
@@ -641,6 +646,17 @@
     }
 
 
+    protected ImgButton createMapPrintSettingsControl() {
+        ImgButton btn = createButton(MSG.printMapSettings(), new ClickHandler() {
+            @Override
+            public void onClick(ClickEvent event) {
+
+            }
+        });
+        return btn;
+    }
+
+
     protected ImgButton createWMSControl() {
         final String srs = floodMap.getRiverProjection();
 
--- a/flys-client/src/main/java/de/intevation/flys/client/server/GGInAFilter.java	Wed Nov 07 13:40:00 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,180 +0,0 @@
-package de.intevation.flys.client.server;
-
-import java.io.IOException;
-import java.util.Enumeration;
-
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.client.server.auth.Authentication;
-import de.intevation.flys.client.server.auth.AuthenticationException;
-import de.intevation.flys.client.server.auth.AuthenticationFactory;
-import de.intevation.flys.client.server.auth.User;
-import de.intevation.flys.client.server.features.Features;
-
-
-/** ServletFilter used for GGInA authentification and certain authorisation. */
-public class GGInAFilter implements Filter {
-
-    /** Private logger. */
-    private static Logger logger = Logger.getLogger(GGInAFilter.class);
-
-    private boolean deactivate = false;
-    private String authmethod;
-    private String redirecturl;
-    private ServletContext sc;
-
-    public static final String LOGIN_JSP     = "/login.jsp";
-    public static final String LOGIN_SERVLET = "/flys/login";
-    public static final String FLYS_CSS      = "/FLYS.css";
-
-
-    /**
-     * Initialize.
-     *
-     * Read FilterConfig parameter deactivate
-     */
-    @Override
-    public void init(FilterConfig config)
-    throws ServletException
-    {
-        String deactivate = config.getInitParameter("deactivate");
-        this.sc = config.getServletContext();
-        logger.debug("GGInAFilter context " + this.sc.getContextPath());
-        this.authmethod = sc.getInitParameter("authentication");
-        this.redirecturl = sc.getInitParameter("redirect-url");
-        if (deactivate != null && deactivate.equalsIgnoreCase("true")) {
-            this.deactivate = true;
-        }
-
-    }
-
-
-    /**
-     * Called when filter in chain invoked.
-     * @param req request to servlet
-     * @param resp response of servlet
-     * @param chain the filter chain
-     */
-    @Override
-    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
-    throws IOException, ServletException
-    {
-        if (this.deactivate) {
-            logger.debug("GGinAFilter is deactivated");
-            chain.doFilter(req, resp);
-            return;
-        }
-
-        HttpServletRequest sreq = (HttpServletRequest) req;
-
-        String requesturi = sreq.getRequestURI();
-        for (Enumeration e = req.getAttributeNames() ; e.hasMoreElements() ;) {
-            logger.debug(e.nextElement());
-        }
-
-        logger.debug("Request for: " + requesturi);
-
-        // Allow access to login pages
-        // TODO Maybe replace with Filter <url-pattern>
-        String path = this.sc.getContextPath();
-        if (requesturi.equals(path + "/login.jsp") ||
-                requesturi.equals(path + "/flys/login")
-                || requesturi.equals(path + "/FLYS.css")) {
-            logger.debug("Request for login " + requesturi);
-            chain.doFilter(req, resp);
-            return;
-        }
-
-        boolean redirect = false;
-
-        HttpSession session = sreq.getSession();
-
-        String uri = path + "/" + this.redirecturl;
-
-        /* Redirect if uri is root or redirecturl */
-        if (requesturi.equals(uri) || requesturi.equals(path + "/")) {
-            redirect = true;
-        }
-
-        if (sreq.getQueryString() != null) {
-            uri = uri + "?" + sreq.getQueryString();
-        }
-        session.setAttribute("requesturi", uri);
-
-        User user = (User)session.getAttribute("user");
-        if (user == null) {
-            logger.debug("No user in session: " + requesturi);
-            this.handleResponse(resp, redirect);
-            return;
-        }
-        if (user.hasExpired()) {
-            // try to re-authenticate the user
-            logger.debug("User ticket has expired: " + requesturi);
-            String encoding = sreq.getCharacterEncoding();
-            try {
-                Authentication auth = this.auth(user, encoding);
-                if (auth == null || !auth.isSuccess()) {
-                    logger.debug("Re-athentication not successful");
-                    this.handleResponse(resp, redirect);
-                }
-            }
-            catch(AuthenticationException e) {
-                logger.error("Failure during re-authentication", e);
-                this.handleResponse(resp, redirect);
-                return;
-            }
-        }
-
-        logger.debug("GGInAFilter.doFilter");
-        chain.doFilter(req, resp);
-        return;
-    }
-
-    private void redirect(ServletResponse resp) throws IOException {
-        logger.debug("Redirect to login");
-        ((HttpServletResponse) resp).sendRedirect(this.sc.getContextPath() +
-            "/login.jsp");
-    }
-
-    private void sendNotAuthenticated(ServletResponse resp) throws IOException {
-        logger.debug("Send not authenticated");
-        ((HttpServletResponse)resp).sendError(HttpServletResponse.SC_FORBIDDEN, "User not authenticated");
-    }
-
-    private void handleResponse(ServletResponse resp, boolean redirect) throws IOException {
-        if (redirect) {
-            this.redirect(resp);
-        }
-        else {
-            this.sendNotAuthenticated(resp);
-        }
-    }
-
-
-    /**
-     * Do nothing at destruction.
-     */
-    @Override
-    public void destroy() {
-    }
-
-    private Authentication auth(User user, String encoding)
-        throws AuthenticationException, IOException {
-        Features features = (Features)sc.getAttribute(Features.CONTEXT_ATTRIBUTE);
-        return AuthenticationFactory.getInstance(this.authmethod).auth(
-                user.getName(), user.getPassword(), encoding, features);
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/flys-client/src/main/java/de/intevation/flys/client/server/MapPrintServiceImpl.java	Wed Nov 07 13:40:00 2012 +0100
+++ b/flys-client/src/main/java/de/intevation/flys/client/server/MapPrintServiceImpl.java	Wed Nov 07 13:49:32 2012 +0100
@@ -1,22 +1,39 @@
 package de.intevation.flys.client.server;
 
 import de.intevation.artifacts.common.ArtifactNamespaceContext;
-
 import de.intevation.artifacts.common.utils.ClientProtocolUtils;
 import de.intevation.artifacts.common.utils.JSON;
 import de.intevation.artifacts.common.utils.StringUtils;
 import de.intevation.artifacts.common.utils.XMLUtils;
-
 import de.intevation.artifacts.httpclient.exceptions.ConnectionException;
-
 import de.intevation.artifacts.httpclient.http.HttpClient;
 import de.intevation.artifacts.httpclient.http.HttpClientImpl;
-
 import de.intevation.artifacts.httpclient.http.response.DocumentResponseHandler;
+import de.intevation.flys.client.shared.MapUtils;
+import de.intevation.flys.client.shared.model.MapConfig;
 
-import de.intevation.flys.client.shared.model.MapConfig;
-import de.intevation.flys.client.shared.MapUtils;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
 
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
 /*
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
@@ -24,31 +41,6 @@
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 */
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-
-import java.net.URLEncoder;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.ServletException;
-
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
-
-import org.apache.commons.httpclient.methods.GetMethod;
-
-import org.apache.log4j.Logger;
-
 /* Used by direct API call. -> Enforce GPLv3
 import org.mapfish.print.MapPrinter;
 import org.mapfish.print.output.OutputFactory;
@@ -57,10 +49,6 @@
 import org.mapfish.print.utils.PJsonObject;
 */
 
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
 public class MapPrintServiceImpl
 extends      HttpServlet
 {
@@ -371,6 +359,9 @@
             new org.apache.commons.httpclient.HttpClient(
                 new MultiThreadedHttpConnectionManager());
 
+        // FIXME: The request is not authenticated.
+        //        Currently this is not a problem because /flys/map-print
+        //        is whitelisted in GGInAFilter.
         GetMethod get = new GetMethod(url);
         int result = client.executeMethod(get);
         InputStream in = get.getResponseBodyAsStream();
--- a/flys-client/src/main/java/de/intevation/flys/client/server/RiverInfoServiceImpl.java	Wed Nov 07 13:40:00 2012 +0100
+++ b/flys-client/src/main/java/de/intevation/flys/client/server/RiverInfoServiceImpl.java	Wed Nov 07 13:49:32 2012 +0100
@@ -31,6 +31,8 @@
 
 
 /**
+ * GWT Service to serve the gauge and measurement station info
+ *
  * @author <a href="mailto:bjoern.ricks@intevation.de">Björn Ricks</a>
  */
 public class RiverInfoServiceImpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-client/src/main/java/de/intevation/flys/client/server/filter/GGInAFilter.java	Wed Nov 07 13:49:32 2012 +0100
@@ -0,0 +1,182 @@
+package de.intevation.flys.client.server.filter;
+
+import de.intevation.flys.client.server.auth.Authentication;
+import de.intevation.flys.client.server.auth.AuthenticationException;
+import de.intevation.flys.client.server.auth.AuthenticationFactory;
+import de.intevation.flys.client.server.auth.User;
+import de.intevation.flys.client.server.features.Features;
+
+import java.io.IOException;
+import java.util.Enumeration;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.log4j.Logger;
+
+
+/** ServletFilter used for GGInA authentification and certain authorisation. */
+public class GGInAFilter implements Filter {
+
+    /** Private logger. */
+    private static Logger logger = Logger.getLogger(GGInAFilter.class);
+
+    private boolean deactivate = false;
+    private String authmethod;
+    private String redirecturl;
+    private ServletContext sc;
+
+    public static final String LOGIN_JSP     = "/login.jsp";
+    public static final String LOGIN_SERVLET = "/flys/login";
+    public static final String FLYS_CSS      = "/FLYS.css";
+    public static final String MAP_PRINT     = "/flys/map-print";
+    public static final String MAPFISH_PRINT = "/flys/mapfish-print/print.pdf";
+
+
+    /**
+     * Initialize.
+     *
+     * Read FilterConfig parameter deactivate
+     */
+    @Override
+    public void init(FilterConfig config)
+    throws ServletException
+    {
+        String deactivate = config.getInitParameter("deactivate");
+        this.sc = config.getServletContext();
+        logger.debug("GGInAFilter context " + this.sc.getContextPath());
+        this.authmethod = sc.getInitParameter("authentication");
+        this.redirecturl = sc.getInitParameter("redirect-url");
+        if (deactivate != null && deactivate.equalsIgnoreCase("true")) {
+            this.deactivate = true;
+        }
+
+    }
+
+
+    /**
+     * Called when filter in chain invoked.
+     * @param req request to servlet
+     * @param resp response of servlet
+     * @param chain the filter chain
+     */
+    @Override
+    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
+    throws IOException, ServletException
+    {
+        if (this.deactivate) {
+            logger.debug("GGinAFilter is deactivated");
+            chain.doFilter(req, resp);
+            return;
+        }
+
+        HttpServletRequest sreq = (HttpServletRequest) req;
+
+        String requesturi = sreq.getRequestURI();
+        for (Enumeration e = req.getAttributeNames() ; e.hasMoreElements() ;) {
+            logger.debug(e.nextElement());
+        }
+
+        logger.debug("Request for: " + requesturi);
+
+        // Allow access to login pages
+        // TODO Maybe replace with Filter <url-pattern>
+        String path = this.sc.getContextPath();
+        if (requesturi.equals(path + LOGIN_JSP)
+                || requesturi.equals(path + LOGIN_SERVLET)
+                || requesturi.equals(path + FLYS_CSS)
+                || requesturi.equals(path + MAP_PRINT)
+                || requesturi.equals(path + MAPFISH_PRINT)) {
+            logger.debug("Request for login " + requesturi);
+            chain.doFilter(req, resp);
+            return;
+        }
+
+        boolean redirect = false;
+
+        HttpSession session = sreq.getSession();
+
+        String uri = path + "/" + this.redirecturl;
+
+        /* Redirect if uri is root or redirecturl */
+        if (requesturi.equals(uri) || requesturi.equals(path + "/")) {
+            redirect = true;
+        }
+
+        if (sreq.getQueryString() != null) {
+            uri = uri + "?" + sreq.getQueryString();
+        }
+        session.setAttribute("requesturi", uri);
+
+        User user = (User)session.getAttribute("user");
+        if (user == null) {
+            logger.debug("No user in session: " + requesturi);
+            this.handleResponse(resp, redirect);
+            return;
+        }
+        if (user.hasExpired()) {
+            // try to re-authenticate the user
+            logger.debug("User ticket has expired: " + requesturi);
+            String encoding = sreq.getCharacterEncoding();
+            try {
+                Authentication auth = this.auth(user, encoding);
+                if (auth == null || !auth.isSuccess()) {
+                    logger.debug("Re-athentication not successful");
+                    this.handleResponse(resp, redirect);
+                }
+            }
+            catch(AuthenticationException e) {
+                logger.error("Failure during re-authentication", e);
+                this.handleResponse(resp, redirect);
+                return;
+            }
+        }
+
+        chain.doFilter(req, resp);
+        return;
+    }
+
+    private void redirect(ServletResponse resp) throws IOException {
+        logger.debug("Redirect to login");
+        ((HttpServletResponse) resp).sendRedirect(this.sc.getContextPath() +
+            "/login.jsp");
+    }
+
+    private void sendNotAuthenticated(ServletResponse resp) throws IOException {
+        logger.debug("Send not authenticated");
+        ((HttpServletResponse)resp).sendError(HttpServletResponse.SC_FORBIDDEN, "User not authenticated");
+    }
+
+    private void handleResponse(ServletResponse resp, boolean redirect) throws IOException {
+        if (redirect) {
+            this.redirect(resp);
+        }
+        else {
+            this.sendNotAuthenticated(resp);
+        }
+    }
+
+
+    /**
+     * Do nothing at destruction.
+     */
+    @Override
+    public void destroy() {
+    }
+
+    private Authentication auth(User user, String encoding)
+        throws AuthenticationException, IOException {
+        Features features = (Features)sc.getAttribute(Features.CONTEXT_ATTRIBUTE);
+        return AuthenticationFactory.getInstance(this.authmethod).auth(
+                user.getName(), user.getPassword(), encoding, features);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-client/src/main/java/de/intevation/flys/client/server/filter/NoCacheFilter.java	Wed Nov 07 13:49:32 2012 +0100
@@ -0,0 +1,74 @@
+package de.intevation.flys.client.server.filter;
+
+import java.io.IOException;
+import java.util.Enumeration;
+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.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+
+/** ServletFilter to avoid caching for GWTs *.nocache.* files. */
+public class NoCacheFilter implements Filter {
+
+    private static final long DAY = 86400000L;
+
+    private static final String NO_CACHE = ".nocache.";
+
+    private static Logger log = Logger.getLogger(NoCacheFilter.class);
+
+    /**
+     * Initialize.
+     */
+    @Override
+    public void init(FilterConfig config)
+    throws ServletException
+    {
+    }
+
+
+    /**
+     * Called when filter in chain invoked.
+     * @param req request to servlet
+     * @param resp response of servlet
+     * @param chain the filter chain
+     */
+    @Override
+    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
+    throws IOException, ServletException
+    {
+        HttpServletRequest httpreq = (HttpServletRequest)req;
+        String uri = httpreq.getRequestURI();
+
+        if (uri.contains(NO_CACHE)) {
+            log.debug("Set no-cache for " + uri);
+
+            Date now = new Date();
+            HttpServletResponse httpresp = (HttpServletResponse)resp;
+            httpresp.setDateHeader("Date", now.getTime());
+            httpresp.setDateHeader("Expires", now.getTime() - DAY);
+            httpresp.setHeader("Pragma", "no-cache");
+            httpresp.setHeader("Cache-control",
+                    "no-cache, no-store, must-revalidate");
+        }
+
+        chain.doFilter(req, resp);
+    }
+
+
+    /**
+     * Do nothing at destruction.
+     */
+    @Override
+    public void destroy() {
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/flys-client/src/main/webapp/WEB-INF/web.xml	Wed Nov 07 13:40:00 2012 +0100
+++ b/flys-client/src/main/webapp/WEB-INF/web.xml	Wed Nov 07 13:49:32 2012 +0100
@@ -564,7 +564,7 @@
 
   <filter>
     <filter-name>GGInAFilter</filter-name>
-    <filter-class>de.intevation.flys.client.server.GGInAFilter</filter-class>
+    <filter-class>de.intevation.flys.client.server.filter.GGInAFilter</filter-class>
     <init-param>
         <param-name>deactivate</param-name>
         <param-value>false</param-value>
@@ -576,6 +576,17 @@
     <url-pattern>/*</url-pattern>
   </filter-mapping>
 
+  <filter>
+    <filter-name>NoCacheFilter</filter-name>
+    <filter-class>de.intevation.flys.client.server.filter.NoCacheFilter</filter-class>
+  </filter>
+
+  <filter-mapping>
+    <filter-name>NoCacheFilter</filter-name>
+    <url-pattern>/*</url-pattern>
+  </filter-mapping>
+
+
   <!-- Default page to serve -->
   <welcome-file-list>
     <welcome-file>FLYS.html</welcome-file>

http://dive4elements.wald.intevation.org