Проблемы с параметрами POST с Tomcat/AJP на Apache 2.4 (но не на 2.2)
Я устанавливаю версию нашего веб-приложения на новой машине с Apache 2.4 и Tomcat 7 и не могу заставить работать логин. Текущий сайт работает на Apache 2.2 и Tomcat 6.
Отладка показывает, что request.getParameter()
возвращается null
только на сайте 2.4.
Я проверил это во всех браузерах, и навигация по сайту работает, поэтому AJP хотя бы частично функционален - только когда я публикую форму, данные формы не видны моему Tomcat.
Конфиг одинаков на обоих:
<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
ServerAlias cdn.example.com
ServerAlias prod.example.com
ProxyPreserveHost On
ProxyPass /images/ !
ProxyPass /font/ !
ProxyPass /style/ !
ProxyPass / ajp://localhost:8009/ retry=1 acquire=3000 timeout=600 Keepalive=On
ProxyPassReverse / ajp://localhost:8009/
И соединитель определен в server.xml как:
<Connector port="8009" address="localhost"
maxThreads="250" minSpareThreads="5" maxSpareThreads="15"
connectionTimeout="200000"
packetSize="16384"
maxHttpHeaderSize="16384"
enableLookups="false" redirectPort="8443"
emptySessionPath="true" URIEncoding="UTF-8" protocol="AJP/1.3"/>
Заголовок запроса браузера:
Host: prod.example.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es,sv;q=0.9,de;q=0.8,en;q=0.6,es-MX;q=0.5,en-AU;q=0.4,ja;q=0.3,fr;q=0.1
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 73
Referer: http://prod.example.com/en_US/auth/login.action
Cookie: JSESSIONID=07FB9E1A02A4464C0D65B332B53EF02F
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Я включил прямой доступ Tomcat через порт 8080, и логин тоже работает нормально.
Код поступает из того же git-репозитория и ветки, поэтому все остальное должно быть идентично устаревшему сайту. Стоит ли искать изменения в Tomcat 7 или Apache 2.4, чтобы отследить это?
Обновление: я создал очень простой test.jsp с формой для отправки. Я использую...
Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String name = (String) paramNames.nextElement();
String[] values = request.getParameterValues(name);
.. чтобы сбросить параметры. Через прямой 8080 URL это работает отлично, но через Apache/AJP все параметры POST игнорируются, однако, если я добавлю параметры GET вручную в URL, например. ?test=123
они работают нормально.
Обновление 2: я добавил вывод request.getReader()
к моему test.jsp
и мои данные POST отображаются правильно там, например, t1=Some+text&t2=Testing
но request.getParameter("t1")
все еще null
, Я, должно быть, упускаю что-то действительно глупое.
Обновление 3: Первоначально я думал, что это связано с SSL, но теперь настроил VirtualHost без SSL, и это имеет точно такую же проблему. Моя тестовая страница имеет метку даты, поэтому она не является проблемой кеша.
Обновление 4: я только что сделал следующее изменение, которое позволяет правильно обрабатывать данные формы POST:
# ProxyPass / ajp://localhost:8009/ retry=1 acquire=3000 timeout=600 Keepalive=On
# ProxyPassReverse / ajp://localhost:8009/
ProxyPass / http://localhost:8080/ retry=1 acquire=3000 timeout=600 Keepalive=On
ProxyPassReverse / http://localhost:8080/
Итак, это похоже на ошибку Apache или Tomcat?
1 ответ
Сколько предметов в вашем теле POST? Tomcat имеет максимальное количество из них. Tomcat 7 очень высокий, по умолчанию 10 000. AJP не представляется настраиваемым, хотя есть несколько параметров. Смотрите следующее для обоих:
https://tomcat.apache.org/tomcat-7.0-doc/config/ajp.html
Относительно вашего вопроса, эта статья, кажется, предлагает после исчерпывающего тестирования, что это AJP (хотя автор заключил, что это был кот): http://tomcat.10.x6.nabble.com/Tomcat-looses-POST-parameters-td2067515.html. По сути, данные входили в AJP и не появлялись в первом фильтре Tomcat.
По какой причине вы не используете ProxyPass по HTTP?