Serving Static Content with a Custom Servlet
In order to serve static content (e.g., images, CSS) for a web application deployed on multiple containers, a custom servlet can be utilized to ensure consistent URL handling.
Requirements for the Servlet
Solution
While an alternative solution was suggested, it is possible to create a custom servlet that meets the stated requirements. Here's a potential implementation:
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class StaticContentServlet extends HttpServlet { private Path filePath; @Override public void init() throws ServletException { super.init(); String filePathString = getServletConfig().getInitParameter("filePath"); if (filePathString == null) { throw new ServletException("Missing filePath init parameter"); } filePath = Paths.get(filePathString); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { String path = request.getRequestURI().substring(request.getContextPath().length()); File file = filePath.resolve(path).toFile(); if (file.exists()) { response.setStatus(HttpServletResponse.SC_OK); response.setContentType(Files.probeContentType(file.toPath())); if (request.getDateHeader("If-Modified-Since") <= file.lastModified()) { response.setDateHeader("Last-Modified", file.lastModified()); } else { response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); return; } Files.copy(file.toPath(), response.getOutputStream()); } else { response.sendError(HttpServletResponse.SC_NOT_FOUND); } } }
Usage
<servlet-mapping> <servlet-name>StaticContentServlet</servlet-name> <url-pattern>/static/*</url-pattern> </servlet-mapping>
Benefits
This custom servlet provides reliable and customizable static content serving, meeting the specified requirements. It handles If-Modified-Since requests, allowing for conditional caching, and it can be configured to support other features (e.g., gzip encoding) via the servlet's init parameters.
The above is the detailed content of How Can a Custom Servlet Efficiently Serve Static Web Content Across Multiple Containers?. For more information, please follow other related articles on the PHP Chinese website!