Как получить объект org.apache.catalina.connector.Request в Tomcat? - PullRequest
6 голосов
/ 14 февраля 2011

Мне нужно написать класс Servlet или Filter, который может получить доступ к объекту org.apache.catalina.connector.Request, который обернут в объект RequestFacade, переданный моему сервлету.Приведение не работает, поскольку RequestFacade не является подклассом Request.

Причина, по которой мне это нужно, заключается в том, что я пытаюсь вызвать метод RequestResettedSessionId (), и это, очевидно, не является частью Http.спецификация сервлетаПричина, по которой мне нужно это сделать, заключается в том, что идентификатор сеанса включается в URL-адрес под другим именем, нежели JSESSIONID.Я не могу изменить URL-адрес или имя параметра, поэтому я пытаюсь связать запрос с правильным сеансом, извлекая идентификатор сеанса и вызывая Request.setRequestedSessionId ().

Я действительно решилпроблема с использованием подкласса Valve, но я не люблю использовать Valve, потому что, насколько я могу судить, мне нужно установить мой подкласс Valve в каталог Tomcat / server / classes вместо упаковки его с остальной частью моего веб-приложения.Если бы существовал переносимый способ сделать это в разных контейнерах сервлетов, это было бы замечательно, но на данный момент я смирился с созданием этого конкретного Tomcat.

Вот рабочий код Valve:

public class SessionSetter extends ValveBase {
public void invoke( Request request, Response response ) throws IOException, ServletException {
    String sessionId = request.getParameter( "whatever" );
    request.setRequestedSessionId( sessionId );
}

}

Есть ли способ сделать то же самое в сервлете или фильтре?Или есть какой-нибудь способ упаковать класс Valve в мой файл .war приложения?

Ответы [ 2 ]

5 голосов
/ 15 февраля 2011

(это мой комментарий, обновленный до ответа)

Если вы используете Tomcat 5.5 или 6, вы можете посмотреть на эту альтернативу: http://tomcat.apache.org/tomcat-6.0-doc/config/systemprops.html#Sessions. Вы можете изменить имена, используемые для параметра идентификатора сеанса, используя системные свойства. Это не доступно для Tomcat 7, хотя, насколько я могу судить (я думаю, что спецификация сервлета, которую реализует tc7, строже меняет имя).

Что касается доступа к внутреннему объекту запроса Tomcat из вашего веб-приложения (сервлета или фильтра), я не думаю, что вы сможете. Кажется, я вспоминаю, что где-то читал, что класс RequestFacade существует явно для предотвращения этого, поэтому веб-приложение не может связываться с внутренностями Tomcat.

4 голосов
/ 13 апреля 2013

Tomcat хранит настоящий запрос объект в защищенной переменной запрос из RequestFacade , так что вы можете получить его (в сервлете или JSP) с помощью отражение :

import java.lang.reflect.Field;
import org.apache.catalina.connector.Request;

...

Field f = request.getClass().getDeclaredField("request");
f.setAccessible(true); // grant access to (protected) field
Request realRequest = (Request)f.get(request);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...