This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 11.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/11.0.x by this push:
     new 5574fab1ea Expose clientIdentifier generation as a function and expose 
a setter to modify it as needed
5574fab1ea is described below

commit 5574fab1ea35d5134af18f0e4a15145ac823e53c
Author: Brian Matzon <[email protected]>
AuthorDate: Thu Sep 25 10:37:58 2025 +0200

    Expose clientIdentifier generation as a function and expose a setter to 
modify it as needed
---
 .../valves/CrawlerSessionManagerValve.java         | 22 +++++++++++++++++-----
 webapps/docs/changelog.xml                         |  6 ++++++
 2 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/java/org/apache/catalina/valves/CrawlerSessionManagerValve.java 
b/java/org/apache/catalina/valves/CrawlerSessionManagerValve.java
index 0c3eaca627..1b44daec6e 100644
--- a/java/org/apache/catalina/valves/CrawlerSessionManagerValve.java
+++ b/java/org/apache/catalina/valves/CrawlerSessionManagerValve.java
@@ -22,6 +22,7 @@ import java.io.Serializable;
 import java.util.Enumeration;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
 import java.util.regex.Pattern;
 
 import jakarta.servlet.ServletException;
@@ -60,6 +61,8 @@ public class CrawlerSessionManagerValve extends ValveBase {
 
     private boolean isContextAware = true;
 
+    private Function<Request,String> clientIdentifierFunction = 
this::getClientIdentifier;
+
 
     /**
      * Specifies a default constructor so async support can be configured.
@@ -163,6 +166,15 @@ public class CrawlerSessionManagerValve extends ValveBase {
         this.isContextAware = isContextAware;
     }
 
+    /**
+     * Specify the clientIdentifier function that will be used to identify 
unique clients. The default is to use the
+     * client IP address, optionally combined with the host name and context 
name.
+     *
+     * @param clientIdentifierFunction The new function used to build 
identifiers for clients.
+     */
+    public void setClientIdentifierFunction(Function<Request,String> 
clientIdentifierFunction) {
+        this.clientIdentifierFunction = clientIdentifierFunction;
+    }
 
     @Override
     protected void initInternal() throws LifecycleException {
@@ -185,7 +197,7 @@ public class CrawlerSessionManagerValve extends ValveBase {
         boolean isBot = false;
         String sessionId = null;
         String clientIp = request.getRemoteAddr();
-        String clientIdentifier = getClientIdentifier(host, 
request.getContext(), clientIp);
+        String clientIdentifier = clientIdentifierFunction.apply(request);
 
         if (log.isTraceEnabled()) {
             log.trace(request.hashCode() + ": ClientIdentifier=" + 
clientIdentifier + ", RequestedSessionId=" +
@@ -263,12 +275,12 @@ public class CrawlerSessionManagerValve extends ValveBase 
{
         }
     }
 
-
-    private String getClientIdentifier(Host host, Context context, String 
clientIp) {
-        StringBuilder result = new StringBuilder(clientIp);
+    private String getClientIdentifier(Request request) {
+        StringBuilder result = new StringBuilder(request.getRemoteAddr());
         if (isHostAware) {
-            result.append('-').append(host.getName());
+            result.append('-').append(request.getHost().getName());
         }
+        Context context = request.getContext();
         if (isContextAware && context != null) {
             result.append(context.getName());
         }
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index b8e35504d9..5efee5a34e 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -120,6 +120,12 @@
         <code>org.apache.catalina.Connector</code> no longer requires
         <code>org.apache.tomcat.jni.AprStatus</code> to be present. (markt)
       </fix>
+      <add>
+        Add the ability to use a custom function to generate the client
+        identifier in the <code>CrawlerSessionManagerValve</code>. This is only
+        available programmatically. Pull request <pr>902</pr> by Brian Matzon.
+        (markt)
+      </add>
     </changelog>
   </subsection>
   <subsection name="Coyote">


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to