2013-07-29 3 views
0

Для некоторого фона я использую JBoss AS 7 с EJB. Я отправляю сообщение на свой сервер от клиента, используя шину сообщений errai, когда он изначально подключается, чтобы получить идентификатор сеанса, чтобы я мог позже отправлять запросы от него и отвечать на конкретный клиент.Попытка восстановить объект HttpSession

Как мне это сделать? Могу ли я каким-то образом добавить сторону сервера объектов HttpSession? Я очень новичок в этом, поэтому, пожалуйста, несите меня. Если я слишком расплывчатый, дайте мне знать, и я попытаюсь подробнее остановиться.

+0

** Никогда ** не смешивайте компоненты Http с компонентами EJB, обратите внимание, что EJB должен содержать только бизнес-логику и, с точки зрения шаблона MVC, HttpSession является частью контроллера (поскольку вы получаете к нему доступ через сервлеты или другой контроллер), в то время как EJB является частью Модели. Вместо того, чтобы вводить «HttpSession» в свой EJB, передайте нужные значения в свой EJB как параметры. –

+0

@LuiggiMendoza Я не уверен, как это сделать. Когда сервлет запускается, я могу получить запрос HttpSession каким-то образом, а затем получить идентификатор оттуда? Могу ли я указать некоторые методы где-нибудь, что позволит мне делать то, что вы только что упомянули? – Graham

+0

Вы можете получить доступ к 'HttpSession' по каждому запросу, выполнив' HttpSession session = request.getSession (false) ', а затем вы можете использовать' session.getId' для получения текущего jsessionid, связанного с 'HttpSession'. Похоже, было бы лучше, если бы вы объяснили свое функциональное требование, чтобы помочь вам решить настоящую проблему. –

ответ

0

Если вы отправляете сообщение в сервисный метод ErraiBus, у вас будет доступный объект Message. Вы можете получить сеанс от него и получить идентификатор этой сессии как это:

@Service 
public class ClientHelloService implements MessageCallback { 
    @Override 
    public void callback(final Message message) { 
    HttpSession session = message.getResource(
     HttpServletRequest.class, HttpServletRequest.class.getName()).getSession(); 
    System.out.println("Client said hello. Session ID: " + session.getId()); 
    } 
} 

Если вы вместо того, чтобы отправить сообщение в конечную точку Errai RPC, вы не будете иметь такой легкий доступ к сообщению. В этом случае вам придется использовать RpcContext.getSession() метод:

@Service 
public class ClientHelloRpcServiceImpl implements ClientHelloRpcService { 
    @Override 
    public void hello() { 
    HttpSession session = RpcContext.getHttpSession(); 
    System.out.println("Client said hello. Session ID: " + session.getId()); 
    } 
} 

Как это работает очень просто, но некрасиво: RpcContext класс сохраняет объект Message, который содержал запрос RPC в ThreadLocal, и он просто извлекает HttpSession От этого.

0
// the following variable is in the Http servlet service() method arguments 
// only shown here this way to demonstrate the process 
javax.servlet.http.HttpServletRequest serviceRequest; 
javax.servlet.http.HttpServletResponse serviceResp; // addCookie() 
javax.servlet.http.HttpSession cecil; 
javax.servlet.http.Cookie[] reqCk; 


// "(boolean overload) "true" creates the session" or call the other overload version method with no argument 
// to retrieve the session getSession() "the server container stores and creates sessions" 
// false in that version is to avoid bothering for a session to cut down uneeded processing 


cecil = serviceRequest.getSession();//creates a session if it does not have one 


String httpSession_ID = cecil.getID(); 


if((reqCk = serviceRequest.getCookies()) == null){ 

// perhaps create a cookie here using "new class " 
// cookiePiece = new javax.servlet.http.Cookie("COOKIENAME",....); ....YOU MUST LEARN THE COOKIE PARTS WRITING RULES FOR BROWSER COOKIES !!! ; ; ; 
serviceResp.addCookie(cookiePiece); // now is on the servers array "reqCk" 

}else{ 

// process the cookie here using javax.servlet.http.Cookie methods 

} 

Другие способы хранения и извлечения данных являются сессии областью действия JSP или JSF бобы.

Смежные вопросы