From: Ray Lee Date: Wed, 27 Dec 2017 00:14:18 +0000 (-0800) Subject: DRYD-71: Implement fallback filter. X-Git-Url: https://git.aero2k.de/?a=commitdiff_plain;h=fbc7c0e8c133de065b5ce988cb1b6e257839b08a;p=tmp%2Fjakarta-migration.git DRYD-71: Implement fallback filter. --- diff --git a/services/common/build.xml b/services/common/build.xml index e62c3dfff..389a5d981 100644 --- a/services/common/build.xml +++ b/services/common/build.xml @@ -11,6 +11,7 @@ + @@ -179,6 +180,8 @@ --> + + @@ -200,6 +203,7 @@ + diff --git a/services/common/src/main/java/org/collectionspace/services/common/filter/FallbackResourceFilter.java b/services/common/src/main/java/org/collectionspace/services/common/filter/FallbackResourceFilter.java new file mode 100644 index 000000000..e4831d397 --- /dev/null +++ b/services/common/src/main/java/org/collectionspace/services/common/filter/FallbackResourceFilter.java @@ -0,0 +1,68 @@ +package org.collectionspace.services.common.filter; + +import java.io.IOException; + +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 javax.servlet.http.HttpServletResponseWrapper; + +/** + * A filter that forwards requests that obtain a 404 error to a fallback, + * similar to apache's FallbackResource directive. The path to the fallback file + * may be specified using the "file" init parameter. It defaults to "/index.html". + */ +public class FallbackResourceFilter implements Filter { + String fallbackFile = "/index.html"; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + String fallbackFile = filterConfig.getInitParameter("file"); + + if (fallbackFile != null) { + this.fallbackFile = fallbackFile; + } + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + ResponseWrapper responseWrapper = new ResponseWrapper((HttpServletResponse) response); + + chain.doFilter(request, responseWrapper); + + if (responseWrapper.is404()) { + request.getRequestDispatcher(fallbackFile).forward(request, response); + } + } + + @Override + public void destroy() { + + } + + public class ResponseWrapper extends HttpServletResponseWrapper { + private boolean is404 = false; + + public ResponseWrapper(HttpServletResponse response) { + super(response); + } + + public boolean is404() { + return is404; + } + + @Override + public void sendError(int sc, String msg) throws IOException { + if (sc == 404) { + is404 = true; + } + else { + super.sendError(sc); + } + } + } +}