Skip to content

Commit

Permalink
Support additional context paths (#5156)
Browse files Browse the repository at this point in the history
* Support additional context paths - for the primary deployment, for redirecting, and for secondary static content
  • Loading branch information
labkey-jeckels authored Jan 25, 2024
1 parent 5fbecac commit 1ba37bb
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 0 deletions.
9 changes: 9 additions & 0 deletions api/src/org/labkey/api/ApiModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@
import org.labkey.api.view.JspTemplate;
import org.labkey.api.view.LabKeyKaptchaServlet;
import org.labkey.api.view.Portal;
import org.labkey.api.view.RedirectorServlet;
import org.labkey.api.view.ViewServlet;
import org.labkey.api.view.WebPartFactory;
import org.labkey.api.webdav.WebdavResolverImpl;
Expand Down Expand Up @@ -197,6 +198,14 @@ public void registerServlets(ServletContext servletCtx)
// http://host/labkey/filecontent/proj/dir/sendFile.view?file=test.html
servletCtx.addServlet("FileServlet", new FileServlet()).
addMapping("/files/*");

String legacyContextPath = servletCtx.getInitParameter("legacyContextPath");
if (legacyContextPath != null)
{
ServletRegistration.Dynamic redirectorDynamic = servletCtx.addServlet("RedirectorServlet", new RedirectorServlet(legacyContextPath));
redirectorDynamic.addMapping(legacyContextPath + "/*");
redirectorDynamic.setMultipartConfig(new MultipartConfigElement(SpringActionController.getTempUploadDir().getPath()));
}
}

@Override
Expand Down
45 changes: 45 additions & 0 deletions api/src/org/labkey/api/view/RedirectorServlet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package org.labkey.api.view;

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

/** Simple redirector to redirect and forward from legacy context paths to the root context */
public class RedirectorServlet extends HttpServlet
{
private final String _legacyContextPath;

public RedirectorServlet(String legacyContextPath)
{
if (!legacyContextPath.startsWith("/") || legacyContextPath.length() < 2)
{
throw new IllegalArgumentException("Legacy context path must start with / and cannot be the root context path. Invalid path: " + legacyContextPath + ", specified via context.legacyContextPath in application.properties");
}
_legacyContextPath = legacyContextPath;
}

@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
if ("get".equalsIgnoreCase(request.getMethod()))
{
// Send a redirect to let the client know there's a new preferred URL
String originalUrl = request.getRequestURL().toString();
String redirectUrl = originalUrl.replaceFirst(_legacyContextPath, "");

response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
response.setHeader("Location", redirectUrl);
}
else
{
// For non-GETs, use a forward so that we don't lose POST parameters, etc
String originalUri = request.getRequestURI();
String forwardUri = originalUri.replaceFirst(_legacyContextPath, "");

getServletContext().getRequestDispatcher(forwardUri).forward(request, response);
}
}
}

0 comments on commit 1ba37bb

Please sign in to comment.