不管是从浏览器 到tomcat服务器, 还是从tomcat服务器到浏览器,非ASCII数据传输都是需要编解码操作的
下面的都是针对tomcat8版本之前
我们先需要了解一点的是: 下面的是针对请求行
- http://localhost:8080/example/中国?name=中国
- 对于Chrome PathInfo是按照utf8编码, queryString是按照utf8编码
- 对于Firefox PathInfo是按照utf8编码, queryString是按照utf8编码
- 对于万恶的IE PathInfo是按照gbk编码, queryString是按照GBK编码
- 注:上面不同版本浏览器编码字符集不同, 这里仅仅指出不同浏览器或者不同版本浏览器自己会用自己一套字符集编码 然后通过http往后台传递数据
在URL中传递中文的解决方式:
- 在服务端设置
在tomcat的配置文件中指定编码
server.xml文件中指定:URIEncoding=”UTF-8” 和 useBodyEncodingForURI=“true”
<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"
useBodyEncodingForURI="true" URIEncoding="UTF-8"/>
URIEncoding告诉服务器servlet编码URI时采用的编码;
useBodyEncodingForURI 告诉服务器解码URI时候需要采用浏览器的编码格式来解析(Chrome和Firefox针对URI编码是UTF-8,IE浏览器针对URI编码是GBK)
- 在浏览器页面设置
在页面设置文件的编码和保存格式UTF-8
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
- 这样设置后, chrome、firefox等浏览器URL中带有中文的请求, 不会出现400错误了,对独树一帜的IE大浏览器仍旧不起效果(后面我们解决IE的问题)
- 我们先来测试在chrome、firefox 中效果, 在此之前 我们需要了解一些servlet规范:
(1) HttpServletRequest.setCharacterEncoding()方法 不仅仅只适用于设置post提交的request body的编码还包括设置get方法提交的queryString的编码.比如: 从url中获取请求中文参数, 需要在 getParameter()之前,需要request.setCharacterEncoding.
(2) HttpServletRequest.getRequestURI()返回的字符串没有被Servlet服务器decoded过。需要自己手动decode
下面我们看代码: jsp页面
<a href="${pageContext.request.contextPath}/qingqiuhang?name=张三" >请求path中没有中文, 请求参数中有中文</a></br>