2016-01-25 9 views
0

В моем приложении у меня есть обработчик сеанса, который хранит все подключенные сеансы, когда они соединяются и удаляют их, если они правильно отсоединяются. Если они этого не сделают, я продолжаю сеансы, и если они снова подключатся, я заменяю старый сеанс новым. (Приведенный ниже код, кажется глупым, но это только, чтобы сделать мою точку)Проверка соединения с веб-сервером Java, если тот же пользователь повторно подключается

@ServerEndpoint(value = "/games") 
public class GameEndPoint { 

    @Inject 
    private GameSessionHandler sessionHandler; 

    @OnOpen 
    public void open(Session session) { 
     sessionHandler.addSession(session); 
    } 

    @OnClose 
    public void close(Session session, CloseReason closeReason) { 
     sessionHandler.sessionClosed(session, closeReason.getCloseCode()); 
    } 

    @OnError 
    public void onError(Throwable error) { 
     LOGGER.log(Level.SEVERE, "Socket connection error", error); 
    } 

    @OnMessage 
    public String handleMessage(String payload, Session session) { 
     return payload; 
    } 
} 

@Singleton 
public class GameSessionHandler implements Serializable { 

    private final Set<Session> sessions = new HashSet<>(); 

    public void addSession(Session session) { 
     for(Session existing: sessions) { 
      if(existing.equals(session)) {//DOES NOT WORK 
       //client reconnected! 
       sessions.remove(existing); 
       break; 
      } 
     } 
     sessions.add(session); 
    } 

    public void removeSession(Session session) { 
     if (CloseReason.CloseCodes.NORMAL_CLOSURE.equals(reason)) { 
      sessions.remove(session) 
     } 
    } 
} 

Проблема: как я могу проверить, что сеанс для клиента, который был подключен раньше, так что я могу заменить сессию с новым открытым?

Редактировать: Это необходимо, потому что мой клиент является приложением html5, где пользователь может обновлять/перемещаться по странице, а затем соединение теряется. Всякий раз, когда он пытается снова подключиться, я хочу знать, в какую игру он играл. Если пользователь находится на неустойчивом соединении (то есть на мобильном телефоне), время от времени будет потеряно соединение.

ответ

0

Я не могу сделать достаточно прочную проверку для этого, так что он отправил уникальную строку (uuid) клиенту при подключении. Если клиент подключается к параметру запроса, давая свой старый uuid, я использую его, чтобы выяснить, кто он. Я просто доверяю клиенту быть тем, кем он себя говорит, и так или иначе он может подключиться только к этому uuid, если старая сессия с этим uuid отключилась.

Я вообще не рассматривал безопасность, и если бы у меня был, я должен был бы использовать что-то вроде обмена ключами hellie hellman, поэтому единственными сторонами, которые знают общий uuid, является сервер и клиент.

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

  • Нет связанных вопросов^_^