在项目中遇到这样的问题,客户的资源文件(比如XML)中有中文名,
而访问的时候,带中文名的URL报404.
比如:http://localhost:8080/ProjectTest/cms/版权.xml
在IE地址栏直接输入也不行。
解决方法:
1. 要让带中文名的文件在IE地址栏可以直接访问,跟代码是没关系的,要改Tomcat设置。
Tomcat\conf\server.xml:在8080端口最后添加URIEncoding="UTF-8"即可
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />2. 光是改了Tomcat,程序中还是访问不了,需要用URLEncoder.encode(string, "UTF-8")转码
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse("http://localhost:8080" + encodeUrlToUTF8(request.getParameter("xml")));
public static String encodeUrlToUTF8(String url) throws UnsupportedEncodingException{
StringBuffer sb = new StringBuffer();
for (int i = 0; i < url.length(); i++) {
String s = url.substring(i, i + 1);
byte[] bytes = s.getBytes("UTF-8");
// 中文字符是2个字节,符号和英文为1个字节
if (bytes.length == 1) {
if (bytes[0] == ' ')
sb.append("%20");
else
sb.append(s);
} else {
sb.append(URLEncoder.encode(s, "UTF-8"));
}
}
return sb.toString();
} 补充一下我对编码设置的理解:
Tomcat中的URLEncoding的默认值是ISO-8859-1(单字节编码),不能显示中文。它是用来设置URL解码时的字符编码。
如果资源里面有中文,则需要改成UTF-8或者GBK等类型。
Tomcat服务器既然设置了UTF-8的编码格式,则传给他的URL也必须是UTF-8格式,不然读不到。
一开始我以为web.xml中,有了下面的过滤器以后,会自动转换为UTF-8
提交给服务器的URL如下:
http://localhost:8080/ProjectTest/cms/%E7%89%88%E6%9D%83.xml
说明web.xml的过滤器起了作用。
但是从代码里面直接读取资源的时候
如果没有encodeUrlToUTF8手动转换为UTF-8的话,它直接会去读取服务器上http://localhost:8080/ProjectTest/cms/版权.xml这个文件,
Tomcat服务器以UTF-8来读取当然就读不到了。
所以web.xml中的设置对于代码读取文件似乎并不起作用,因此才需要手动在代码中转换。
如果资源里面有中文,则需要改成UTF-8或者GBK等类型。
Tomcat服务器既然设置了UTF-8的编码格式,则传给他的URL也必须是UTF-8格式,不然读不到。
一开始我以为web.xml中,有了下面的过滤器以后,会自动转换为UTF-8
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>事实证明,在IE地址栏里面输入http://localhost:8080/ProjectTest/cms/版权.xml,确实会自动转换为UTF-8。提交给服务器的URL如下:
http://localhost:8080/ProjectTest/cms/%E7%89%88%E6%9D%83.xml
说明web.xml的过滤器起了作用。
但是从代码里面直接读取资源的时候
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse("http://localhost:8080" + encodeUrlToUTF8(request.getParameter("xml")));
如果没有encodeUrlToUTF8手动转换为UTF-8的话,它直接会去读取服务器上http://localhost:8080/ProjectTest/cms/版权.xml这个文件,
Tomcat服务器以UTF-8来读取当然就读不到了。
所以web.xml中的设置对于代码读取文件似乎并不起作用,因此才需要手动在代码中转换。

本文介绍了解决在Tomcat服务器中使用中文名URL时出现404错误的方法。通过配置Tomcat的server.xml文件启用UTF-8编码,并使用URLEncoder.encode进行URL转码,确保程序能正确解析和访问中文路径。
3453

被折叠的 条评论
为什么被折叠?



