如何在站点被ping后触发执行servlet中的自定义方法
实现方案
首先要明确:常规ICMP ping属于网络层请求,无法直接触达应用层的Servlet,你提到的「站点被ping」默认指应用层HTTP ping请求,如果确实需要监听ICMP ping可以参考最后补充方案。
代码调整步骤
- 你当前的Servlet只实现了
doPost方法,而绝大多数监控、健康检查服务的ping请求默认用GET方式,需要新增GET请求的处理逻辑,也可以直接把触发逻辑统一抽取,适配所有HTTP请求类型
// 新增doGet方法适配GET类型的ping请求 @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.myMethod(); // 必须返回正常响应,否则调用方会判定ping失败 response.setStatus(HttpServletResponse.SC_OK); response.getWriter().write("pong"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.myMethod(); response.setStatus(HttpServletResponse.SC_OK); response.getWriter().write("pong"); }
- 给Servlet配置ping请求的访问路径,用注解方式示例如下:
@WebServlet("/ping") // 配置后通过 你的站点域名/ping 即可访问触发 public class YourServlet extends HttpServlet { // 上面写的doGet、doPost方法,以及你自己的myMethod实现 private void myMethod(){ // 你的业务逻辑 } }
如果是用web.xml配置,添加对应的servlet-mapping映射到/ping路径即可。
监听ICMP ping的补充方案
如果确实需要响应网络层的ICMP ping,Java本身无法直接捕获ICMP包,需要在服务器侧添加监听脚本:
- Linux环境可以用
tcpdump抓取ICMP请求,匹配到之后用curl调用上面配置的/ping接口触发逻辑 - Windows环境可以用系统自带的网络事件监听工具,捕获ping事件后调用接口即可
注意事项
- 可以添加来源IP校验逻辑,只允许指定IP的ping请求触发
myMethod,避免恶意调用 - 如果
myMethod执行耗时较长,建议放到异步线程中执行,不要阻塞ping请求的响应,避免调用方判定超时
内容的提问来源于stack exchange,提问作者WScoder
相关产品推荐
相关产品推荐

