cek*_*ock 27 jsp servlets utf-8 character-encoding
我正在创建一个简单的登录页面,我想将登录和密码参数作为UTF-8编码的字符串传递.正如你在下面的代码中看到的那样,第一行是我将编码设置为UTF-8的地方,但它似乎毫无意义,因为它不起作用.当我使用带重音的登录名和密码参数时,结果页面会收到奇怪的字符.
如何以适用于所有浏览器的方式正确设置字符编码?
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>My Page</title>
</head>
<body>
<h1>Welcome to My Page</h1>
<form name="login" action="login.jsp" method="POST">
Login:<br/>
<input type="text" name="login" value="" /><br/>
Password:<br/>
<input type="password" name="password" value="" /><br/>
<br/>
<input type="submit" value="Login" /><br/>
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
Bal*_*usC 49
在pageEncoding
只设置响应的字符编码和charset
所述HTTP的属性Content-Type
标题中.基本上,它告诉服务器在将JSP发送到客户端之前将JSP生成的字符解码为UTF-8,并且标头告诉客户端使用UTF-8对它们进行编码,并且当同一页面中的任何表单是要提交回服务器.在contentType
已经默认为text/html
,所以下面就足够了:
<%@page pageEncoding="UTF-8"%>
Run Code Online (Sandbox Code Playgroud)
通过HTTP提供页面时,将忽略HTML元标记.它仅在客户端将页面保存为本地磁盘系统上的HTML文件然后通过file://
浏览器中的URI 打开时使用.
在您的特定情况下,HTTP请求正文编码显然未设置为UTF-8.在请求中涉及的任何servlet或过滤ServletRequest#setCharacterEncoding()
器中进行第一次调用之前,需要在servlet或过滤器中设置请求主体编码request.getXxx()
.
request.setCharacterEncoding("UTF-8");
String login = request.getParameter("login");
String password = request.getParameter("password");
// ...
Run Code Online (Sandbox Code Playgroud)
调用ServletRequest#setCharacterEncoding()在某些情况下仍然会失败.
如果你的容器小心地遵循servlet规范(和tomcat一样),它默认将post参数解释为ISO-8859-1.这可能会在他们访问您的代码之前将UTF-8字符(例如我最近使用过的日语中的日语)弄乱,特别是如果您有一个使用getParameter()
或检查请求参数的servlet过滤器getParameters()
.这两种方法强制解码参数,解码只进行一次.
如果你有查看请求参数的过滤器,这里有一个如何在Tomcat中解决这个问题的链接.人们会想要查看特定容器的文档.
http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q1
关键点是:
加
useBodyEncodingForURI="true" URIEncoding="UTF-8"
Run Code Online (Sandbox Code Playgroud)
到Tomcat的server.xml中的Context元素并添加
<filter>
<filter-name>Character Encoding Filter</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>
<filter-mapping>
<filter-name>Character Encoding Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
与之前在web.xml中调用getParameter()或getParameters()的任何过滤器一样.我发现尽管上面的链接使得context元素的两个属性看起来像是替代,但useBodyEncodingForURI绝对是必需的,或者tomcat不会为查询字符串设置编码.来自tomcat 7.0.42中的Request.java:
boolean useBodyEncodingForURI = connector.getUseBodyEncodingForURI();
if (enc != null) {
parameters.setEncoding(enc);
if (useBodyEncodingForURI) {
parameters.setQueryStringEncoding(enc);
}
} else {
parameters.setEncoding
(org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
if (useBodyEncodingForURI) {
parameters.setQueryStringEncoding
(org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
83880 次 |
最近记录: |