我有一个简单的Servlet:
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("processedName", request.getParameter("name"));
request.setAttribute("processedQueryString", request.getQueryString());
request.getRequestDispatcher("index.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
我的index.jsp
是这样的:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Title</title>
</head>
<body>
<form action="MyServlet" method="get">
Name: <input type="text" name="name">
<input type="submit" value="Submit">
</form>
<br>
After: <%=request.getAttribute("processedName") %>
<br>
Query String: <%=request.getAttribute("processedQueryString") %>
</body>
</html>
如果我在表单中输入Thomás
并提交,则会打印Thom?s
。
浏览器中的URL和JSP中的查询字符串都显示name=Thom%E1s
浏览器正在将ISO-8859-1 á
char正确编码为%E1
,但出于某种原因,.getParameter
无法正确解码。
当人们尝试提交非ISO-8859-1字符(与á
不同)时,我在这里看到过很多这样的帖子。 Tomcat 8不应该使用ISO-8859-1作为解码的默认值吗?
奇怪的是,如果我将accept-charset="UTF-8"
放在我的表单中,它就可以了。如果我将方法更改为method="post"
则可行。如果我同时混用了accept-charset="UTF-8"
和method="post"
,它就不起作用(但现在打印Thomás
!)。
好像Tomcat在get方法中等待UTF-8,在post方法中等待ISO-8859-1。
答案 0 :(得分:0)
tomcat 8中的默认URIEncoding是UTF-8,除非属性org.apache.catalina.STRICT_SERVLET_COMPLIANCE
设置为true
,那么它是ISO-8859-1。
在您的情况下,您可以尝试添加以下内容:
URIEncoding="ISO-8859-1"
在server.xml
文件中的Connector元素。
有关所有详细信息,请参阅tomcat documentation。