Gui*_*ume 21 java jsp tomcat servlets character-encoding
我的Java webapp中存在问题.
这是index.jsp中的代码:
<%@page contentType="text/html" pageEncoding="UTF-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<% request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Hello World!</h1>
<form action="index.jsp" method="get">
<input type="text" name="q"/>
</form>
Res: <%= request.getParameter("q") %>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
当我发送请求时,我的浏览器发送此标头:
GET /kjd/index.jsp?q=%C3%A9 HTTP/1.1\r\n
...
Accept-Charset: UTF-8,*\r\n
Run Code Online (Sandbox Code Playgroud)
Tomcat服务器将此返回给我:
Content-Type: text/html;charset=UTF-8\r\n
Run Code Online (Sandbox Code Playgroud)
但是如果我在表单中发送"é"(在UTF-8中为%C3%A9),则会显示"é".
我的理解是浏览器发送一个用UTF-8(%C3%A9)编码的"é".
但是服务器将其解释为ISO-8859-1.所以%C3被解码为Ã而%A9被解码为©,然后发回以UTF-8编码的响应.
在代码中,请求应使用UTF-8解码:
request.setCharacterEncoding("UTF-8");
Run Code Online (Sandbox Code Playgroud)
但是,如果我发送此网址:
http://localhost:8080/kjd/index.jsp?q=%E9
Run Code Online (Sandbox Code Playgroud)
"%E9"用ISO-8859-1表示,显示"é".
为什么这不起作用?为什么请求使用ISO-8859-1进行解码?
我在Tomcat 6和7以及Windows和Ubuntu上尝试过它.
Bal*_*usC 56
在request.setCharacterEncoding("UTF-8");只设定请求的编码体(其被用于通过POST请求),请求的未编码的URI(其被用于由GET请求).
您需要在Tomcat的元素中设置URIEncoding属性,以使Tomcat将请求URI(和查询字符串)解析为UTF-8.这确实默认为ISO-8859-1.另请参阅Tomcat HTTP连接器文档.UTF-8<Connector>/conf/server.xml
<Connector ... URIEncoding="UTF-8">
Run Code Online (Sandbox Code Playgroud)
或者确保使用与正文相同的编码解析URI:
<Connector ... useBodyEncodingForURI="true">
Run Code Online (Sandbox Code Playgroud)
请删除JSP中的那些scriptlet.在 request.setCharacterEncoding("UTF-8");被称为在错误的时刻.只要你正确使用Servlet处理请求,就太晚了.你更愿意为此使用过滤器.该 response.setCharacterEncoding("UTF-8");部分已经pageEncoding="UTF-8"在JSP的顶部隐式完成.
我还强烈建议用EL替换旧式的<%= request.getParameter("q") %> scriptlet,或者用JSTL XML转换来防止XSS攻击. ${param.q}${fn:escapeXml(param.q)}
您只需要在conf/web.xml(Tomcat服务器web.xml)中取消注释下面的部分代码,过滤所有请求并转换为UTF-8.
<!-- A filter that sets character encoding that is used to decode -->
<!-- parameters in a POST request -->
<filter>
<filter-name>setCharacterEncodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!-- The mapping for the Set Character Encoding Filter -->
<filter-mapping>
<filter-name>setCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
而已.在tomcat工作得很好
| 归档时间: |
|
| 查看次数: |
52264 次 |
| 最近记录: |