From ec8ed4e95158f79d564fc3f5c327e807e87bcef2 Mon Sep 17 00:00:00 2001 From: Alejandro Abdelnur Date: Wed, 14 Nov 2012 06:22:11 +0000 Subject: [PATCH] HADOO-8998. set Cache-Control no-cache header on all dynamic content. (tucu) git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1409095 13f79535-47bb-0310-9956-ffa450edef68 --- .../hadoop-common/CHANGES.txt | 2 + .../org/apache/hadoop/http/HttpServer.java | 18 ++++--- .../org/apache/hadoop/http/NoCacheFilter.java | 48 +++++++++++++++++++ .../apache/hadoop/http/TestHttpServer.java | 9 ++++ 4 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/NoCacheFilter.java diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 2d7f17d4cbd..ed3adbb3c77 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -364,6 +364,8 @@ Release 2.0.3-alpha - Unreleased HADOOP-9021. Enforce configured SASL method on the server (daryn via bobby) + HADOO-8998. set Cache-Control no-cache header on all dynamic content. (tucu) + OPTIMIZATIONS HADOOP-8866. SampleQuantiles#query is O(N^2) instead of O(N). (Andrew Wang diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer.java index 0de1806a4d5..683ccf4125c 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer.java @@ -25,11 +25,7 @@ import java.net.InetSocketAddress; import java.net.URL; import java.security.GeneralSecurityException; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import javax.net.ssl.SSLServerSocketFactory; import javax.servlet.Filter; @@ -103,6 +99,7 @@ public class HttpServer implements FilterContainer { public static final String CONF_CONTEXT_ATTRIBUTE = "hadoop.conf"; public static final String ADMINS_ACL = "admins.acl"; public static final String SPNEGO_FILTER = "SpnegoFilter"; + public static final String NO_CACHE_FILTER = "NoCacheFilter"; public static final String BIND_ADDRESS = "bind.address"; @@ -255,6 +252,7 @@ protected SSLServerSocketFactory createFactory() throws Exception { webAppContext.setWar(appDir + "/" + name); webAppContext.getServletContext().setAttribute(CONF_CONTEXT_ATTRIBUTE, conf); webAppContext.getServletContext().setAttribute(ADMINS_ACL, adminsAcl); + addNoCacheFilter(webAppContext); webServer.addHandler(webAppContext); addDefaultApps(contexts, appDir, conf); @@ -279,6 +277,12 @@ protected SSLServerSocketFactory createFactory() throws Exception { } } + @SuppressWarnings("unchecked") + private void addNoCacheFilter(WebAppContext ctxt) { + defineFilter(ctxt, NO_CACHE_FILTER, + NoCacheFilter.class.getName(), Collections.EMPTY_MAP, new String[] { "/*"}); + } + /** * Create a required listener for the Jetty instance listening on the port * provided. This wrapper and all subclasses must create at least one @@ -338,6 +342,7 @@ protected void addDefaultApps(ContextHandlerCollection parent, } logContext.setDisplayName("logs"); setContextAttributes(logContext, conf); + addNoCacheFilter(webAppContext); defaultContexts.put(logContext, true); } // set up the context for "/static/*" @@ -369,6 +374,7 @@ protected void addDefaultServlets() { public void addContext(Context ctxt, boolean isFiltered) throws IOException { webServer.addHandler(ctxt); + addNoCacheFilter(webAppContext); defaultContexts.put(ctxt, isFiltered); } @@ -462,7 +468,7 @@ public void addInternalServlet(String name, String pathSpec, holder.setName(name); } webAppContext.addServlet(holder, pathSpec); - + if(requireAuth && UserGroupInformation.isSecurityEnabled()) { LOG.info("Adding Kerberos (SPNEGO) filter to " + name); ServletHandler handler = webAppContext.getServletHandler(); diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/NoCacheFilter.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/NoCacheFilter.java new file mode 100644 index 00000000000..6c3397f3c93 --- /dev/null +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/NoCacheFilter.java @@ -0,0 +1,48 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.http; + +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; +import java.io.IOException; + +public class NoCacheFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest req, ServletResponse res, + FilterChain chain) + throws IOException, ServletException { + HttpServletResponse httpRes = (HttpServletResponse) res; + httpRes.setHeader("Cache-Control", "no-cache"); + chain.doFilter(req, res); + } + + @Override + public void destroy() { + } + +} diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestHttpServer.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestHttpServer.java index a4d5c5a9c4e..e78fc4b53fc 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestHttpServer.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestHttpServer.java @@ -539,4 +539,13 @@ private HttpServer checkBindAddress(String host, int port, boolean findPort) } return server; } + + @Test + public void testNoCacheHeader() throws Exception { + URL url = new URL(baseUrl, "/echo?a=b&c=d"); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + assertEquals(HttpURLConnection.HTTP_OK, conn.getResponseCode()); + assertEquals("no-cache", conn.getHeaderField("Cache-Control")); + } + }