2013-07-15 3 views
2

У меня очень странная проблема, у меня есть два веб-приложения, работающие на одном экземпляре Tomcat 6. Однако одно веб-приложение правильно печатает символы UTF-8, а другое веб-приложение не работает, и я не могу понять, почему.Tomcat UTF-8 Issue

Файл 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> 

Каждое веб-приложение имеет тот же класс Java EncodingFilter расположенный в папке WEB-INF \ классов, класс 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 правильно в одном веб-приложение, но не другой:

<%@ 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, поэтому почему Земля, я получаю другой результат, что может быть скрыто, что мне не хватает?

Любая помощь будет высоко ценится :-)

ответ

2

Я нашел этот вопрос, был еще один класс 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, а оба веб-приложения поддерживают UTF-8. Похоже, что класс MaintenanceModeFilter переопределял кодировку при вызове HttpServletRequest.

Я надеюсь, что это поможет другим, приведенные выше настройки должны оказаться полезными при настройке сервера Tomcat и веб-приложения для поддержки UTF-8.