Суть проблемы заключается в том что при передаче текстовых данных содержащих русские буквы, на стороне сервлета я вижу "???????? ???? ?????"
А теперь подробнее.
Собираю проект в IDEA, в качестве OS использую Ubuntu Desktop 14.04, запускаю на локальном TOMCAT. Проект запускается, и данные через post запрос передаются на сервлет - все работает отлично.
Собранный проект я копирую на удаленный ubuntu server 14.04 и запускаю на локальном TOMCAT сервере, все работает как надо за исключением одной проблемы - при передаче текстовых данных содержащих русские буквы post запросом на стороне сервера я вижу ???????? ???? ?????
Что я использую:
TOMCAT 8.0.33
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
вот такой вот JSP
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Вот такой вот Сервлет
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String fio = req.getParameter("fio");
String email = req.getParameter("email");
System.out.println(fio);
System.out.println(email);
System.out.println(req.getCharacterEncoding());
System.out.println(resp.getCharacterEncoding());
При попытке ввести значение
йцуйцу
wqe@qwe.ru
вот такой вывод
??????
qwe@qwe.ru
UTF-8
UTF-8
Кодировка java файлов в IDEA UTF-8
Что я уже пытался делать:
Я пытался поменять\добавить в систему новые локали и теперь это выглядит таком вот образом
locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
POSIX
ru_RU
ru_RU.cp1251
ru_RU.iso88595
ru_RU.koi8r
ru_RU.utf8
ru_UA.utf8
locale
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES=POSIX
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
Я пытался установить фильтр
package xxx.filters;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/CharEncodingFilter")
public class CharEncodingFilter implements Filter {
private static final String FILTERABLE_CONTENT_TYPE="application/x-www-form-urlencoded";
private static final String ENCODING_DEFAULT = "UTF-8";
private static final String ENCODING_INIT_PARAM_NAME = "encoding";
private String encoding;
@Override
public void init(FilterConfig config) throws ServletException{
encoding = config.getInitParameter(ENCODING_INIT_PARAM_NAME);
if (encoding == null)
encoding = ENCODING_DEFAULT;
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws ServletException, IOException{
String contentType = req.getContentType();
if (contentType != null && contentType.startsWith(FILTERABLE_CONTENT_TYPE))
req.setCharacterEncoding(encoding);
resp.setCharacterEncoding(encoding);
chain.doFilter(req, resp);
}
@Override
public void destroy() {
}
}
И добавить этот фильтр в web.xml проекта
CharEncodingFilter
orion.filters.CharEncodingFilter
encoding
UTF-8
CharEncodingFilter
/*
Я пытался отредактировать server.xml Tomcat server и теперь он выглядит так
Буду благодарен за любую помощь.
Ответ
Проблема оказалась в Tomcat
На стороне ubuntu server, Tomcat воспринимал файлы .class в кодировке ANSI_X3.4-1968
System.out.println("File Encoding = " + System.getProperty("file.encoding"));
File Encoding ANSI_X3.4-1968
На стороне ubuntu desctop, Tomcat воспринимал файлы .class в кодировке UTF-8
System.out.println("File Encoding = " + System.getProperty("file.encoding"));
File Encoding UTF-8
Не понимаю как это возможно
Решение следующие:
Необходимо редактировать catalina.sh
sudo nano /opt/tomcat/bin/catalina.sh
И задать кодировку руками. После большого системного комментария добавить строку.
export CATALINA_OPTS="$CATALINA_OPTS -Dfile.encoding=UTF-8"