Как установить настраиваемый заголовок ответа HTTP в ответах Ajax Wicket? - PullRequest
2 голосов
/ 09 декабря 2010

Мне нужно установить собственный HTTP-заголовок для всех ответов из моего приложения Wicket. В настоящее время я делаю это в пользовательском RequestCycle, где getWebResponse () переопределяется следующим образом:

@Override
public WebResponse getWebResponse() {
    WebResponse response = super.getWebResponse();
    response.setHeader("X-custom", "..." );
    return response;
}

Это прекрасно работало, до сих пор я перешел на использование AjaxCheckBox ( что-то вроде этого ) вместо обычного CheckBox для определенных параметров конфигурации.

У меня вопрос: есть ли простой способ включить мой пользовательский заголовок также в ответы Ajax Wicket ?

Ответы [ 3 ]

3 голосов
/ 10 декабря 2010

Я нашел способ. В конце концов, это было совсем не сложно. При выполнении некоторых запросов с помощью моего отладчика я заметил, что onEndRequest() действительно вызывается для запросов Ajax .

Метод onEndRequest() уже был переопределен в нашей пользовательской реализации RequestCycle для других целей (фиксация транзакции), поэтому я просто переместил код, который устанавливает заголовок, из getWebResponse().

@Override
protected void onEndRequest() {
    super.onEndRequest();
    ((WebResponse) response).setHeader("X-custom", "..." );
    // ...
}

Возможно, единственной неочевидной вещью здесь было то, что мне нужно было преобразовать response в WebResponse (когда тип поля Response ), чтобы иметь возможность вызвать setHeader() .

Это можно было бы сделать и в обычном фильтре Java EE , установив заголовок после вызова chain.doFilter() (см. Мой второй комментарий по этому вопросу). Я не выбрал это, потому что 1) мне было непонятно, как подключить туда доступ к данным и 2) я не хочу дополнительных движущихся частей, если я могу избежать этого. Мы уже используем наш подкласс RequestCycle для вещей, связанных с заголовками HTTP, и это хорошо вписывается. Фактически, это изменение упростило этот класс, так как больше нет причин переопределять getWebResponse()!

1 голос
/ 09 декабря 2010

Под капотом Wicket по-прежнему использует стандартный стек Java HTML.Поэтому вместо переопределения существующих методов, просто внедрите Filter и зарегистрируйте его в своем web.xml.При правильном шаблоне URL он будет применяться ко всем запросам, независимо от того, кто их обрабатывает.

0 голосов
/ 09 декабря 2010

Рассматривая реализацию AjaxRequestTarget

[...]

/**
 * @see org.apache.wicket.IRequestTarget#respond(org.apache.wicket.RequestCycle)
 */
public final void respond(final RequestCycle requestCycle)
{
    final WebResponse response = (WebResponse)requestCycle.getResponse();

    if (markupIdToComponent.values().contains(page))

[...]

решение Wicket было бы переопределить RequestCycle.getResponse ().

...