Как перехватить пользовательское значение заголовка HTTP и сохранить его в Wicket WebSession?

Мне нужно получить определенное пользовательское значение заголовка HTTP из каждого запроса и поместить его в WebSession, чтобы позже оно было доступно на любой веб-странице. (Я считаю, что способ Wicket сделать это состоит в том, чтобы иметь собственный класс, расширяющий WebSession, который имеет соответствующие методы доступа.)

У меня вопрос: какой фильтр (или другой механизм) мне нужен, чтобы иметь возможность как перехватывать заголовок, так и получать доступ к WebSession для сохранения значения?

Я попытался сделать это с помощью обычного фильтра Java EE, используя

CustomSession session = (CustomSession) AuthenticatedWebSession.get();

Но (возможно, неудивительно), это дает:

java.lang.IllegalStateException: 
    you can only locate or create sessions in the context of a request cycle

Должен ли я, возможно, расширить WicketFilter и сделать это там (могу ли я получить доступ к сеансу в этот момент?), или требуется что-то еще более сложное?

Конечно, пожалуйста, укажите на это, если я делаю что-то совершенно неправильно; Я новичок в Уикете.


person Jonik    schedule 12.10.2010    source источник


Ответы (1)


Я предполагаю, что вам нужно реализовать собственный WebRequestCycle:

public class CustomRequestCycle extends WebRequestCycle{

    public CustomRequestCycle(WebApplication application,
        WebRequest request,
        Response response){
        super(application, request, response);
        String headerValue = request.getHttpServletRequest().getHeader("foo");
        ((MyCustomSession)Session.get()).setFoo(headerValue);
    }

}

И в своем классе WebApplication вы регистрируете собственный RequestCycle следующим образом:

public class MyApp extends WebApplication{

    @Override
    public RequestCycle newRequestCycle(Request request, Response response){
        return new CustomRequestCycle(this, (WebRequest) request, response);
    }

}

Ссылка:

person Sean Patrick Floyd    schedule 12.10.2010
comment
Спасибо, у меня получилось с этим подходом! (Мне потребовалось некоторое время, чтобы проверить это с помощью Tamper Data...) Использование пользовательского WebRequestCycle на самом деле довольно просто и понятно, ничего сложного, как я думал. - person Jonik; 12.10.2010
comment
У калитки есть простое решение для большинства проблем, и это хорошо. - person Sean Patrick Floyd; 12.10.2010