All,
Here is my solution to the jsessionid issue discussed in this thread.

The problem is that when Tomcat encodes URLs without knowing if the browser supports cookies, it adds ";jsessionid=BLAHBLAH" to each encoded URL. This is perfectly normal behavior.

However, when using Apache httpd, Apache does not properly handle the addition of the ";jsessionid" information, and fails to serve up the proper file.

One of the simplest solutions is to simply pass requests including the jsessionid information to Tomcat and let Tomcat handle them.

mod_jk does not support this type of behavior, since it only does simple context matches (like /context/*", suffix-based context matches (/context/*.suffix) or exact matches (/context/j_security_check).

I have modified mod_jk to allow URIs of this special form:

/context/*;jsessionid*

So you can actually do this in your configuration file:

JkMount /context/*;jsessionid* my_worker

The syntax matches what I figured was the most natural way to write this in a configuration file. Note that this fix does not actually let you use wildcards as flexibly as the config directive would lead you to believe. It only works with the specific string "*;jsessionid*" after the context and slash character.

Below is the diff for jk_uri_worker_map.c. It works on my configuration. I hope it may help others. I would love to receive any constructive criticism of this patch. Feel free to email me directly.

All the best,
-chris

=================================================================
[EMAIL PROTECTED] common]$ diff -bc jk_uri_worker_map.c jk_uri_worker_map.c.new
*** jk_uri_worker_map.c 2003-09-06 11:37:21.000000000 -0400
--- jk_uri_worker_map.c.new 2004-04-08 10:07:36.000000000 -0400
***************
*** 80,85 ****
--- 80,86 ----
#define MATCH_TYPE_GENERAL_SUFFIX (3) /* match all URIs of the form *ext */
/* match all context path URIs with a path component suffix */
#define MATCH_TYPE_CONTEXT_PATH (4)
+ #define MATCH_TYPE_JSESSIONID (5) /* match all URLs that contains a jsessionid */

struct uri_worker_record {
/* Original uri for logging */
***************
*** 300,305 ****
--- 301,316 ----
"Into jk_uri_worker_map_t::uri_worker_map_open, "
"suffix rule %s.%s=%s was added\n",
uri, asterisk + 3, worker);
+ } else if(0 == strncmp("/*" JK_PATH_SESSION_IDENTIFIER "*",asterisk,14) ) {
+ /* jsessionid interceptor */
+ asterisk[1] = '\0';
+ uwr->worker_name = worker;
+ uwr->context = uri;
+ uwr->match_type = MATCH_TYPE_JSESSIONID;
+ jk_log(l, JK_LOG_DEBUG,
+ "Into jk_uri_worker_map_t::uri_worker_map_open, "
+ "jsessionid rule %s*;jsessionid*=%s was added\n",
+ uri, worker);
} else if ('\0' != asterisk[2]) {
/* general suffix rule */
asterisk[1] = '\0';
***************
*** 478,483 ****
--- 489,522 ----
*d = '\0';
}

+ uri_worker_record_t *check_jsessionid_matches(char *uri,
+ jk_uri_worker_map_t *uw_map,
+ jk_logger_t *l)
+ {
+ unsigned i;
+ uri_worker_record_t *match = NULL;
+
+ for(i = 0 ; i < uw_map->size ; i++) {
+ uri_worker_record_t *uwr = uw_map->maps[i];
+
+ if(MATCH_TYPE_JSESSIONID == uwr->match_type) {
+ /* Check context match */
+
+ if(0 == strncmp(uwr->context,
+ uri,
+ uwr->ctxt_len)) {
+ /* Looks like a match: URI contains ";jsessionid", context matches */
+
+ jk_log(l, JK_LOG_DEBUG, "check_jsessionid_matches: Found context match: %s\n", uwr->context);
+
+ match = uwr;
+ break;
+ }
+ } /* MATCH_TYPE_JSESSIONID */
+ } /* foreach mapping */
+
+ return match;
+ }

  char *map_uri_to_worker(jk_uri_worker_map_t *uw_map,
                          char *uri,
***************
*** 493,498 ****
--- 532,544 ----
          char *url_rewrite = strstr(uri, JK_PATH_SESSION_IDENTIFIER);

if(url_rewrite) {
+ uri_worker_record_t *match = check_jsessionid_matches(uri, uw_map, l);
+ if(NULL != match) {
+ jk_log(l, JK_LOG_DEBUG, "Mapped URI %s to context %s using jsessionid match\n", uri, match->context);
+
+ return match->worker_name;
+ }
+
*url_rewrite = '\0';
}
jk_no2slash(uri);

Attachment: signature.asc
Description: OpenPGP digital signature



Reply via email to