自定义 Servlet 如何跨多个容器高效地提供静态 Web 内容?
Dec 13, 2024 am 10:24 AM使用自定义 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中文网其他相关文章!
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章
击败分裂小说需要多长时间?
3 周前
By DDD
仓库:如何复兴队友
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前
By 尊渡假赌尊渡假赌尊渡假赌
公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?
3 周前
By 王林

热门文章
击败分裂小说需要多长时间?
3 周前
By DDD
仓库:如何复兴队友
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前
By 尊渡假赌尊渡假赌尊渡假赌
公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?
3 周前
By 王林

热门文章标签

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

2025年的前4个JavaScript框架:React,Angular,Vue,Svelte

如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案?

如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射?

如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存?
