我想为每个建立到Tomcat的连接获取一个唯一的标识符。我不是在谈论用户(客户端)的会话或唯一性,而是每个连接。比如,客户端A发送一个GET,然后另一个。在我的场景中,这是两个独立且唯一的连接。在Tomcat中,是否有任何变量或其他东西可以为这样的连接扮演标识符的角色?
xdnvmnnf1#
一个选项是使用ServletFilter:
public class UniqueRequestFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { String requestID = UUID.randomUUID().toString() //save to ThreadLocal... try { chain.doFilter(req, res); } finally { //remove from ThreadLocal } } public void init(FilterConfig config) throws ServletException { } public void destroy() { } }
字符串您将能够在应用程序中的任何时候从ThreadLocal获取请求值。
wn9m85ua2#
Servlet容器具有会话跟踪机制,通常其cookie名为“JSESSIONID”,您可以将其用作会话标识符。根据servlet规范:会话跟踪cookie的标准名称必须是JSESSIONID,所有3.0兼容容器都必须支持该名称更多细节可以在servlet规范中找到。
n7taea2i3#
Jakarta Servlet 6.0(c.2022)在ServletRequest接口中添加了一个新方法:getRequestId。虽然过去您可能不得不编写自己的request-id-generator,但现在您应该能够在Web应用程序中依赖容器不可知特性。
ServletRequest
getRequestId
zengzsys4#
一个解决方案可能是在每个请求上创建一个新的会话。实现这一点的一种方法是在web.xml中的session-config/cookie-config中设置true(除非您正在运行HTTPS连接)
4条答案
按热度按时间xdnvmnnf1#
一个选项是使用ServletFilter:
字符串
您将能够在应用程序中的任何时候从ThreadLocal获取请求值。
wn9m85ua2#
Servlet容器具有会话跟踪机制,通常其cookie名为“JSESSIONID”,您可以将其用作会话标识符。根据servlet规范:
会话跟踪cookie的标准名称必须是JSESSIONID,所有3.0兼容容器都必须支持该名称
更多细节可以在servlet规范中找到。
n7taea2i3#
Jakarta Servlet 6.0(c.2022)在
ServletRequest
接口中添加了一个新方法:getRequestId
。虽然过去您可能不得不编写自己的request-id-generator,但现在您应该能够在Web应用程序中依赖容器不可知特性。
zengzsys4#
一个解决方案可能是在每个请求上创建一个新的会话。
实现这一点的一种方法是在web.xml中的session-config/cookie-config中设置true(除非您正在运行HTTPS连接)