jqueryajax中⽂编码设置
1.在前台两次⽤javascript的⽅法encodeURI对参数进⾏两次编码,如
$.ajax({
type: "POST",
url: $("#basePath").val()+"checkUserName?user.username="+encodeURI(encodeURI($("#usernameText").val())),
data: {},
success: function(data) {
alert(JSON.stringify(data));
}
});
在后台要进⾏解码:
System.out.println(URLDecoder.Username(), "UTF-8"));
下⾯是复制的内容:
深⼊浅出URL编码
⼀、问题:
编码问题是JAVA初学者在web开发过程中经常会遇到问题,⽹上也有⼤量相关的⽂章介绍,但其中很多⽂章并没有对URL中使⽤了中⽂等⾮ASCII的字符造成服务器后台程序解析出现乱码的问题作出准确的解释和说明。本⽂将详细介绍由于在URL中使⽤了中⽂等⾮ASCII的字符造成乱码的问题。
⼆、基础知识:
1、⼀个http请求经过的⼏个环节:
浏览器(ie firefox)【get/post】------------>Servlet服务器------------------------------->浏览器显⽰
编码 解码成unicode,然后将显⽰的内容编码 解码
(1) 浏览器把URL(以及post提交的内容)经过编码后发送给服务器。
(2) 这⾥的Servlet服务器实际上指的是由Servlet服务器提供的servlet实现ServletRequestWrapper,不同应⽤服务器的servlet实现不同,这些servlet的实现把这些内容解码转换为unicode,处理完毕后,然后再把结果(即⽹页)编码返回给浏览器。
(3) 浏览器按照指定的编码显⽰该⽹页。
当对字符串进⾏编码和解码的时候都涉及到字符集,通常使⽤的字符集为ISO8859-1、GBK、UTF-8、UNICODE。
2、URL的组成:
域名:端⼝/contextPath/servletPath/pathInfo?queryString
说明:
1、ContextPath是在Servlet服务器的配置⽂件中指定的。
对于weblogic:
contextPath是在应⽤的l中配置。
<context-root>/</context-root>
对于tomcat:
contextPath是在l中配置。
<Context path="/" docBase="D:/server/blog.war" debug="5" reloadable="true" crossContext="true"/>
对于jboos:
contextPath是在应⽤的l中配置。
<jboss-web>
<context-root>/</context-root>
</jboss-web>
2、ServletPath是在应⽤的l中配置。
<servlet-mapping>
<servlet-name>Example</servlet-name>
<url-pattern>/example/*</url-pattern>
</servlet-mapping>
2、Servlet API
我们使⽤以下servlet API获得URL的值及参数。
requestURI = RequestURI(); // 内容为:contextPath/servletPath/pathinfo 浏览器提交过来的原始数据,未被Servlet服务器URL Decode过。
3、开发⼈员必须清楚的servlet规范:
(1) HttpServletRequest.setCharacterEncoding()⽅法 仅仅只适⽤于设置post提交的request body的编
jquery是什么有什么作用码⽽不是设置get⽅法提交的queryString的编码。该⽅法告诉应⽤服务器应该采⽤什么编码解析post传过来的内容。很多⽂章并没有说明这⼀点。
(2) PathInfo()返回的结果是由Servlet服务器解码(decode)过的。
(3) RequestURI()返回的字符串没有被Servlet服务器decoded过。
(4) POST提交的数据是作为request body的⼀部分。
(5) ⽹页的Http头中ContentType("text/html; charset=GBK")的作⽤:
(a) 告诉浏览器⽹页中数据是什么编码;
(b) 表单提交时,通常浏览器会根据ContentType指定的charset对表单中的数据编码,然后发送给服务器的。
这⾥需要注意的是:这⾥所说的ContentType是指http头的ContentType,⽽不是在⽹页中meta中的ContentType。
(1) 对于中⽂IE,如果在⾼级选项中取消总以UTF-8发送,则PathInfo和QueryString是URL encode按照GBK编码。
实际上提交是:
GET /example/%D6%D0%B9%FA?name=%D6%D0%B9%FA
(3) 对于中⽂firefox,则pathInfo和queryString都是URL encode按照GBK编码。
实际上提交是:
GET /example/%D6%D0%B9%FA?name=%D6%D0%B9%FA
很显然,不同的浏览器以及同⼀浏览器的不同设置,会影响最终URL中PathInfo的编码。对于中⽂的IE和FIREFOX都是采⽤GBK编码QueryString。
2、我们建议URL中PathInfo和QueryString采⽤相同的编码,这样对服务器端处理的时候会更加简单。
2、 POST提交
对于POST⽅式,表单中的参数值对是通过request body发送给服务器,此时浏览器会根据⽹页的ContentType("text/html; charset=GBK")中指定的编码进⾏对表单中的数据进⾏编码,然后发给服务器。
在服务器端的程序中我们可以通过Request.setCharacterEncoding() 设置编码,然后通过Parameter获得正确的数据。
解决⽅案:
1、从最简单,所需代价最⼩来看,我们对URL以及⽹页中的编码使⽤统⼀的编码对我们来说是⽐较合适的。
如果不使⽤统⼀编码的话,我们就需要在程序中做⼀些编码转换的事情。这也是我们为什么看到有⽹络上⼤量的资料介绍如何对乱码进⾏处理,其中很多解决⽅案都只是⼀时的权宜之计,没有从根本上解决问题。
(⼆)、Servlet服务器
Servlet服务器实现的Servlet遇到URL和POST提交的数据中含有%的字符串,它会按照指定的字符集解码。下⾯两个Servlet⽅法返回的结果都是经过解码的:
这⾥所说的"指定的字符集"是在应⽤服务器的配置⽂件中配置。
(1) tomcat服务器
对于tomcat服务器,该⽂件是l
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="150" connectionTimeout="20000"
redirectPort="8443" URIEncoding="GBK"/>
URIEncoding告诉服务器servlet解码URL时采⽤的编码。
<Connector port="8080" ... useBodyEncodingForURI="true" />
useBodyEncodingForURI告诉服务器解码URL时候需要采⽤request body指定的编码。
(2) weblogic服务器
对于weblogic服务器,该⽂件是l
<input-charset>
<java-charset-name>GBK</java-charset-name>
</input-charset>
(三)浏览器显⽰
浏览器根据http头中的ContentType("text/html; charset=GBK"),指定的字符集来解码服务器发送过来的字节流。我们可以调⽤HttpServletResponse.setContentType()设置http头的ContentType。
2、我们建议URL中的URL Encode编码的字符集和⽹页的contentType的字符集采⽤相同的字符集,这样程序的实现就很简单,不⽤做复杂的编码转换。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论