You need to enable JavaScript to run this app. Tomcat9 修改sessionsList.jsp 新增会话最后请求路径列的实现问题
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat9 修改sessionsList.jsp 新增会话最后请求路径列的实现问题

Tomcat 9 manager会话页面新增最后访问路径列实现方案

前置说明

Tomcat内置的org.apache.catalina.Session接口默认不会存储客户端最后访问的请求路径,需要先通过全局阀门/应用过滤器在每次请求时将路径写入会话属性,再修改manager页面的jsp代码读取该属性展示。

步骤1:配置路径存储逻辑

两种方案二选一即可:

方案A:全局阀门配置(无需修改业务应用)

适合需要监控所有部署在Tomcat上的应用会话的场景:

  1. 编写自定义阀门类,代码如下:
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);
    }
}
  1. 将上述代码编译后的class文件放入tomcat/lib目录下
  2. 修改tomcat/conf/server.xml,在<Host>节点内添加配置:
<Valve className="LastRequestPathValve" />
  1. 重启Tomcat生效

方案B:应用过滤器配置(仅对单个应用生效)

适合只需要监控特定应用的场景:

  1. 在目标应用中新增过滤器类:
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);
    }
}
  1. 在应用的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:

  1. 首先找到表格的表头行,新增一列表头:
<th>最后访问路径</th>
  1. 找到遍历会话的代码片段,将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);
}
  1. 找到输出表格行的HTML代码,新增一列输出lastPath:
<td><%= lastPath %></td>

注意事项

  • 若使用Tomcat集群会话同步功能,lastRequestPath为String类型本身支持序列化,无需额外处理即可在集群节点间同步
  • 新增的属性不会影响原有会话的正常功能,对业务请求无侵入

内容的提问来源于stack exchange,提问作者KunLun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 16:30:00