HTTP协议规定浏览器向web服务器传递的参数信息中不能出现某些特殊字符,而必须对这些字符进行URL编码后再传递。对于URL中的一些特殊字符,浏览器会自动进行编码。这些字符除了"/?&"等外,还包括unicode字符,比如汉字。这时的编码比较特殊。IE有一个选项"总是使用UTF- 8发送URL",当该选项有效时,IE将会对特殊字符进行UTF-8编码,同时进行URL编码。如果改选项无效,则使用默认编码"GBK",并且不进行 URL编码。但是,对于URL后面的参数,则总是不进行编码,相当于UTF-8选项无效。比如"中文.html?a=中文",当UTF-8选项有效时,将发送链接"%e4%b8%ad%e6%96%87.html?a=x4ex2dx65x87";而UTF-8选项无效时,将发送链接"x4ex2dx65x87.html?a=x4ex2dx65x87"。注意后者前面的"中文"两个字只有4个字节,而前者却有18个字节,这主要时URL编码的原因。
当web server(tomcat)接收到该链接时,将会进行URL解码,即去掉"%",同时按照ISO8859-1编码(上面已经描述,可以使用URLEncoding来设置成其它编码)识别。上述例子的结果分别是"ue4ub8uadue6u96u87.html?a=u4eu2du65u87"和"u4eu2du65u87.html?a=u4eu2du65u87",注意前者前面的"中文"两个字恢复成了6个字符。这里用"u",表示是unicode。
所以,由于客户端设置的不同,相同的链接,在服务器上得到了不同结果。
2种情况的解决方案:
1.对于HTTP请求消息的请求行中的URL地址后的参数(get方法提交表单),getParameter等方法进行URL解码时所采用的字符集编码在Servelt规范中没有明确规定,它由各个Servlet引擎厂商自行决定。对于这种情况,Tomcat中的ServletRequest对象的getParameter等方法默认采用ISO8859-1进行解码。
ServletRequest接口中定义了一个setCharacterEncoding方法来设置请求消息中的实体内容的字符集编码名称,request.getParameter方法以该方法设置的字符集编码对实体内容进行URL解码。setCharacterEncoding方法来设置的字符集只影响getParameter方法对POST过来的内容进行URL解码的结果,而不能影响URL地址后的参数进行URL解码的结果,所以及时使用setCharacterEncoding方法来设置请求消息中的实体内容的字符集编码名称也不管用
解决方案:
a)在Tomcat配置中,连接器(HTTP Connector)属性中有一个URIEncoding和useBodyEncodingForURI属性,这两个属性设置对URL后的附加参数进行URL解码时该如何选择字符集编码。URIEncoding用于制定URL后的附加参数的字符集编码,useBodyEncodingForURI则说明是否采用实体内容的字符集编码设置来替代URIEncoding的设置,也就是说当useBodyEncodingForURI属性设置为true时,ServletRequest.setCharacterEncoding方法设置的字符集编码也影响getParameter等方法对URL地址后的参数进行URL解码的结果。(在/%TomCat_Home%/
conf\server.xml文件中找到标记,然后在后面加上useBodyEncodingForURI=true)
b)前面我们讲到,即使IE选项"总是使用UTF- 8发送URL"被选中,URL后面的参数也不会进行编码,所以URL后面的中文参数最好还是手动进行URL编码。可以采用java.net.URLEncoder.encode()方法进行编码,然后浏览器中所显示出来的就是一堆百分号之类的字符,见例子
MyJsp.jsp
<body>
<%
String name = "米兰,我爱你";
//name = java.net.URLEncoder.encode(name,"utf-8");
%>
<a href="<%=request.getContextPath()%>/jsp/compactInfo/jsp1.jsp?name=<%=name%>">中文参数请求</a>
</body>
jsp1.jsp
<body>
<%
String name = request.getParameter("name");
name = java.net.URLDecoder.decode(name,"utf-8");
// name = new String(name.getBytes("iso8859-1"),"utf-8");
%>
收到中文参数:<%=name %>
</body>
2.对于post方式下的"application/x-www-form-urlencoded"编码格式的实体内容,getParameter等方法以ServletRequest对象的getCharacterEncoding()方法返回的字符集对其进行URL解码。如果getCharacterEncoding()方法返回null,则采用ISO8859-1
分享到:
相关推荐
对于POST请求中的中文参数,可以使用过滤器来统一处理编码问题。过滤器只对POST请求有效,对于GET请求则无效。具体实现方式如下: ```java public class EncodingFilter implements Filter { @Override public ...
通过对JSP文件与响应编码方式的设置、文件头部的字节顺序标记(BOM)、表单数据的读取、请求参数的处理等多个方面进行深入分析,帮助开发者更好地理解和解决这一问题。 #### 1. 设置JSP文件与响应编码方式 在JSP...
在IT领域,尤其是在Web开发中,遇到中文乱码问题是开发者们常见的挑战之一。尤其是在使用Java Server Pages(JSP)和Servlet进行中文处理时,字符编码的设置不当往往会导致页面显示出现乱码。本文将深入探讨JSP和...
未选中的复选框则不会在请求参数中出现。 接下来,我们引入加密概念。在JSP中,我们可以使用Java的加密库,如Java Cryptography Extension (JCE),来实现数据的加密和解密。常用的加密算法有AES、DES等。例如,我们...
与在JSP页面中类似,在Servlet中也需设置`request`对象的字符集为UTF-8,以便正确读取中文参数。 #### 总结 综上所述,解决JSP+Servlet开发中的中文乱码问题主要依赖于确保整个系统中各个部分都使用相同的字符集。...
在doFilter方法中,我们将请求的字符编码设置为GB2312,这样可以正确地读取中文字符。 如何部署过滤器 要部署过滤器,需要在WEB-INF\web.xml文件中添加以下内容: ```xml <filter-name>cf <filter-class>my....
- 对于POST请求,由于在读取请求参数前可以设置编码,因此在Servlet中使用上述方法可以解决问题。 - 但是,如果需要同时处理GET和POST,以及避免每个Servlet都写相同的代码,那么创建一个全局Filter是最好的解决...
此外,对于"中文乱码问题.txt"这样的文本文件,如果在读取或写入时没有正确指定编码,也可能导致乱码。Java中,我们可以使用`BufferedReader`和`BufferedWriter`的构造函数,明确指定字符集来避免这种情况。 总之,...
当通过POST方式提交表单数据到JSP或Servlet时,如果接收的中文参数值乱码,可以在处理请求的代码之前,使用`request.setCharacterEncoding("GBK")`来设置请求参数的编码格式。这通常应在读取参数之前进行,以确保...
在IT领域,尤其是在Web开发中,JSP(JavaServer Pages)中文乱码问题是一个常见的困扰。JSP是一种基于Java的动态网页技术,它允许开发者在HTML页面中嵌入Java代码,实现服务器端的动态渲染。当涉及到中文字符时,...
在Web开发中,JSP中文乱码是一个常见的问题,主要涉及页面显示、表单提交以及数据库操作等环节。理解并掌握这些环节的编码处理至关重要,以确保数据的准确性和用户体验。 1. **JSP文件的编码与保存** JSP文件本质...
例如,当从一个JSP页面通过URL参数向另一个JSP页面传递中文字符串时,如果两个页面或请求处理过程中的字符编码设置不一致,就可能会导致接收方看到的是乱码。 #### 知识点二:使用`encodeURIComponent`编码中文参数...
#### 方法二:处理请求参数中的中文 当通过GET或POST方式提交的数据中含有中文时,浏览器会自动将中文字符编码成ISO-8859-1格式。因此,在JSP页面接收这些参数之前,需要先将其转换回正确的编码格式。 ##### 示例...
在开发Web应用时,尤其是使用Java技术栈如JSP、Servlet与MySQL数据库交互时,中文乱码问题常常困扰着开发者。这个问题的出现主要是由于字符编码不一致导致的,包括数据库编码、连接编码、页面编码等多个环节。下面...
文档《JSP各种乱码的处理(一).doc》和《JSP各种乱码的处理(二).doc》中可能详细列举了各种JSP乱码问题的实例及解决方法,包括但不限于文件上传、读取流、数据库操作等方面,建议参考学习,以便更全面地理解并解决...
在JavaServer Pages (JSP)开发中,处理中文字符的编码问题是一项常见的任务。中文字符在不同的阶段可能会遇到乱码,这通常与JSP页面、HTTP请求方式(POST和GET)以及服务器配置有关。以下是对标题和描述中所述知识点...
1. **request**:代表HTTP请求,可以获取请求参数。 2. **response**:代表HTTP响应,用于设置响应头和输出数据。 3. **session**:用于管理用户会话。 4. **application**:用于在整个应用范围内的共享数据。 5. **...
- **解析请求参数**:Servlet可以通过HttpServletRequest对象的getParameter()方法获取POST或GET请求中的参数。 - **执行业务逻辑**:根据请求参数执行相应的操作,如查询数据库、计算等。 - **设置响应内容**:...
在描述中提到,这个问题已经得到了解决,意味着作者对`jspSmartUpload`的源代码进行了修改和重新编译,以确保在处理中文文件名时能够正确显示,避免了常见的编码不兼容问题。这通常涉及到对源代码中的字符编码设置...
本文将深入解析如何在JSP中实现文件下载,并解决中文文件名乱码的问题。 首先,我们需要了解HTTP协议在处理文件下载时的角色。当用户请求下载一个文件时,服务器需要设置响应头来指示浏览器如何处理这个响应。在JSP...