`

Tomcat传值乱码

阅读更多
useBodyEncodingForURI="true

首先,说说JSP/Servlet中的几个编码的作用。


在JSP/Servlet中主要有以下几个地方可以设置编码,pageEncoding="UTF-8"、contentType="text /html;charset=UTF-8"、request.setCharacterEncoding("UTF-8")和 response.setCharacterEncoding("UTF-8"),其中前两个只能用于JSP中,而后两个可以用于JSP和Servlet 中。

1、pageEncoding="UTF-8"的作用是设置JSP编译成Servlet时使用的编码。
  众所周知,JSP在服务器上是要先被编译成Servlet的。pageEncoding="UTF-8"的作用就是告诉JSP编译器在将JSP文件编 译成Servlet时使用的编码。通常,在JSP内部定义的字符串(直接在JSP中定义,而不是从浏览器提交的数据)出现乱码时,很多都是由于该参数设置 错误引起的。例如,你的JSP文件是以GBK为编码保存的,而在JSP中却指定pageEncoding="UTF-8",就会引起JSP内部定义的字符 串为乱码。
  另外,该参数还有一个功能,就是在JSP中不指定contentType参数,也不使用response.setCharacterEncoding方法时,指定对服务器响应进行重新编码的编码。


2、contentType="text/html;charset=UTF-8"的作用是指定对服务器响应进行重新编码的编码。
  在不使用response.setCharacterEncoding方法时,用该参数指定对服务器响应进行重新编码的编码。服务器在将数据发送到浏览器前,对数据进行重新编码时,使用的就是该编码。
3、request.setCharacterEncoding("UTF-8")的作用是设置对客户端请求进行重新编码的编码。
  该方法用来指定对浏览器发送来的数据进行重新编码(或者称为解码)时,使用的编码。
4、 response.setCharacterEncoding("UTF-8")的作用是指定对服务器响应进行重新编码的编码。
    服务器在将数据发送到浏览器前,对数据进行重新编码时,使用的就是该编码。

      其次,要说一说浏览器是怎么样对接收和发送的数据进行编码的
    response.setCharacterEncoding("UTF-8")的作用是指定对服务器响应进行重新编码的编码。同时,浏览器也是根据这个 参数来对其接收到的数据进行重新编码(或者称为解码)。所以在无论你在JSP中设置 response.setCharacterEncoding("UTF-8")或者 response.setCharacterEncoding("GBK"),浏览器均能正确显示中文(前提是你发送到浏览器的数据编码是正确的,比如正 确设置了pageEncoding参数等)。读者可以做个实验,在JSP中设置response.setCharacterEncoding("UTF- 8"),在IE中显示该页面时,在IE的菜单中选择"查看(V)"à"编码
(D)"中可以查看到是" Unicode(UTF-8)",而在在JSP中设置response.setCharacterEncoding("GBK"),在IE中显示该页面时,在IE的菜单中选择"查看(V)"à"编码(D)"中可以查看到是"简体中文(GB2312)"。
  浏览器在发送数据时,对URL和参数会进行URL编码,对参数中的中文,浏览器也是使用response.setCharacterEncoding 参数来进行URL编码的。以百度和GOOGLE为例,如果你在百度中搜索"汉字",百度会将其编码为"����"。而在GOOGLE中搜索 "汉字",GOOGLE会将其编码为"汉字",这是因为百度的response.setCharacterEncoding参数为GBK,而GOOGLE 的response.setCharacterEncoding参数为UTF-8。

  浏览器在接收服务器数据和发送数据到服务器时所使用的编码是相同的,默认情况下均为JSP页面的
response.setCharacterEncoding参数(或者contentType和
pageEncoding参数),我们称其为浏览器编码。当然,在IE中可以修改浏览器编码(在IE的菜单中选择"查看(V)"à"编码(D)"中修 改),但通常情况下,修改该参数会使原本正确的页面中出现乱码。一个有趣的例子是,在IE中浏览GOOGLE的主页时,将浏览器编码修改为"简体中文 (GB2312)",此时,页面上的中文会变成乱码,不理它,在文本框中输入"汉字",提交,GOOGLE会将其编码为"����",可见,浏览器在对中 文进行URL编码时,使用的就是浏览器编码。
  弄清了浏览器是在接收和发送数据时,是如何对数据进行编码的了,我们再来看看服务器是在接收和发送数据时,是如何对数据进行编码的。
  对于发送数据,服务器按照response.setCharacterEncoding—contentType—pageEncoding的优先顺序,对要发送的数据进行编码。
  对于接收数据,要分三种情况。一种是浏览器直接用URL提交的数据,另外两种是用表单的GET和POST方式提交的数据。
  因为各种WEB服务器对这三种方式的处理也不相同,所以我们以Tomcat5.0为例。
  无论使用那种方式提交,如果参数中包含中文,浏览器都会使用当前浏览器编码对其进行URL编码。
  对于表单中POST方式提交的数据,只要在接收数据的JSP中正确request.setCharacterEncoding参数,即将对客户端请求 进行重新编码的编码设置成浏览器编码,就可以保证得到的参数编码正确。有写读者可能会问,那如何得到浏览器编码呢?上面我们提过了,在默认请情况下,浏览 器编码就是你在响应该请求的JSP页面response.setCharacterEncoding设置的值。所以对于POST表单提交的数据,在获得数 据的JSP页面中request.setCharacterEncoding要和生成提交该表单的JSP页面的 response.setCharacterEncoding设置成相同的值。

对于URL提交的数据和表单中GET方式提交的数据,在接收数据的JSP中设置request.setCharacterEncoding参数是不行的, 因为在Tomcat5.0中,默认情况下使用ISO-8859-1对URL提交的数据和表单中GET方式提交的数据进行重新编码(解码),而不使用该参数 对URL提交的数据和表单中GET方式提交的数据进行
重新编码(解码)。要解决该问题,应该在Tomcat的配置文件的Connector标签中设置useBodyEncodingForURI或者
URIEncoding属性,其中useBodyEncodingForURI参数表示是否用request.setCharacterEncoding
参数对URL提交的数据和表单中GET方式提交的数据进行重新编码,在默认情况下,该参数为false(Tomcat4.0中该参数默认为 true);URIEncoding参数指定对所有GET方式请求(包括URL提交的数据和表单中GET方式提交的数据)进行统一的重新编码(解码)的编 码。URIEncoding和useBodyEncodingForURI区别是,URIEncoding是对所有GET方式的请求的数据进行统一的重新 编码(解码),而useBodyEncodingForURI则是根据响应该请求的页面的request.setCharacterEncoding参数 对数据进行的重新编码(解码),不同的页面可以有不同的重新编码(解码)的编码。所以对于URL提交的数据和表单中GET方式提交的数据,可以修改 URIEncoding参数为浏览器编码或者修改useBodyEncodingForURI为true,并且在获得数据的JSP页面中 request.setCharacterEncoding参数设置成浏览器编码。

  下面总结下,以Tomcat5.0为WEB服务器时,如何防止中文乱码。

1、 对于同一个应用,最好统一编码,推荐为UTF-8,当然GBK也可以。
2、 正确设置JSP的pageEncoding参数
3、 在所有的JSP/Servlet中设置contentType="text/html;charset=UTF-8"或response.setCharacterEncoding("UTF-8"),从而间接实现对浏览器编码的设置。
4、 对于请求,可以使用过滤器或者在每个JSP/Servlet中设置request.setCharacterEncoding("UTF-8")。同
时,要修改Tomcat的默认配置,推荐将useBodyEncodingForURI参数设置为true,也可以将URIEncoding参数设置为
UTF-8(有可能影响其他应用,所以不推荐)。

总结:

1、做一个编码过滤器,类似于:

Java代码
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)    
throws IOException,ServletException {   
        String strRequestURI = ((HttpServletRequest) request).getRequestURI();   
        String encoding = selectEncoding(request);   
        request.setCharacterEncoding(“UTF-8”);   
        chain.doFilter(request, response);   
    }  
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException,ServletException {
        String strRequestURI = ((HttpServletRequest) request).getRequestURI();
        String encoding = selectEncoding(request);
        request.setCharacterEncoding(“UTF-8”);
        chain.doFilter(request, response);
    }
2、在JSP页面中加上:
<%@ page contentType="text/html;charset=UTF-8" %>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
3、修改Tomcat5.0的D:\jakarta-tomcat-5.0.30\conf\server.xml
找到connector部分
加上useBodyEncodingForURI="true" URIEncoding="UTF-8"
比如:

Xml代码
<Connector    
           port="8080"  
           maxThreads="150" minSpareThreads="25" maxSpareThreads="75"  
           enableLookups="false" redirectPort="8443" acceptCount="100"  
           debug="0" connectionTimeout="20000"    
           disableUploadTimeout="true" useBodyEncodingForURI="true" URIEncoding="UTF-8" /> 
分享到:
评论

相关推荐

    jsp传值本地无乱码测试机出现乱码问题解决

    在讨论JSP(Java Server Pages)传值时,遇到的本地无乱码而测试机出现乱码的问题是一个典型的编码问题,常见于网络编程和Web开发中。以下是对标题、描述和部分内容所涉知识点的详细解析。 ### 知识点解析 #### ...

    java传值中的乱码

    ### Java传值中的乱码问题及最简易的解决方法 在Java Web开发中,经常会遇到一个令人头疼的问题:客户端向服务器传递数据时出现乱码。这种情况不仅会影响用户体验,还可能导致程序逻辑错误。本文将深入探讨Java传值...

    struts2配置文件传值中文乱码

    本文将围绕“Struts2配置文件传值中文乱码”这一主题,深入探讨其成因、解决方案以及相关的配置细节,旨在帮助开发者有效解决中文乱码问题,提升用户体验。 ### Struts2框架简介 Struts2是Apache组织下的一个开源...

    jquery的ajax()函数传值中文乱码解决方法介绍

    测试环境包括jQuery版本1.3.2和Tomcat 5.5.17。测试显示,无论使用GET还是POST方式,设置`contentType`属性为`charset=UTF-8`都能有效防止中文乱码。 对于GET请求,使用`data`对象或直接在URL中拼接参数,只要正确...

    jsp传值中文乱码问题解决方法示例介绍.docx

    本篇将详细介绍如何解决JSP传值过程中出现的中文乱码问题。 首先,我们需要理解乱码产生的原因。在网页中,数据的编码和解码过程需要保持一致。如果服务器和客户端之间使用的字符编码不同,就可能出现乱码。例如,...

    jsp页面显示中文乱码解决.pdf

    get 方式传值乱码是由于浏览器根据页面的 charset 编码方式对传值进行编码,然后提交至服务器交给 Tomcat,Tomcat 对这些信息进行解码时,采用的解码方式是由 server.xml 文件中的 URLEncoding 设置决定的。...

    jQuery Ajax传值到Servlet出现乱码问题的解决方法

    总的来说,解决Ajax传值到Servlet的乱码问题需要确保每个环节的编码设置一致,从JSP页面到Ajax请求,再到Servlet的接收和响应。只有这样,才能保证数据在整个传输过程中不发生乱码。记得在排查问题时,逐步检查每个...

    jsp传值中文乱码问题解决方法示例介绍

    5. 应用服务器配置:某些情况下,还需要在应用服务器的配置文件中设置全局的字符编码,比如Tomcat的server.xml中的URIEncoding属性。 通过上述步骤,我们可以有效避免JSP页面中的中文乱码问题。下面是一个简单的...

    url地址传参中文乱码处理

    (3)Tomcat配置:在使用Tomcat服务器时,需要确保服务器的配置正确,以免出现乱码情况。 在处理URL地址传参中文乱码时,需要根据具体情况选择合适的解决方案,并注意编码问题、特殊字符处理和Tomcat配置等方面。

    解决乱码问题

    #### 五、URL传值乱码 URL传值时出现的乱码问题,解决策略与GET提交类似,即在接收参数时进行编码转换。 #### 六、MySQL数据库乱码 数据库中的乱码问题通常源于数据存储和检索时的编码不匹配。解决MySQL数据库...

    乱码问题的解决

    * 服务器编码:tomcat 默认 iso8859-1 * 客户端编码:看是什么方法传值 * get 的 url 编码:一般是 utf8 * 数据库编码:自己设置 * 超链接的 url 编码:默认是服务器解析 二、乱码的情况 1. 页面乱码 页面乱码是...

    js通过地址栏给action传值(中文乱码全是问号)

    总结来说,解决js通过地址栏给action传值导致的中文乱码问题,需要仔细考虑和检查编码和解码过程中所使用字符集的一致性和正确性。这不仅涉及到客户端和服务器端的字符编码设置,还包括在编码转换过程中所采用的方法...

    JSP中文解码方法

    3. **POST方式传值乱码**: - POST请求的数据通过`request`对象存储,如果未设置请求体的编码,服务器默认使用ISO-8859-1解码,可能导致乱码。 - 解决方法:在接收页面,通过`request.setCharacterEncoding("UTF-8...

    JS传值出现中文参数乱码的解决方法

    以下是一些解决JS传值出现中文参数乱码的常用方法。 1. **使用`encodeURIComponent()`函数**: JavaScript的`encodeURIComponent()`函数可以对URL的一部分进行编码,它会将非字母数字字符转换为UTF-8序列,并用百...

    JSP乱码处理

    表单提交出现乱码的原因是 POST 方式将信息提交到 Tomcat 时,Tomcat 内部编码(iso-8859-1)与接收时(request.getParameter())的编码不一致造成乱码。 解决方法 A:接收参数时进行编码转换,例如: ``` String ...

    jsp传参 servlet接收中文乱码问题的解决方法.docx

    第四步:修改 servlet 里面的传值编码和传输编码。在 servlet 中添加 request.setCharacterEncoding("UTF-8"); 和 response.setContentType("text/html;charset=UTF-8"); 语句,以便设置正确的编码方式。 第五步:...

    j2ee中文乱码问题终极解决之道

    1. JSP页面间的传值:JSP页面在渲染和交互过程中,如果编码设置不正确,可能会导致乱码。 2. JavaScript与JSP页面的交互:JavaScript的编码与JSP页面的编码不一致,也会引起乱码。 3. JSP与Java代码的传值:在...

    JSP.rar_Action!_jsp传值

    在Tomcat的`server.xml`或Web应用的`web.xml`中,设置默认编码为UTF-8: ```xml &lt;!-- server.xml --&gt; &lt;!-- web.xml --&gt; &lt;filter-name&gt;CharacterEncodingFilter &lt;filter-class&gt;org.springframework.web....

Global site tag (gtag.js) - Google Analytics