通过mod_jk整合Apache和Tomcat,在Servlet中可以通过request.getAttribute("REDIRECT_URL")获得Apache自定义错误处理的原始URL。
不幸的是,如果这个REDIRECT_URL包含中文路径,我们获得的将是乱码。
例如:请求不存在的页面http://localhost/rp/数字故宫/hh.html,
返回结果为:/rp/æ°åæ
宫/hh.html
问题出在哪里呢?
作以下测试:
在Apache的httpd.conf加入如下两行
JkEnvVar DPM1 %e6%95%b0%e5%ad%97%e6%95%85%e5%ae%ab
JkEnvVar DPM2 数字故宫
结果第一行返回: %e6%95%b0%e5%ad%97%e6%95%85%e5%ae%ab
第二行返回: æ°åæ
宫
即jk本身不能正确将环境变量的中文值送到request.getAttribute
下载mod_jk源代码http://tomcat.apache.org/download-connectors.cgi
通过代码分析、日志跟踪,确定Apache送到jk的REDIRECT_URL值为utf-8编码
此变量值经过jk_b_append_string函数写入到缓冲后,通过socket8009发送给tomcat之后,
再经过tomcat接收分析之后,出现乱码。
解决办法,既然jk处理西文没有问题,何不将中文URL进行URLEnocode
从网上收到urlencode的C实现:
c# 代码
- static unsigned char hexchars[] = "0123456789ABCDEF";
-
- char *urlencode(char *s)
- {
- register int x, y;
- unsigned char *str;
- int len=strlen(s);
-
- str = (unsigned char *) malloc(3 * strlen(s) + 1);
- for (x = 0, y = 0; len--; x++, y++) {
- str[y] = (unsigned char) s[x];
- if (str[y] == ' ') {
- str[y] = '+';
- #ifndef CHARSET_EBCDIC
- } else if ((str[y] < '0' && str[y] != '-' && str[y] != '.') ||
- (str[y] < 'A' && str[y] > '9') ||
- (str[y] > 'Z' && str[y] < 'a' && str[y] != '_') ||
- (str[y] > 'z')) {
- str[y++] = '%';
- str[y++] = hexchars[(unsigned char) s[x] >> 4];
- str[y] = hexchars[(unsigned char) s[x] & 15];
- }
- #else /*CHARSET_EBCDIC*/
- } else if (!isalnum(str[y]) && strchr("_-.", str[y]) == NULL) {
-
- str[y++] = '%';
- str[y++] = hexchars[os_toascii[(unsigned char) s[x]] >> 4];
- str[y] = hexchars[os_toascii[(unsigned char) s[x]] & 0x0F];
- }
- #endif /*CHARSET_EBCDIC*/
- }
-
-
- str[y] = '\0';
- return ((char *) str);
- }
将ajp_marshal_into_msgb函数体发送属性部分进行修改,修改后的代码为:
cpp 代码
- if (s->num_attributes > 0) {
- for (i = 0; i < s->num_attributes; i++) {
-
- char * pval=s->attributes_values[i];
- char * url=NULL;
- if(strcmp(s->attributes_names[i],"REDIRECT_URL")==0){
- url=urlencode(s->attributes_values[i]);
-
- }
- if (jk_b_append_byte(msg, SC_A_REQ_ATTRIBUTE) ||
- jk_b_append_string(msg, s->attributes_names[i]) ||
- jk_b_append_string(msg, pval)) {
- jk_log(l, JK_LOG_ERROR,
- "failed appending attribute %s=%s",
- s->attributes_names[i], pval);
- JK_TRACE_EXIT(l);
- return JK_FALSE;
- }
- if(url!=NULL) free(url);
- }
- }
最后,在jsp中对REDIRECT_URL进行解码
String url=URLDecoder.decode((String)request.getAttribute("REDIRECT_URL"),"utf-8");
编译,启动tomcat,重新请求不存在的页面http://localhost/rp/数字故宫/hh.html,返回结果为:/rp/æ°åæ
宫/hh.html
看到了了正确的结果:/rp/数字故宫/hh.html
分享到:
相关推荐
在Apache2.2与Tomcat6.x的整合中,mod_jk模块扮演了关键角色,它是Apache的Jakarta项目的一部分,专门用于连接Apache和Tomcat。 1. **mod_jk模块介绍** mod_jk是Apache与Tomcat间通信的桥梁,它实现了Apache的URL...
Apache2.2与Tomcat5.5的整合配置是一个常见的任务,特别是在那些希望利用Apache作为前端服务器处理静态内容,而将动态请求转发给Tomcat处理的环境中。这种配置可以提高服务器性能并优化资源分配。 首先,我们需要...
### Apache 2.2 和 Tomcat 6 整合知识点详解 #### 一、整合背景与意义 在 Web 应用开发与部署过程中,Apache 作为一款非常成熟且功能强大的 Web 服务器软件,在处理静态资源方面表现优异;而 Tomcat 作为 Java ...
"WLSPlugin12.2.1.4.0-Apache2.2-Apache2.4-Linux_x86_64-12.2.1.4.0.zip" 是一个包含WebLogic Plugin的压缩包,适用于Apache 2.2和2.4版本,且专为Linux x86_64架构设计。 **WebLogic Plugin**: WebLogic Plugin...
### Apache 2.2 + Tomcat 6.0 + MySQL 5.0 + mod_jk 整合 本文旨在深入探讨如何将Apache 2.2、Tomcat 6.0、MySQL 5.0以及mod_jk进行有效的整合,以构建一个高性能、可扩展的应用服务器环境。这种整合方式不仅能够...
### Apache2.2与Tomcat7.0的整合配置详解 #### 一、背景介绍 在Web开发领域,Apache HTTP Server(简称Apache)与Tomcat是两种非常重要的服务器软件。Apache作为一款开源的Web服务器软件,以其高效稳定而著称;而...
在IT行业中,集成Apache2.2与Tomcat6是一个常见的任务,这主要涉及到Web服务器与应用服务器的联合部署,以实现动态和静态内容的高效分发。Apache2.2是一个强大的HTTP服务器,常用于处理静态内容,而Tomcat6则是一个...
在IT行业中,构建高效、可扩展的Web服务是至关重要的,而Apache2.2和Tomcat的组合在处理高并发请求时常常被用作负载均衡和集群解决方案。本主题主要探讨的是如何在Apache2.2和Tomcat-6.0.18环境下实现负载均衡与集群...
使用Apache2.2+mod_wsgi搭建django站点,将apache和mod_wsgi打包提供下载,默认情况下,apache和站点平行放在D盘根目录,如果不会设置,可以看我的博文:http://blog.csdn.net/samed/article/details/50453353,有...
### Apache和Tomcat集群配置详解 #### 一、软件准备 在进行Apache和Tomcat集群配置之前,首先需要准备所需的软件资源。 - **Apache 2.2**: - Windows平台: 从官方网站 [http://httpd.apache.org/download.cgi]...
- 错误日志:监控Apache和Tomcat的日志文件,以解决配置过程中可能出现的问题。 - 安全性:使用SSL加密连接,以保护数据传输安全,避免中间人攻击。 6. **性能优化**: - 负载均衡:如果负载较大,可以配置多个...
配置Apache2.2与Tomcat7集群的过程包括安装和配置mod_jk,修改Apache和Tomcat的配置文件,以及测试集群功能。通过这种方式,我们可以构建一个可伸缩、可靠的Web服务架构,以应对高流量和复杂业务场景。 总结来说,...
【Apache2.2和Tomcat7集成负载均衡】 在现代Web应用环境中,为了提供高可用性和性能优化,经常需要将HTTP服务器(如Apache)与应用服务器(如Tomcat)进行集成,并实现负载均衡。Apache2.2和Tomcat7的集成能够充分...
apache2.2+tomcat7
tomcat5.0 Apache2 mysql-connector-java-5.0.3-bin.jar XP下apache2.0+tomcat5.0+php5.2整合文档.txt XP下apache2.0+tomcat5.0+php5.2整合文档.doc test.php mysql-gui-tools-5.0-r12-win32.msi my.ini db.php 等
使用Apache2.2+mod_wsgi搭建django站点,将apache和mod_wsgi打包提供下载,默认情况下,apache和站点平行放在D盘根目录,如果不会设置,可以看我的博文:http://blog.csdn.net/samed/article/details/50453353,有...