【问题标题】:Tomcat UTF-8 IssueTomcat UTF-8 问题
【发布时间】:2013-07-15 13:59:11
【问题描述】:

我有一个非常奇怪的问题,我有两个 Web 应用程序在同一个 Tomcat 6 实例上运行。然而,一个网络应用程序正确地发布了 UTF-8 字符,而另一个网络应用程序没有,我不知道为什么。

server.xml 文件有一行:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" URIEncoding="UTF-8" redirectPort="8443" />

每个 WEB-INF/web.xml 都有以下几行:

<filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>EncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>

<filter-mapping>
     <filter-name>EncodingFilter</filter-name>
     <url-pattern>/*</url-pattern>
</filter-mapping>

<context-param>
    <param-name>PARAMETER_ENCODING</param-name>
    <param-value>UTF-8</param-value>
</context-param>

每个web应用都有相同的java类EncodingFilter,位于WEB-INF\classes文件夹,java类如下:

import java.io.IOException;
import javax.servlet.*;

public class EncodingFilter
    implements Filter
{

    public EncodingFilter()
    {
    }

    public void init(FilterConfig filterconfig)
        throws ServletException
    {
        filterConfig = filterconfig;
        encoding = filterConfig.getInitParameter("encoding");
    }

    public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)
        throws IOException, ServletException
    {
        servletrequest.setCharacterEncoding(encoding);
        filterchain.doFilter(servletrequest, servletresponse);
    }

    public void destroy()
    {
    }

    private String encoding;
    private FilterConfig filterConfig;
}

我已经检查了 JAVA 环境设置:

file.encoding=UTF-8
sun.jnu.encoding=UTF-8
sun.io.unicode.encoding=UnicodeLittle
file.encoding.pkg=sun.io

但问题在于,以下 JSP 文件在一个 Web 应用程序中正确发布,但在另一个应用程序中却不正确:

<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Character encoding test page</title>
</head>
<body>
<p>Data posted to this form was:
<%
request.setCharacterEncoding("UTF-8");
out.print(request.getParameter("mydata"));
%>
</p>
<form method="POST" action="test.jsp">
<input type="text" name="mydata">
<input type="submit" value="Submit" />
<input type="reset" value="Reset" />
</form>
</body>
</html>

如果我在一个应用程序中发布“çanak çömlek patladı”,我会收到“çanak çömlek patladı”,如果我在另一个网络应用程序中发布,我会收到“çanak çömlek patladı”,我真的不明白为什么,它们都在同一个 Tomcat 实例上使用相同的文件,那么到底为什么我会得到不同的结果,我错过了什么可以隐藏?

任何帮助将不胜感激:-)

【问题讨论】:

    标签: java windows tomcat utf-8


    【解决方案1】:

    我找到了问题,还有另一个 java 类 MaintenanceModeFilter 有一个影响因素:

    package com.jenkov.seo.web;
    
    import java.io.IOException;
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    
    public class MaintenanceModeFilter
        implements Filter
    {
    
        public MaintenanceModeFilter()
        {
            mode = 0;
            maintenanceUrl = null;
            maintenanceGuiUrl = null;
            password = null;
            comment = null;
        }
    
        public void init(FilterConfig filterconfig)
            throws ServletException
        {
            maintenanceUrl = filterconfig.getInitParameter("maintenanceUrl");
            maintenanceGuiUrl = filterconfig.getInitParameter("maintenanceGuiUrl");
            password = filterconfig.getInitParameter("password");
        }
    
        public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)
            throws IOException, ServletException
        {
            HttpServletRequest httpservletrequest = (HttpServletRequest)servletrequest;
            if(servletrequest.getParameter("maintenance-mode") != null)
            {
                if(password.equals(servletrequest.getParameter("password")))
                {
                    mode = Integer.parseInt(servletrequest.getParameter("maintenance-mode"));
                    comment = servletrequest.getParameter("aComment");
                    servletrequest.getRequestDispatcher(maintenanceGuiUrl).include(servletrequest, servletresponse);
                }
                return;
            }
            if(mode != 0 && !httpservletrequest.getServletPath().equals(maintenanceGuiUrl))
            {
                servletrequest.setAttribute("comment", comment);
                servletrequest.getRequestDispatcher(maintenanceUrl).include(servletrequest, servletresponse);
                return;
            } else
            {
                filterchain.doFilter(servletrequest, servletresponse);
                return;
            }
        }
    
        public void destroy()
        {
        }
    
        public static final int MODE_NORMAL_OPERATION = 0;
        protected int mode;
        protected String maintenanceUrl;
        protected String maintenanceGuiUrl;
        protected String password;
        protected String comment;
    }
    

    我已从 web.xml 文件中删除了引用并重新启动了 tomcat 服务器,并且两个 Web 应用程序都支持 UTF-8。在调用 HttpServletRequest 时,MaintenanceModeFilter 类似乎覆盖了编码。

    我希望这对其他人有所帮助,上面的设置在设置 Tomcat 服务器和 Web 应用程序以支持 UTF-8 时应该很有用。

    【讨论】:

      猜你喜欢
      • 2017-07-30
      • 2012-06-11
      • 2018-04-21
      • 2016-01-08
      • 2016-03-28
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多