Добавление фильтра сервлетов, который оборачивает запрос в HttpServletRequestWrapper, кажется, нарушает перенаправление - PullRequest
0 голосов
/ 26 января 2011

У меня возникают проблемы с переадресацией сервлетов, когда запрос был упакован HttpServletRequestWrapper.

Это серверное приложение равноденствия, запущенное из Eclipse с использованием встроенного веб-сервера Jetty для обеспечения реализации HttpService.

Чтобы изолировать проблему, единственное, что делает мое поле, - это упаковывает запрос и передает его вперед:

public class TestFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest)request), response);
    }
    ...
}

... и мой сервлет ничего не делает, только пытается перенаправить на JSP:

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    RequestDispatcher dispatcher = request.getRequestDispatcher("/account.jsp");
    try {
        dispatcher.forward(request, response);

    } catch (Exception e) {
        e.printStackTrace();
    }

}

Согласно спецификации сервлета 2.3, объекты запроса и ответа, передаваемые методу forward, могут быть либо исходными, либо экземпляром предоставленных упаковщиков. Мне нужно передать пользовательскую оболочку, но когда я это сделаю, форвард не выполнит следующее исключение:

java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(Unknown Source)
    at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:64)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.eclipse.equinox.http.jetty.internal.HttpServerManager$InternalHttpServiceServlet.service(HttpServerManager.java:318)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:327)
    at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126)
    at org.eclipse.equinox.http.servlet.internal.RequestDispatcherAdaptor.forward(RequestDispatcherAdaptor.java:30)
    at mypackage.internal.signup.PlatformSetupServlet.doPost(PlatformSetupServlet.java:53)
...

Если я заберу обертку и передам исходный запрос, то сервлет успешно выполнится.

Это похоже на ошибку в реализации org.eclipse.equinox.http.servlet, но я могу что-то упустить.

Я что-то не так делаю?

Спасибо !!

Эдуардо Борн

Ответы [ 2 ]

0 голосов
/ 11 апреля 2011

Это должно быть вызвано кодом в методе ProxyServlet.service, передающем -1 для подстроки.Но причина, по которой «forward» нарушает ваш код, заключается в том, что «forward» не создает совершенно новую иерархию оболочек.Вместо этого он находит и заменяет самый внутренний запрос новым переадресованным.

Таким образом, внешняя оболочка не изменяется, и если вы попросите ее, например, вернуть queryString, если у него есть кэшированная строка запроса,он вернет тот же, а не перенаправленный.

У меня проблема с этим, которую я пытаюсь решить.Публикуем здесь снова, если мне это удастся.

См. Этот вопрос, который я только что опубликовал, для лучшего описания того, что я имею в виду: Как узнать, когда запрос перенаправляется в объект RequestWrapper

0 голосов
/ 23 февраля 2011

похоже, что ProxyServlet сталкивается с проблемами при анализе информации запроса.

Найден источник ProxyServlet:

http://kickjava.com/src/org/eclipse/equinox/http/servlet/internal/ProxyServlet.java.htm

Хотя он не совпадает в точности, вы можете увидеть из кода, что он пытается извлечь информацию о пути из вашего запроса - и он не нашел "/", чего он ожидал. Вы можете попробовать изменить путь сервлета, просто чтобы проверить его?

...