Суть проблемы заключается в том что при передаче текстовых данных содержащих русские буквы, на стороне сервлета я вижу "???????? ???? ?????"
А теперь подробнее.
Собираю проект в 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 проекта
Я пытался отредактировать 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"
Комментариев нет:
Отправить комментарий