Как аннулировать сеанс CXF Interceptor?

Я новичок в веб-сервисе Cxf и немного перегружен предоставленной информацией. Я написал cxf Interceptor (cxf: outInterceptors), который расширяет AbstractPhaseInterceptor. Я пытаюсь сделать недействительным текущий сеанс после выполнения службы. Мои проблемы:

  • Я использую правильную фазу в конструкторе? (Phase.Send)
  • Как получить информацию о сеансе из сообщения? Прямо сейчас, для экземпляра запроса метода экземпляра возвращается значение null.

Или Есть ли лучший подход к этому?

public ServiceSessionInvalidator() {
 super(Phase.SEND);
 }
@Override
public void handleMessage(Message message) throws Fault {
 System.out.println("Hitting Handler");
 HttpSession session;
 HttpServletRequest req = (HttpServletRequest)message.get(AbstractHTTPDestination.HTTP_REQUEST);
 session = (req != null)? req.getSession(): null;
 if(req == null ){
 System.out.println("Request is Null");
 }
}

Вывод:

16 Jun 2015 13:35:40 INFO - Inbound Message
----------------------------
ID: 1
Address: http://localhost:8090/services/VariableService/variableService/
Http-Method: GET
---
---
Hitting Handler
Request is Null
16 Jun 2015 13:35:41 INFO - Outbound Message
---------------------------
ID: 1
Response-Code: 200
2 ответа

Я не уверен в этом, но посмотрите описание фазы CXF, например здесь. Send - это последняя фаза, после обработки сообщения на уровне "протокол" и "байт". Концепция сеанса связана с протоколом HTTP, то же самое верно для запроса (см. Имена классов).

Мое предложение: попробуйте Phase.MARSHAL.


@Resource
WebServiceContext wsContext;
@Context
private HttpServletRequest request;
 private HttpServletRequest invalidateSession() {
 MessageContext mc = wsContext.getMessageContext();
 HttpServletRequest req;
 if (mc != null) {
 req = (HttpServletRequest) mc.get(MessageContext.SERVLET_REQUEST);
 } else {
 req = request;
 }
 req.getSession().invalidate();
}

licensed under cc by-sa 3.0 with attribution.