Tomcat9 修改sessionsList.jsp 新增会话最后请求路径列的实现问题
Tomcat 9 manager会话页面新增最后访问路径列实现方案
前置说明
Tomcat内置的org.apache.catalina.Session接口默认不会存储客户端最后访问的请求路径,需要先通过全局阀门/应用过滤器在每次请求时将路径写入会话属性,再修改manager页面的jsp代码读取该属性展示。
步骤1:配置路径存储逻辑
两种方案二选一即可:
方案A:全局阀门配置(无需修改业务应用)
适合需要监控所有部署在Tomcat上的应用会话的场景:
- 编写自定义阀门类,代码如下:
import org.apache.catalina.Valve; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; import org.apache.catalina.valves.ValveBase; import javax.servlet.ServletException; import javax.servlet.http.HttpSession; import java.io.IOException; public class LastRequestPathValve extends ValveBase { @Override public void invoke(Request request, Response response) throws IOException, ServletException { try { HttpSession session = request.getSession(false); if (session != null) { // 只存储请求路径,不包含域名参数等 String requestPath = request.getRequestURI(); session.setAttribute("lastRequestPath", requestPath); } } catch (Exception e) { // 忽略异常避免影响正常请求 } // 继续执行后续阀门逻辑 getNext().invoke(request, response); } }
- 将上述代码编译后的class文件放入
tomcat/lib目录下 - 修改
tomcat/conf/server.xml,在<Host>节点内添加配置:
<Valve className="LastRequestPathValve" />
- 重启Tomcat生效
方案B:应用过滤器配置(仅对单个应用生效)
适合只需要监控特定应用的场景:
- 在目标应用中新增过滤器类:
import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException; public class LastRequestPathFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpSession session = req.getSession(false); if (session != null) { session.setAttribute("lastRequestPath", req.getRequestURI()); } chain.doFilter(request, response); } }
- 在应用的
WEB-INF/web.xml中添加过滤器配置:
<filter> <filter-name>lastRequestPathFilter</filter-name> <filter-class>你自己的包路径.LastRequestPathFilter</filter-class> </filter> <filter-mapping> <filter-name>lastRequestPathFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
步骤2:修改manager页面代码
编辑tomcat/webapps/manager/WEB-INF/jsp/sessionsList.jsp:
- 首先找到表格的表头行,新增一列表头:
<th>最后访问路径</th>
- 找到遍历会话的代码片段,将
String lastPath = ...部分替换为如下代码:
// 从Catalina Session中获取标准HttpSession对象 HttpSession httpSession = currentSession.getSession(); String lastPath = (String) httpSession.getAttribute("lastRequestPath"); if (lastPath == null) { lastPath = "无记录"; } else { // 转义避免XSS风险 lastPath = JspHelper.escapeXml(lastPath); }
- 找到输出表格行的HTML代码,新增一列输出lastPath:
<td><%= lastPath %></td>
注意事项
- 若使用Tomcat集群会话同步功能,
lastRequestPath为String类型本身支持序列化,无需额外处理即可在集群节点间同步 - 新增的属性不会影响原有会话的正常功能,对业务请求无侵入
内容的提问来源于stack exchange,提问作者KunLun
相关产品推荐
相关产品推荐

