2013-08-07 5 views
0

У меня есть страница, на которую могут обращаться учетные записи с разрешениями альфа. JSP проверяет сеанс для атрибута с именем "AlphaPerm".Как удаленно аннулировать сеанс сервлетов пользователя на лету?

Но проблема, с которой я борюсь, заключается в том, что если я нахожу, что пользователь возится/злоупотребляет разрешениями альфа-тестирования, я хочу немедленно его остановить. Я могу изменить свои права доступа в своей базе данных сразу, но это не остановит злоумышленника сразу.

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

Как я могу убить его сеанс «на лету» (создание страницы администратора - это мой план, но как мне получить объект сеанса пользователя)? В основном я хочу создать страницу администратора, чтобы я мог использовать BAN для пользователя.

+0

Как вы проверить, является ли пользователь ' messing' с альфа-пэмиссией? –

+0

@DigvijayYadav на всякий случай, если один из моих альфа-тестеров сходит с ума ...... –

+0

Подождите, вы могли бы пропустить поняли мой вопрос. Я хочу аннулировать его сессию. это все, что я хочу сделать, возможно, на странице администратора. –

ответ

2

Вы можете хранить ссылки на сеансы пользователя, используя HttpSessionListener. This example показывает, как реализовать счетчик сеансов, но вы также можете хранить ссылки на отдельные сеансы, сохраняя их в коллекции с ограниченным контекстом. Затем вы можете получить доступ к сеансам со своей страницы администратора, проверить их атрибуты и аннулировать некоторые из них. This post может также иметь полезную информацию.

Редактировать: Вот пример реализации (не проверено):

public class MySessionListener implements HttpSessionListener { 

    static public Map<String, HttpSession> getSessionMap(ServletContext appContext) { 
     Map<String, HttpSession> sessionMap = (Map<String, HttpSession>) appContext.getAttribute("globalSessionMap"); 
     if (sessionMap == null) { 
      sessionMap = new ConcurrentHashMap<String, HttpSession>(); 
      appContext.setAttribute("globalSessionMap", sessionMap); 
     } 
     return sessionMap; 
    } 

    @Override 
    public void sessionCreated(HttpSessionEvent event) { 
     Map<String, HttpSession> sessionMap = getSessionMap(event.getSession().getServletContext()); 
     sessionMap.put(event.getSession().getId(), event.getSession()); 
    } 

    @Override 
    public void sessionDestroyed(HttpSessionEvent event) { 
     Map<String, HttpSession> sessionMap = getSessionMap(event.getSession().getServletContext()); 
     sessionMap.remove(event.getSession().getId()); 
    } 
} 

Вы можете получить доступ к карте сеанса из любого сервлета:

Collection<HttpSession> sessions = MySessionListener.getSessionMap(getServletContext()).values(); 
+0

Это интересно и, кажется, идет правильным путем, но я немного тупой, и я не могу понять, как они это делают. Я надеялся на что-то вроде этого: tomcatServletStuff.getSessionByID (somGuyzID), и этот метод вернет объект Session –

+0

Отредактировал мой ответ, чтобы включить примерную реализацию. –

+0

Любая идея, почему мой воображаемый метод не существует? –

0

Насколько я понимаю, ваш вопрос проверки на DB определенно плохая вещь.

Также вы должны сравнивать некоторые значения с некоторыми другими стандартными значениями, чтобы решить, запутан ли пользователь. Итак, чередуя проверку БД, вы можете сохранить эти значения в сеансе пользователя и проверить эти значения.

Также вместо создания страницы администратора (возможно, страницы JSP) я бы предложил использовать ServletFilter для выполнения этой работы.

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

+0

Итак, как мне сразу его остановить? –

+0

Так, например, используя фильтр, вы можете проверить, был ли пользователь ограничен или нет. Если да, вы можете переслать свой запрос (для страниц, с которыми он возится) на какую-то страницу с ошибкой, рассказывающую ему, что он/она сделал не так, и почему его ограничивают. –

+0

Нужно ли фильтру проверять мою базу данных? Я не уверен, как работают фильтры. –

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