public class TimerFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
long start = System.currentTimeMillis();
chain.doFilter(req, resp); // 執行後續 Filter 與 Servlet
long elapsed = System.currentTimeMillis() - start;
String uri = ((HttpServletRequest) req).getRequestURI();
// 方式一:寫入 ServletContext 日誌(控制台/文件)
getServletContext().log(uri + " 執行耗時: " + elapsed + "ms");
// 方式二:放入請求屬性,JSP/頁面讀取顯示
req.setAttribute("execTime", elapsed);
}
}
<%-- 頁面底部 --%>
<div class="debug-info">
頁面執行耗時: ${requestScope.execTime} 毫秒
</div>
自定義 HttpServletResponseWrapper,在 getWriter() 返回的 PrintWriter 中攔截 close(),將耗時信息追加到 </body> 前。
<filter>
<filter-name>TimerFilter</filter-name>
<filter-class>com.example.TimerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TimerFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
chain.doFilter() 前後時間差,包含 Servlet 與視圖渲染。