`

Apache2.2和Tomcat5.0的整合(二)—解决REDIRECT_URL的中文路径问题

    博客分类:
  • CMS
阅读更多
  • 现象

通过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# 代码
 
  1. static unsigned char hexchars[] = "0123456789ABCDEF";  
  2.   
  3. char *urlencode(char *s)  
  4. {  
  5.     register int x, y;  
  6.     unsigned char *str;  
  7.     int len=strlen(s);  
  8.   
  9.     str = (unsigned char *) malloc(3 * strlen(s) + 1);  
  10.     for (x = 0, y = 0; len--; x++, y++) {  
  11.         str[y] = (unsigned char) s[x];  
  12.         if (str[y] == ' ') {  
  13.             str[y] = '+';  
  14. #ifndef CHARSET_EBCDIC  
  15.         } else if ((str[y] < '0' && str[y] != '-' && str[y] != '.') ||  
  16.                    (str[y] < 'A' && str[y] > '9') ||  
  17.                    (str[y] > 'Z' && str[y] < 'a' && str[y] != '_') ||  
  18.                    (str[y] > 'z')) {  
  19.             str[y++] = '%';  
  20.             str[y++] = hexchars[(unsigned char) s[x] >> 4];  
  21.             str[y] = hexchars[(unsigned char) s[x] & 15];  
  22.         }  
  23. #else /*CHARSET_EBCDIC*/  
  24.         } else if (!isalnum(str[y]) && strchr("_-.", str[y]) == NULL) {  
  25.             /* Allow only alphanumeric chars and '_', '-', '.'; escape the rest */  
  26.             str[y++] = '%';  
  27.             str[y++] = hexchars[os_toascii[(unsigned char) s[x]] >> 4];  
  28.             str[y] = hexchars[os_toascii[(unsigned char) s[x]] & 0x0F];  
  29.         }  
  30. #endif /*CHARSET_EBCDIC*/  
  31.     }  
  32.   
  33.   
  34.     str[y] = '\0';  
  35.     return ((char *) str);  
  36. }  
将ajp_marshal_into_msgb函数体发送属性部分进行修改,修改后的代码为:
cpp 代码
 
  1.  if (s->num_attributes > 0) {  
  2.      for (i = 0; i < s->num_attributes; i++) {  
  3. //c4w  
  4. char * pval=s->attributes_values[i];  
  5. char * url=NULL;  
  6. if(strcmp(s->attributes_names[i],"REDIRECT_URL")==0){  
  7.     url=urlencode(s->attributes_values[i]);  
  8.     //pval=url;  
  9. }  
  10.          if (jk_b_append_byte(msg, SC_A_REQ_ATTRIBUTE) ||  
  11.              jk_b_append_string(msg, s->attributes_names[i]) ||  
  12.              jk_b_append_string(msg, pval)) {  
  13.              jk_log(l, JK_LOG_ERROR,  
  14.                     "failed appending attribute %s=%s",  
  15.                     s->attributes_names[i], pval);  
  16.              JK_TRACE_EXIT(l);  
  17.              return JK_FALSE;  
  18.          }  
  19. if(url!=NULL) free(url);  
  20.      }  
  21.  }  

最后,在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整合

    在Apache2.2与Tomcat6.x的整合中,mod_jk模块扮演了关键角色,它是Apache的Jakarta项目的一部分,专门用于连接Apache和Tomcat。 1. **mod_jk模块介绍** mod_jk是Apache与Tomcat间通信的桥梁,它实现了Apache的URL...

    Apache2.2+Tomcat5.5整合配置教程

    Apache2.2与Tomcat5.5的整合配置是一个常见的任务,特别是在那些希望利用Apache作为前端服务器处理静态内容,而将动态请求转发给Tomcat处理的环境中。这种配置可以提高服务器性能并优化资源分配。 首先,我们需要...

    apache2.2和tomcat6整合

    ### 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

    "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 整合 本文旨在深入探讨如何将Apache 2.2、Tomcat 6.0、MySQL 5.0以及mod_jk进行有效的整合,以构建一个高性能、可扩展的应用服务器环境。这种整合方式不仅能够...

    apache2.2整合tomcat7.0

    ### Apache2.2与Tomcat7.0的整合配置详解 #### 一、背景介绍 在Web开发领域,Apache HTTP Server(简称Apache)与Tomcat是两种非常重要的服务器软件。Apache作为一款开源的Web服务器软件,以其高效稳定而著称;而...

    Apache2.2+Tomcat6 配置

    在IT行业中,集成Apache2.2与Tomcat6是一个常见的任务,这主要涉及到Web服务器与应用服务器的联合部署,以实现动态和静态内容的高效分发。Apache2.2是一个强大的HTTP服务器,常用于处理静态内容,而Tomcat6则是一个...

    Apache2.2 tomcat-6.0.18负载均衡与集群

    在IT行业中,构建高效、可扩展的Web服务是至关重要的,而Apache2.2和Tomcat的组合在处理高并发请求时常常被用作负载均衡和集群解决方案。本主题主要探讨的是如何在Apache2.2和Tomcat-6.0.18环境下实现负载均衡与集群...

    apache2.2 with mod_wsgi for amd64_X64

    使用Apache2.2+mod_wsgi搭建django站点,将apache和mod_wsgi打包提供下载,默认情况下,apache和站点平行放在D盘根目录,如果不会设置,可以看我的博文:http://blog.csdn.net/samed/article/details/50453353,有...

    Apache和Tomcat集群配置步骤(Apache2.2,Tomcat6.0).

    ### Apache和Tomcat集群配置详解 #### 一、软件准备 在进行Apache和Tomcat集群配置之前,首先需要准备所需的软件资源。 - **Apache 2.2**: - Windows平台: 从官方网站 [http://httpd.apache.org/download.cgi]...

    apache2.2 + tomcat6 配置方式

    - 错误日志:监控Apache和Tomcat的日志文件,以解决配置过程中可能出现的问题。 - 安全性:使用SSL加密连接,以保护数据传输安全,避免中间人攻击。 6. **性能优化**: - 负载均衡:如果负载较大,可以配置多个...

    Apache2.2与tomcat7 集群配置

    配置Apache2.2与Tomcat7集群的过程包括安装和配置mod_jk,修改Apache和Tomcat的配置文件,以及测试集群功能。通过这种方式,我们可以构建一个可伸缩、可靠的Web服务架构,以应对高流量和复杂业务场景。 总结来说,...

    Apache2.2和Tomcat7集成负载均衡(软件和教程)

    【Apache2.2和Tomcat7集成负载均衡】 在现代Web应用环境中,为了提供高可用性和性能优化,经常需要将HTTP服务器(如Apache)与应用服务器(如Tomcat)进行集成,并实现负载均衡。Apache2.2和Tomcat7的集成能够充分...

    apache2.2+tomcat7

    apache2.2+tomcat7

    XP下apache2.0+tomcat5.0+php5.2

    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 with mod_wsgi for win32_X86

    使用Apache2.2+mod_wsgi搭建django站点,将apache和mod_wsgi打包提供下载,默认情况下,apache和站点平行放在D盘根目录,如果不会设置,可以看我的博文:http://blog.csdn.net/samed/article/details/50453353,有...

Global site tag (gtag.js) - Google Analytics