Калитка + WAS: вызов URL-адреса вызывает перенаправление на неправильный URL-адрес, вызывая 404

При использовании Websphere Application Server + Wicket 1.6 у меня возникают проблемы с подключенными URL-адресами.

Когда я вызываю URL-адрес, похожий на: localhost:9080/danesCooking/pies/meat, я вижу следующее на вкладке сети Chrome:

localhost:9080/danesCooking/pies/meat status code 302
localhost:9080/danesCooking/meat?2 status code 404

Так что кажется, что часть /pies/ теряется. Это поведение не возникает, когда я развертываю свое приложение на Tomcat\JBoss\... .

Возможно, актуально, пироги сами по себе не являются смонтированной страницей.

Я уже просмотрел некоторые проблемы с калиткой\форумы, и кажется, что большинство проблем либо решены\противоречащие ответы\имеют отношение к относительным URL-адресам (исправлено в 1.5.x).

Кто-нибудь сталкивался с этой проблемой и все еще помнит, как это решить?

Используется WAS *Версии: 7 и 8.5* свобода.


person Kate Danes    schedule 28.05.2013    source источник


Ответы (2)


Эта проблема на самом деле изложена здесь; https://issues.apache.org/jira/browse/WICKET-3258

Мое решение проблемы в Wicket 6.9.1 было таким:

public class MyApplication extends WebApplication {

    @Override
    public Class<? extends WebPage> getHomePage() {
        return MyHomePage.class;
    }

    /* *********************************************** */
    // Resolve Websphere Relative URL "sendRedirect" Bug

    @Override
    protected WebResponse newWebResponse(WebRequest webRequest, HttpServletResponse httpServletResponse) {
        return new FixedServletWebResponse((ServletWebRequest) webRequest, httpServletResponse);
    }

    /**
     * Websphere incorrectly handles relative redirect pages when "HttpServletResponse.sendRedirect(url)" is called.
     * 
     * This small fix ensures that Websphere is only ever provided with absolute URLs so that this issue never occurs.
     */
    private static class FixedServletWebResponse extends ServletWebResponse {
        private final ServletWebRequest webRequest;

        protected FixedServletWebResponse(ServletWebRequest webRequest, HttpServletResponse httpServletResponse) {
            super(webRequest, httpServletResponse);
            this.webRequest = webRequest;
        }

        @Override
        public String encodeRedirectURL(CharSequence url) {
            Url relativeUrl = Url.parse(url);
            return new UrlRenderer(webRequest).renderFullUrl(relativeUrl);
        }
    }

    /* *********************************************** */
}
person Glenn    schedule 29.07.2013

Вы также можете решить эту проблему с помощью анонимного класса, как описано в разделе Настройка и развертывание Open Source с помощью WebSphere. Профиль Application Server Liberty глава 5.2.4. (Протестировано с WLP 8.5.5.3 и Wicket 6.8.0)

Переопределите следующий метод в вашем классе WebApplication:

    @Override
    protected WebResponse newWebResponse(final WebRequest webRequest, final
    HttpServletResponse httpServletResponse)
    {
        return new ServletWebResponse((ServletWebRequest) webRequest,
                httpServletResponse)
        {
            @Override
            public String encodeRedirectURL(final CharSequence relativeURL)
            {
                return new UrlRenderer(webRequest).renderFullUrl(Url.parse(relativeURL));
            }
        };
    }

ОБНОВЛЕНИЕ
Другим решением вместо изменения кода является установка следующего свойства в веб-контейнере (работает в версии 8.5.5.3):

<webContainer com.ibm.ws.webcontainer.redirectwithpathinfo="true" />
person Gas    schedule 02.12.2014