首页 > Java > java教程 > 自定义 Servlet 如何跨多个容器高效地提供静态 Web 内容?

自定义 Servlet 如何跨多个容器高效地提供静态 Web 内容?

Barbara Streisand
发布: 2024-12-13 10:24:15
原创
801 人浏览过

How Can a Custom Servlet Efficiently Serve Static Web Content Across Multiple Containers?

使用自定义 Servlet 提供静态内容

为了为部署在多个容器,可以利用自定义 servlet 来确保一致的 URL 处理。

要求对于 Servlet

  • 最小的外部依赖
  • 高效可靠
  • 与 If-Modified-Since 标头的兼容性(可自定义 getLastModified 方法)
  • 可选支持 gzip 编码和etags

解决方案

虽然建议了替代解决方案,但可以创建满足规定要求的自定义 servlet。下面是一个可能的实现:

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);
    }
  }
}
登录后复制

用法

  • 在 web.xml 部署描述符中,将 servlet 映射到所需的 URL 模式。例如:
<servlet-mapping>
  <servlet-name>StaticContentServlet</servlet-name>
  <url-pattern>/static/*</url-pattern>
</servlet-mapping>
登录后复制
  • 在 servlet 的 init() 方法中,将 filePath 实例变量初始化为静态内容目录的位置。此目录应包含相对于上下文根的静态文件。

优点

此自定义 servlet 提供可靠且可自定义的静态内容服务,满足指定的要求。它处理 If-Modified-Since 请求,允许条件缓存,并且可以通过 servlet 的 init 参数将其配置为支持其他功能(例如 gzip 编码)。

以上是自定义 Servlet 如何跨多个容器高效地提供静态 Web 内容?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板