有个朋友写JSP程序时,在Servlet中取请求参数时出现了乱码,当然,这种乱码问题再简单不过了。由于在JSP中使用了GBK作用页面的编码,那么提交的中文信息自然也会被按着GBK进行编码,为%xx格式的GBK编码。
要解决这个问题可以说是方法多多。最简单的就是使用request.setCharacterEncoding方法设置编码格式,如下面的代码所示:
request.setCharacterEncoding("GBK");
在设置完编码格式之后,就可以直接通过request.getParameter方法来获得请求参数中的中文信息了。当然,为了方便,还可以在过滤器中加入上面的语句,这样所有的Servlet都可以直接使用request.getParameter方法来获得请求参数中的中文信息了。 除了这两种方法,还可以不使用request.setCharacterEncoding("GBK"),而使用下面的语言来转换编码:
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
但为了更快解决这个问题,我就直接告诉这位朋友使用了setCharacterEncoding方法来设置编码。但是说来奇怪,还是出现乱码,没有任何解决问题的迹象。 最郁闷的事就是使用了自己认为100%能解决问题的方法,而这种方法却一点都没起作用。
最后又让朋友试了最后一种方法,说来奇怪,竟然好使了。当然,这也没什么可奇怪的,本来就应该好使,但奇就奇在setCharacterEncoding方法并没有去掉,也就是说,同时使用了下面两条语句,竟然得到了正常的中文请求参数值:
按着常理来说,这是不可能的,既然使用了setCharacterEncoding方法设置成了GBK,再使用new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK")来转换,得到的应该是?????,不可能是正常的中文,只有将setCharacterEncoding方法去了,以ISO-8859-1格式保存的字符串才可以用ISO-8859-1格式还原,再用GBK重新保存成Java字符串(这一步实际上就是GBK转Unicode)。
但经过仔细思考后,决定看下JSP代码是如何写的。不看不知道,一看吓一跳,原来<form>在提交时使用的是GET,而未用POST,这当然没什么了不起的,用什么都可以,但对编码就有问题了。自从Tomcat5.x开始,GET和POST方法提交的信息,tomcat采用了不同的方式来处理编码,对于POST请求,Tomcat会仍然使用request.setCharacterEncoding方法所设置的编码来处理,如果未设置,则使用默认的iso-8859-1编码。而GET请求则不同,Tomcat对于GET请求并不会考虑使用request.setCharacterEncoding方法设置的编码,而会永远使用iso-8859-1编码,而这位朋友使用的正好是GET请求,因此,tomcat将会使用iso-8859-1将提交的字节转换成字符串。
解决的方法有三个:
1. 将GET请求改成POST请求,然后就可以使用request.setCharacterEncoding方法设置编码,并使用request.getParameter方法直接获得中文请求参数了。
2. 不用改GET请求,在Servlet中使用如下的代码来得到中文请求参数。
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
3.为了保证get数据采用UTF8编码,在server.xml中进行了如下设置
<Connector port="8080" maxThreads="150" minSpareThreads="25"
maxSpareThreads="75" enableLookups="false" redirectPort="8443"
acceptCount="100" debug="99" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="UTF-8"/>
这里指定了get时候的数据编码。但是,当使用IIS作为webserver转发servlet/jsp请求给Tomcat时候,这个设置却失效了。其实原因很简单:IIS是通过AJP协议,把请求转发到Tomcat监听的8009端口上的,所以这里针对8080的设置自然就无效了。正确的方法是进行下面的设置:
<Connector port="8009" enableLookups="false" redirectPort="8443"
debug="0" protocol="AJP/1.3" URIEncoding="UTF-8"/>
综上所述:通常在处理中文乱码问题时我们要编写自己的过滤器,不管是get请求还是post请求一律都经过此过滤器,此过滤器的作用是设置request.setCharacterEncoding()同时设置server.xml的URIEncoding属性。
http://coolyongzi.iteye.com/blog/269548
分享到:
相关推荐
本示例代码着重展示了如何使用ASHX来处理GET和POST请求,这在构建RESTful API或实现异步数据通信时非常常见。 首先,让我们了解GET和POST请求的基本概念。GET请求通常用于获取资源,是幂等的,意味着多次发送相同的...
整合IIS和Tomcat,主要是为了让IIS作为前端服务器处理静态资源请求,而将动态Java应用的请求转发给Tomcat处理。这通常通过AJP(Apache JServ Protocol)协议来实现,AJP提供了一种高效的方式让Web服务器与应用服务器...
- IIS在处理静态资源(如HTML、CSS、JavaScript等)时表现出色,且与Windows操作系统紧密集成,提供良好的管理工具。 - Tomcat是纯Java应用服务器,对Servlet和JSP支持优秀,适合运行Java Web应用。 - 整合两者,...
ISAPI Redirector的工作原理是:当IIS接收到一个请求时,它会检查该请求是否需要由Tomcat处理。如果需要,ISAPI Redirector会将请求转发到配置好的Tomcat实例。这个过程通过配置文件(如worker.properties和isapi_...
这种整合通常用于在同一个服务器上运行静态内容(由IIS处理)和动态内容(由Tomcat处理,如Java应用)。 首先,我们来了解下这两个组件。Apache Tomcat是一款开源的Java应用服务器,主要用于部署和运行Java Web应用...
在IT行业中,IIS(Internet Information Services)、Tomcat和Apache都是常见的Web服务器,它们各自有着不同的特性和用途。本文将详细探讨如何实现这三种服务器的整合,以及它们共用同一个端口的可能性。 首先,让...
标题中的"IIS与Tomcat捆起来"指的是在Windows操作系统中,将Internet Information Services (IIS) 和Apache Tomcat集成在一起的场景。IIS是微软公司提供的一个强大的Web服务器,而Tomcat则是Apache软件基金会开发的...
通过整合IIS和Tomcat,可以将静态文件的请求直接由IIS处理,动态内容的请求则转发给Tomcat,提高整体系统性能和响应速度。 **整合步骤:** 1. **安装和配置IIS:** 首先确保系统上已经安装了IIS,并且设置好必要...
为了更好地结合两者的优点,我们可以通过配置IIS作为前端代理服务器,将特定的请求转发到后端的Tomcat服务器上进行处理,然后再由IIS将处理结果返回给客户端。这种方式可以有效提升Web应用的安全性、可维护性和扩展...
1. 安装ISAPI Filter和ISAPI Extension:如使用JkMount或mod_jk,它们是Apache的Apache Tomcat连接器,负责在IIS和Tomcat之间传递请求。 2. 配置ISAPI Filter和Extension:设置相应的注册表项,以及在IIS中添加过滤...
在进行IIS和Tomcat的整合时,还需要注意以下几点: 1. **性能监控**:整合后,应定期检查两个服务器的性能指标,确保它们的负载均衡,避免某一个服务器过载。 2. **安全设置**:配置时需确保所有通信都是安全的,...
手工配置 IIS Tomcat 整合。 压缩文件中有操作过程 readme, jk2连接器, worker.properties, 需要导入的注册表文件模板。 iis tomcat 傻瓜配置工具可参见:、 http://download.csdn.net/source/928779
本文将深入探讨如何在IIS6和Tomcat6整合环境中解决伪静态页面处理的问题。IIS(Internet Information Services)是微软提供的一个强大的Web服务器,而Tomcat则是Apache软件基金会开发的开源Java Servlet容器,两者...
在本文中,我们将探讨如何成功地整合IIS7.0和Tomcat6.0,以实现Windows Server 2008环境下JSP应用的部署。整合这两种服务的主要目的是利用IIS作为前端Web服务器,处理静态内容,而将动态内容如JSP交给Tomcat处理。 ...
在Windows环境中,IIS常被用作前端服务器,负责静态内容的处理,而Tomcat作为后端应用服务器,处理动态Java应用。 **IIS集成Tomcat的原因**: 1. **性能优化**:IIS处理静态内容(如HTML、CSS、JavaScript文件)...
本文将详细介绍如何将微软的Internet Information Services(IIS)与Apache Tomcat服务器集成,使得IIS能够处理静态内容,而Tomcat负责处理动态内容,如Java Servlets和JSP。 首先,集成工作前的准备至关重要。确保...
在本案例中,`isapi_redirector2.dll`是一个ISAPI扩展,它作为桥梁,使得IIS能够将对`.jsp`、`.servlet`和`.do`等文件的请求转发给Tomcat处理。 接着,配置文件`jk2.properties`和`workers2.properties`起着关键...
通过这样的集成,不仅可以充分利用IIS在处理静态资源和部分动态内容上的优势,还能利用Tomcat在处理Java应用上的高效性,从而为用户提供更稳定、更快速的服务体验。对于那些既需要支持Java应用又想利用IIS优势的Web...
本文档详细介绍如何在Windows 7和Windows XP操作系统下实现IIS(Internet Information Services)与Tomcat的整合。通过整合,可以利用IIS作为前端服务器,而将动态内容如JSP、Servlet等请求转发至后端的Tomcat服务器...
7. **故障排查**:当整合遇到问题时,日志文件(如IIS的日志和Tomcat的`catalina.out`日志)是排查错误的重要工具。此外,了解如何通过工具如`httpcfg.exe`和`netstat`来检查ISAPI扩展的状态和网络连接状态也很重要...