在Tomcat 8中,Servlet无法正确解码ISO-8859-1编码的URL

时间:2016-04-12 17:16:48

标签: tomcat servlets urlencode

我有一个简单的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。

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