Author: rjung Date: Thu Sep 22 18:01:31 2011 New Revision: 1174289 URL: http://svn.apache.org/viewvc?rev=1174289&view=rev Log: - URI Map: Add "sticky_ignore" extension attributes to uri worker map. It allows to disable stickyness for individual mounts.
- HTTPD: Allow dynamic disabling of stickyness using the environment variable JK_STICKY_IGNORE. This can be useful to break cookie stickyness for non-sticky requests like login forms. Modified: tomcat/jk/trunk/native/apache-1.3/mod_jk.c tomcat/jk/trunk/native/apache-2.0/mod_jk.c tomcat/jk/trunk/native/common/jk_lb_worker.c tomcat/jk/trunk/native/common/jk_service.h tomcat/jk/trunk/native/common/jk_status.c tomcat/jk/trunk/native/common/jk_uri_worker_map.c tomcat/jk/trunk/native/common/jk_uri_worker_map.h tomcat/jk/trunk/native/common/jk_util.c tomcat/jk/trunk/native/iis/jk_isapi_plugin.c tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml tomcat/jk/trunk/xdocs/reference/apache.xml tomcat/jk/trunk/xdocs/reference/uriworkermap.xml tomcat/jk/trunk/xdocs/reference/workers.xml Modified: tomcat/jk/trunk/native/apache-1.3/mod_jk.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/apache-1.3/mod_jk.c?rev=1174289&r1=1174288&r2=1174289&view=diff ============================================================================== --- tomcat/jk/trunk/native/apache-1.3/mod_jk.c (original) +++ tomcat/jk/trunk/native/apache-1.3/mod_jk.c Thu Sep 22 18:01:31 2011 @@ -79,6 +79,7 @@ #define JK_ENV_KEY_SIZE ("SSL_CIPHER_USEKEYSIZE") #define JK_ENV_CERTCHAIN_PREFIX ("SSL_CLIENT_CERT_CHAIN_") #define JK_ENV_REPLY_TIMEOUT ("JK_REPLY_TIMEOUT") +#define JK_ENV_STICKY_IGNORE ("JK_STICKY_IGNORE") #define JK_ENV_WORKER_NAME ("JK_WORKER_NAME") #define JK_NOTE_WORKER_NAME ("JK_WORKER_NAME") #define JK_NOTE_WORKER_TYPE ("JK_WORKER_TYPE") @@ -679,6 +680,7 @@ static int init_ws_service(apache_privat request_rec *r = private_data->r; char *ssl_temp = NULL; const char *reply_timeout = NULL; + const char *sticky_ignore = NULL; rule_extension_t *e; /* Copy in function pointers (which are really methods) */ @@ -726,6 +728,7 @@ static int init_ws_service(apache_privat e = (rule_extension_t *)ap_get_module_config(r->request_config, &jk_module); if (e) { s->extension.reply_timeout = e->reply_timeout; + s->extension.sticky_ignore = e->sticky_ignore; s->extension.use_server_error_pages = e->use_server_error_pages; if (e->activation) { s->extension.activation = ap_palloc(r->pool, e->activation_size * sizeof(int)); @@ -744,6 +747,22 @@ static int init_ws_service(apache_privat s->extension.reply_timeout = r; } + sticky_ignore = ap_table_get(r->subprocess_env, JK_ENV_STICKY_IGNORE); + if (sticky_ignore) { + if (*sticky_ignore == '\0') { + s->extension.reply_timeout = JK_TRUE; + } + else { + int r = atoi(sticky_ignore); + if (r) { + s->extension.reply_timeout = JK_TRUE; + } + else { + s->extension.reply_timeout = JK_FALSE; + } + } + } + if (conf->options & JK_OPT_DISABLEREUSE) s->disable_reuse = 1; Modified: tomcat/jk/trunk/native/apache-2.0/mod_jk.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/apache-2.0/mod_jk.c?rev=1174289&r1=1174288&r2=1174289&view=diff ============================================================================== --- tomcat/jk/trunk/native/apache-2.0/mod_jk.c (original) +++ tomcat/jk/trunk/native/apache-2.0/mod_jk.c Thu Sep 22 18:01:31 2011 @@ -114,6 +114,7 @@ #define JK_ENV_KEY_SIZE ("SSL_CIPHER_USEKEYSIZE") #define JK_ENV_CERTCHAIN_PREFIX ("SSL_CLIENT_CERT_CHAIN_") #define JK_ENV_REPLY_TIMEOUT ("JK_REPLY_TIMEOUT") +#define JK_ENV_STICKY_IGNORE ("JK_STICKY_IGNORE") #define JK_ENV_WORKER_NAME ("JK_WORKER_NAME") #define JK_NOTE_WORKER_NAME ("JK_WORKER_NAME") #define JK_NOTE_WORKER_TYPE ("JK_WORKER_TYPE") @@ -734,6 +735,7 @@ static int init_ws_service(apache_privat request_rec *r = private_data->r; char *ssl_temp = NULL; const char *reply_timeout = NULL; + const char *sticky_ignore = NULL; rule_extension_t *e; /* Copy in function pointers (which are really methods) */ @@ -780,6 +782,7 @@ static int init_ws_service(apache_privat e = (rule_extension_t *)ap_get_module_config(r->request_config, &jk_module); if (e) { s->extension.reply_timeout = e->reply_timeout; + s->extension.sticky_ignore = e->sticky_ignore; s->extension.use_server_error_pages = e->use_server_error_pages; if (e->activation) { s->extension.activation = apr_palloc(r->pool, e->activation_size * sizeof(int)); @@ -798,6 +801,22 @@ static int init_ws_service(apache_privat s->extension.reply_timeout = r; } + sticky_ignore = apr_table_get(r->subprocess_env, JK_ENV_STICKY_IGNORE); + if (sticky_ignore) { + if (*sticky_ignore == '\0') { + s->extension.reply_timeout = JK_TRUE; + } + else { + int r = atoi(sticky_ignore); + if (r) { + s->extension.reply_timeout = JK_TRUE; + } + else { + s->extension.reply_timeout = JK_FALSE; + } + } + } + if (conf->options & JK_OPT_DISABLEREUSE) s->disable_reuse = 1; Modified: tomcat/jk/trunk/native/common/jk_lb_worker.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_lb_worker.c?rev=1174289&r1=1174288&r2=1174289&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_lb_worker.c (original) +++ tomcat/jk/trunk/native/common/jk_lb_worker.c Thu Sep 22 18:01:31 2011 @@ -1118,9 +1118,9 @@ static int JK_METHOD service(jk_endpoint jk_b_reset(s->reco_buf); s->reco_status = RECO_INITED; - if (p->worker->sticky_session) { + if (p->worker->sticky_session && s->extension.sticky_ignore != JK_TRUE) { /* Use sessionid only if sticky_session is - * defined for this load balancer + * defined and not overwritten for this load balancer */ sessionid = get_sessionid(s, p->worker, l); } Modified: tomcat/jk/trunk/native/common/jk_service.h URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_service.h?rev=1174289&r1=1174288&r2=1174289&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_service.h (original) +++ tomcat/jk/trunk/native/common/jk_service.h Thu Sep 22 18:01:31 2011 @@ -82,6 +82,8 @@ struct svc_extension { /* reply_timeout overwrite */ int reply_timeout; + /* Whether to ignore session routing info */ + int sticky_ignore; /* activation state overwrites for load balancers */ /* Dynamically allocated array with one entry per lb member. */ int *activation; Modified: tomcat/jk/trunk/native/common/jk_status.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_status.c?rev=1174289&r1=1174288&r2=1174289&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_status.c (original) +++ tomcat/jk/trunk/native/common/jk_status.c Thu Sep 22 18:01:31 2011 @@ -231,10 +231,10 @@ #define JK_STATUS_FORM_START "<form method=\"%s\" action=\"%s\">\n" #define JK_STATUS_FORM_HIDDEN_INT "<input type=\"hidden\" name=\"%s\" value=\"%d\"/>\n" #define JK_STATUS_FORM_HIDDEN_STRING "<input type=\"hidden\" name=\"%s\" value=\"%s\"/>\n" -#define JK_STATUS_URI_MAP_TABLE_HEAD "<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n" -#define JK_STATUS_URI_MAP_TABLE_ROW "<tr><td>%s</td><td>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%d</td></tr>\n" -#define JK_STATUS_URI_MAP_TABLE_HEAD2 "<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n" -#define JK_STATUS_URI_MAP_TABLE_ROW2 "<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%d</td></tr>\n" +#define JK_STATUS_URI_MAP_TABLE_HEAD "<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n" +#define JK_STATUS_URI_MAP_TABLE_ROW "<tr><td>%s</td><td>%s</td><td>%s</td><td>%d</td><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%d</td></tr>\n" +#define JK_STATUS_URI_MAP_TABLE_HEAD2 "<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n" +#define JK_STATUS_URI_MAP_TABLE_ROW2 "<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%d</td><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%d</td></tr>\n" #define JK_STATUS_SHOW_AJP_CONF_HEAD "<tr>" \ "<th>Type</th>" \ "<th>" JK_STATUS_ARG_AJP_TEXT_HOST_STR "</th>" \ @@ -1549,6 +1549,7 @@ static void display_map(jk_ws_service_t uri_worker_map_get_match(uwr, buf, l), uri_worker_map_get_source(uwr, l), uwr->extensions.reply_timeout, + uwr->extensions.sticky_ignore, uwr->extensions.fail_on_status_str ? uwr->extensions.fail_on_status_str : "-", uwr->extensions.active ? uwr->extensions.active : "-", uwr->extensions.disabled ? uwr->extensions.disabled : "-", @@ -1560,6 +1561,7 @@ static void display_map(jk_ws_service_t uri_worker_map_get_match(uwr, buf, l), uri_worker_map_get_source(uwr, l), uwr->extensions.reply_timeout, + uwr->extensions.sticky_ignore, uwr->extensions.fail_on_status_str ? uwr->extensions.fail_on_status_str : "-", uwr->extensions.active ? uwr->extensions.active : "-", uwr->extensions.disabled ? uwr->extensions.disabled : "-", @@ -1575,6 +1577,7 @@ static void display_map(jk_ws_service_t jk_print_xml_att_string(s, 8, "type", uri_worker_map_get_match(uwr, buf, l)); jk_print_xml_att_string(s, 8, "source", uri_worker_map_get_source(uwr, l)); jk_print_xml_att_int(s, 8, "reply_timeout", uwr->extensions.reply_timeout); + jk_print_xml_att_int(s, 8, "sticky_ignore", uwr->extensions.sticky_ignore); jk_print_xml_att_string(s, 8, "fail_on_status", uwr->extensions.fail_on_status_str); jk_print_xml_att_string(s, 8, "active", uwr->extensions.active); jk_print_xml_att_string(s, 8, "disabled", uwr->extensions.disabled); @@ -1591,6 +1594,7 @@ static void display_map(jk_ws_service_t jk_printf(s, " type=\"%s\"", uri_worker_map_get_match(uwr, buf, l)); jk_printf(s, " source=\"%s\"", uri_worker_map_get_source(uwr, l)); jk_printf(s, " reply_timeout=\"%d\"", uwr->extensions.reply_timeout); + jk_printf(s, " sticky_ignore=\"%d\"", uwr->extensions.sticky_ignore); jk_printf(s, " fail_on_status=\"%s\"", uwr->extensions.fail_on_status_str ? uwr->extensions.fail_on_status_str : ""); jk_printf(s, " active=\"%s\"", uwr->extensions.active ? uwr->extensions.active : ""); jk_printf(s, " disabled=\"%s\"", uwr->extensions.disabled ? uwr->extensions.disabled : ""); @@ -1605,6 +1609,7 @@ static void display_map(jk_ws_service_t jk_print_prop_item_string(s, w, worker, "map", count, "type", uri_worker_map_get_match(uwr, buf, l)); jk_print_prop_item_string(s, w, worker, "map", count, "source", uri_worker_map_get_source(uwr, l)); jk_print_prop_item_int(s, w, worker, "map", count, "reply_timeout", uwr->extensions.reply_timeout); + jk_print_prop_item_int(s, w, worker, "map", count, "sticky_ignore", uwr->extensions.sticky_ignore); jk_print_prop_item_string(s, w, worker, "map", count, "fail_on_status", uwr->extensions.fail_on_status_str); jk_print_prop_item_string(s, w, worker, "map", count, "active", uwr->extensions.active); jk_print_prop_item_string(s, w, worker, "map", count, "disabled", uwr->extensions.disabled); @@ -1659,10 +1664,10 @@ static void display_maps(jk_ws_service_t jk_puts(s, "]</h3><table>\n"); if (has_server_iterator) jk_printf(s, JK_STATUS_URI_MAP_TABLE_HEAD2, - "Server", "URI", "Match Type", "Source", "Reply Timeout", "Fail on Status", "Active", "Disabled", "Stopped", "Use Server Errors"); + "Server", "URI", "Match Type", "Source", "Reply Timeout", "Sticky Ignore", "Fail on Status", "Active", "Disabled", "Stopped", "Use Server Errors"); else jk_printf(s, JK_STATUS_URI_MAP_TABLE_HEAD, - "URI", "Match Type", "Source", "Reply Timeout", "Fail on Status", "Active", "Disabled", "Stopped", "Use Server Errors"); + "URI", "Match Type", "Source", "Reply Timeout", "Sticky Ignore", "Fail on Status", "Active", "Disabled", "Stopped", "Use Server Errors"); } count = 0; if (has_server_iterator) { Modified: tomcat/jk/trunk/native/common/jk_uri_worker_map.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_uri_worker_map.c?rev=1174289&r1=1174288&r2=1174289&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_uri_worker_map.c (original) +++ tomcat/jk/trunk/native/common/jk_uri_worker_map.c Thu Sep 22 18:01:31 2011 @@ -40,6 +40,7 @@ #endif #define JK_UWMAP_EXTENSION_REPLY_TIMEOUT "reply_timeout=" +#define JK_UWMAP_EXTENSION_STICKY_IGNORE "sticky_ignore=" #define JK_UWMAP_EXTENSION_ACTIVE "active=" #define JK_UWMAP_EXTENSION_DISABLED "disabled=" #define JK_UWMAP_EXTENSION_STOPPED "stopped=" @@ -637,6 +638,7 @@ int uri_worker_map_add(jk_uri_worker_map w = jk_pool_strdup(p, worker); uwr->extensions.reply_timeout = -1; + uwr->extensions.sticky_ignore = JK_FALSE; uwr->extensions.active = NULL; uwr->extensions.disabled = NULL; uwr->extensions.stopped = NULL; @@ -661,6 +663,15 @@ int uri_worker_map_add(jk_uri_worker_map if (!strncmp(param, JK_UWMAP_EXTENSION_REPLY_TIMEOUT, strlen(JK_UWMAP_EXTENSION_REPLY_TIMEOUT))) { uwr->extensions.reply_timeout = atoi(param + strlen(JK_UWMAP_EXTENSION_REPLY_TIMEOUT)); } + else if (!strncmp(param, JK_UWMAP_EXTENSION_STICKY_IGNORE, strlen(JK_UWMAP_EXTENSION_STICKY_IGNORE))) { + int val = atoi(param + strlen(JK_UWMAP_EXTENSION_STICKY_IGNORE)); + if (val) { + uwr->extensions.sticky_ignore = JK_TRUE; + } + else { + uwr->extensions.sticky_ignore = JK_FALSE; + } + } else if (!strncmp(param, JK_UWMAP_EXTENSION_USE_SRV_ERRORS, strlen(JK_UWMAP_EXTENSION_USE_SRV_ERRORS))) { uwr->extensions.use_server_error_pages = atoi(param + strlen(JK_UWMAP_EXTENSION_USE_SRV_ERRORS)); } Modified: tomcat/jk/trunk/native/common/jk_uri_worker_map.h URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_uri_worker_map.h?rev=1174289&r1=1174288&r2=1174289&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_uri_worker_map.h (original) +++ tomcat/jk/trunk/native/common/jk_uri_worker_map.h Thu Sep 22 18:01:31 2011 @@ -73,6 +73,8 @@ struct rule_extension { /* reply_timeout overwrite */ int reply_timeout; + /* Whether to ignore session routing info */ + int sticky_ignore; /* activation state overwrites for load balancers */ /* Number of elements in the array activations. */ int activation_size; Modified: tomcat/jk/trunk/native/common/jk_util.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_util.c?rev=1174289&r1=1174288&r2=1174289&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_util.c (original) +++ tomcat/jk/trunk/native/common/jk_util.c Thu Sep 22 18:01:31 2011 @@ -2075,6 +2075,7 @@ void jk_init_ws_service(jk_ws_service_t s->flush_packets = JK_FALSE; s->flush_header = JK_FALSE; s->extension.reply_timeout = -1; + s->extension.sticky_ignore = JK_FALSE; s->extension.use_server_error_pages = 0; s->extension.activation = NULL; s->extension.fail_on_status_size = 0; Modified: tomcat/jk/trunk/native/iis/jk_isapi_plugin.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/iis/jk_isapi_plugin.c?rev=1174289&r1=1174288&r2=1174289&view=diff ============================================================================== --- tomcat/jk/trunk/native/iis/jk_isapi_plugin.c (original) +++ tomcat/jk/trunk/native/iis/jk_isapi_plugin.c Thu Sep 22 18:01:31 2011 @@ -3084,6 +3084,7 @@ static int init_ws_service(isapi_private if (JK_IS_DEBUG_LEVEL(logger)) jk_log(logger, JK_LOG_DEBUG, "Applying service extensions" ); s->extension.reply_timeout = e->reply_timeout; + s->extension.sticky_ignore = e->sticky_ignore; s->extension.use_server_error_pages = e->use_server_error_pages; if (e->activation) { s->extension.activation = jk_pool_alloc(s->pool, e->activation_size * sizeof(int)); Modified: tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml?rev=1174289&r1=1174288&r2=1174289&view=diff ============================================================================== --- tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml (original) +++ tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml Thu Sep 22 18:01:31 2011 @@ -40,6 +40,22 @@ new documentation project for JK was started. </p> </section> +<section name="Changes between 1.2.32 and 1.2.33"> + <br /> + <subsection name="Native"> + <changelog> + <add> + URI Map: Add "sticky_ignore" extension attributes to uri worker map. + It allows to disable stickyness for individual mounts. (rjung) + </add> + <add> + HTTPD: Allow dynamic disabling of stickyness using the environment + variable JK_STICKY_IGNORE. This can be useful to break cookie stickyness + for non-sticky requests like login forms. (rjung) + </add> + </changelog> + </subsection> +</section> <section name="Changes between 1.2.31 and 1.2.32"> <br /> <subsection name="Native"> Modified: tomcat/jk/trunk/xdocs/reference/apache.xml URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/xdocs/reference/apache.xml?rev=1174289&r1=1174288&r2=1174289&view=diff ============================================================================== --- tomcat/jk/trunk/xdocs/reference/apache.xml (original) +++ tomcat/jk/trunk/xdocs/reference/apache.xml Thu Sep 22 18:01:31 2011 @@ -1120,6 +1120,24 @@ for more complex rules to change the <b> to request properties like e.g. the request URI. This is available since version 1.2.27. </p> +<p> +The environment variable +<b>JK_IGNORE_STICKY</b> can be set to disable session stickyness +for individual requests. If the variable is set to an empty string +or a nonzero number, session stickyness will be disabled. Setting +it to <b>0</b> will reset to the behaviour defined by the worker +configuration. +This is available since version 1.2.33. +</p> +<p> +This feature can be useful to optimize load balancing when using +cookie based session stickyness. In this case, as long as she keeps +her browser open, any request by a user who started a session will +be send to the same Tomcat instance, even if he left the part of +the application which uses the session. You can for instance +set this environment variable when a user requests a login form +to ensure, that this initial session request is balanced non-sticky. +</p> </subsection> </section> </body> Modified: tomcat/jk/trunk/xdocs/reference/uriworkermap.xml URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/xdocs/reference/uriworkermap.xml?rev=1174289&r1=1174288&r2=1174289&view=diff ============================================================================== --- tomcat/jk/trunk/xdocs/reference/uriworkermap.xml (original) +++ tomcat/jk/trunk/xdocs/reference/uriworkermap.xml Thu Sep 22 18:01:31 2011 @@ -246,6 +246,27 @@ For a general description of reply timeo <a href="../generic_howto/timeouts.html#Reply Timeout">timeouts</a> documentation. </p> </subsection> +<subsection name="Extension sticky_ignore"> +<br/> +<p> +The extension <code>sticky_ignore</code> can disable session stickyness for a single mapping rule. +<source> + # Disable session stickyness + # only for this mapping. + /myapp/loginform.jsp=myworker;sticky_ignore=1 +</source> +This extension can be useful to optimize load balancing when using +cookie based session stickyness. In this case, as long as she keeps +her browser open, any request by a user who started a session will +be send to the same Tomcat instance, even if he left the part of +the application which uses the session. You can for instance +set this environment variable when a user requests a login form +to ensure, that this initial session request is balanced non-sticky. +</p> +<p> +This extension is available since version 1.2.33. +</p> +</subsection> <subsection name="Extensions active/disabled/stopped"> <br/> <p> Modified: tomcat/jk/trunk/xdocs/reference/workers.xml URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/xdocs/reference/workers.xml?rev=1174289&r1=1174288&r2=1174289&view=diff ============================================================================== --- tomcat/jk/trunk/xdocs/reference/workers.xml (original) +++ tomcat/jk/trunk/xdocs/reference/workers.xml Thu Sep 22 18:01:31 2011 @@ -503,6 +503,11 @@ Tomcat worker. If sticky_session is set sticky_session is set to <b>False</b>. Set sticky_session to <b>False</b> when Tomcat is using a Session Manager which can persist session data across multiple instances of Tomcat. +<p> +The <b>sticky_session</b> setting can be overwritten using the Apache httpd +environment variable <b>JK_STICKY_IGNORE</b> and the worker map extension for +<b>sticky_ignore</b>. This has been added in version <b>1.2.33</b>. +</p> </directive> <directive name="sticky_session_force" default="False" required="false"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org