Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
import org.apache.hadoop.hbase.http.log.LogLevel;
import org.apache.hadoop.hbase.util.ReflectionUtils;
import org.apache.hadoop.hbase.util.Threads;
import org.apache.hadoop.security.AuthenticationFilterInitializer;
import org.apache.hadoop.security.SecurityUtil;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.security.authentication.server.AuthenticationFilter;
Expand Down Expand Up @@ -149,6 +150,7 @@ public class HttpServer implements FilterContainer {
HTTP_SPNEGO_AUTHENTICATION_PREFIX + "admin.groups";
public static final String HTTP_PRIVILEGED_CONF_KEY =
"hbase.security.authentication.ui.config.protected";
public static final String HTTP_UI_NO_CACHE_ENABLE_KEY = "hbase.http.filter.no-store.enable";
public static final boolean HTTP_PRIVILEGED_CONF_DEFAULT = false;

// The ServletContext attribute where the daemon Configuration
Expand Down Expand Up @@ -690,7 +692,7 @@ private static WebAppContext createWebAppContext(String name, Configuration conf
ctx.getServletContext().setAttribute(org.apache.hadoop.http.HttpServer2.CONF_CONTEXT_ATTRIBUTE,
conf);
ctx.getServletContext().setAttribute(ADMINS_ACL, adminsAcl);
addNoCacheFilter(ctx);
addNoCacheFilter(ctx, conf);
return ctx;
}

Expand All @@ -712,9 +714,16 @@ public static GzipHandler buildGzipHandler(final Handler wrapped) {
return gzipHandler;
}

private static void addNoCacheFilter(WebAppContext ctxt) {
defineFilter(ctxt, NO_CACHE_FILTER, NoCacheFilter.class.getName(),
Collections.<String, String> emptyMap(), new String[] { "/*" });
private static void addNoCacheFilter(ServletContextHandler ctxt, Configuration conf) {
if (conf.getBoolean(HTTP_UI_NO_CACHE_ENABLE_KEY, false)) {
Map<String, String> filterConfig =
AuthenticationFilterInitializer.getFilterConfigMap(conf, "hbase.http.filter.");
defineFilter(ctxt, NO_CACHE_FILTER, NoCacheFilter.class.getName(), filterConfig,
new String[] { "/*" });
} else {
defineFilter(ctxt, NO_CACHE_FILTER, NoCacheFilter.class.getName(),
Collections.<String, String> emptyMap(), new String[] { "/*" });
}
}

/** Get an array of FilterConfiguration specified in the conf */
Expand Down Expand Up @@ -755,6 +764,7 @@ protected void addDefaultApps(ContextHandlerCollection parent, final String appD
conf.getBoolean(ServerConfigurationKeys.HBASE_JETTY_LOGS_SERVE_ALIASES,
ServerConfigurationKeys.DEFAULT_HBASE_JETTY_LOGS_SERVE_ALIASES));
setContextAttributes(logContext, conf);
addNoCacheFilter(logContext, conf);
defaultContexts.put(logContext, true);
}
// set up the context for "/static/*"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,28 @@

@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)
public class NoCacheFilter implements Filter {

/**
* Constant for the configuration property that indicates no-store cache control is enabled.
*/
public static final String NO_STORE = "no-store.enable";

private boolean noStoreEnabled = false;

@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.noStoreEnabled = Boolean.valueOf(filterConfig.getInitParameter(NO_STORE));
}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse httpRes = (HttpServletResponse) res;
httpRes.setHeader("Cache-Control", "no-cache");
StringBuilder header = new StringBuilder("no-cache");
if (noStoreEnabled) {
header.append(", no-store, max-age=0");
}
httpRes.setHeader("Cache-Control", header.toString());
long now = EnvironmentEdgeManager.currentTime();
httpRes.addDateHeader("Expires", now);
httpRes.addDateHeader("Date", now);
Expand Down