1. 程式人生 > >session監聽防止使用者登入重複

session監聽防止使用者登入重複

思路,主要是實現一些session監聽器的介面,在session中set屬性時,判斷是不是user物件,然後快取下來,userName為key,session物件為value,

然後,每次登入的時候去這個快取中查詢是否有這個使用者,取出來的session為空則沒有,取出來有值,則改使用者已登入過了,

後面就是自己的邏輯了。

有2種

1,後登陸的擠掉先登入的,就是把查出來的老的session關閉掉,然後把使用者儲存到session,內部把現在的使用者和其對應的session作為鍵值對都快取起來。

2,後登陸的登不上,先登入的一直保持,這個就是登入時查詢快取的使用者集合,如果已經有這個使用者了,就不讓他登入。。

然後要做的就是,session關閉,失效,超時,瀏覽器關閉(web程式),使用者退出等時候要去把快取的中對應的user-session鍵值對清除,不然,如果採用第二種方案的話就可能造成使用者登不上,因為快取中還有這個使用者。

在這個基礎上要實現踢人或者統計線上使用者就很簡單了,直接取快取使用者的map的長度,或者從快取使用者的map中查找出session,讓session失效。。

1,監聽器類

package cn.hydom.ztc.ztc_app.controller.listener;

import java.util.HashMap;
import
java.util.Map; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import org.apache.commons.logging.Log; import
org.apache.commons.logging.LogFactory; import cn.hydom.ztc.ztc_dao.entity.User; / * @Description: session監聽器 使用者唯一登入,後登陸擠掉先登入的 * @author whl * @date 2014-10-21 */ public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener { // log4j private final static Log log = LogFactory.getLog(SessionListener.class); // 儲存當前登入的所有使用者 public static Map<String, HttpSession> loginUser = new HashMap<String, HttpSession>(); // 用這個作為session中的key public static String SESSION_LOGIN_NAME = "user"; // 執行setAttribute的時候, 當這個屬性本來不存在於Session中時, 呼叫這個方法. @Override public void attributeAdded(HttpSessionBindingEvent se) { // 如果新增的屬性是使用者名稱, 則加入map中 if (se.getName().equals(SESSION_LOGIN_NAME)) { User u = (User) se.getValue(); HttpSession session = loginUser.remove(u.getUserName()); if (session != null) { session.removeAttribute("user"); } loginUser.put(u.getUserName(), se.getSession()); } } // 當執行removeAttribute時呼叫的方法 @Override public void attributeRemoved(HttpSessionBindingEvent se) { // 如果移除的屬性是使用者名稱, 則從map中移除 if (se.getName().equals(SESSION_LOGIN_NAME)) { try { User u = (User) se.getSession().getAttribute("user"); loginUser.remove(u.getUserName()); } catch (Exception e) { log.debug(e); } } } // 當執行setAttribute時 ,如果這個屬性已經存在, 覆蓋屬性的時候, 呼叫這個方法 @Override public void attributeReplaced(HttpSessionBindingEvent se) { // 如果改變的屬性是使用者名稱, 則跟著改變map if (se.getName().equals(SESSION_LOGIN_NAME)) { User u = (User) se.getValue(); HttpSession session = loginUser.remove(u.getUserName()); /*if (session != null) { session.removeAttribute("user"); }*/ loginUser.put(u.getUserName(), se.getSession()); } } // session建立時呼叫這個方法 @Override public void sessionCreated(HttpSessionEvent se) { log.debug("SessionListener........session建立-----" + se.getSession().getId()); } // Session失效或者過期的時候呼叫的這個方法, @Override public void sessionDestroyed(HttpSessionEvent se) { // 如果session超時, 則從map中移除這個使用者 try { User u = (User) se.getSession().getAttribute("user"); loginUser.remove(u.getUserName()); } catch (Exception e) { log.debug(e); } } //寫一個判斷使用者是否已經登陸的方法 public boolean isLogonUser(Long userId) { Set<HttpSession> keys = SessionListener.loginUser.keySet(); for (HttpSession key : keys) { if (SessionListener.loginUser.get(key).equals(userId)) { return true; } } return false; } }

2,web.xml中配置監聽器類

    <listener>
        <listener-class>監聽器(類)的完全限定名</listener-class>
    </listener>

3,使用者登入時的邏輯判斷

//根據使用者名稱查詢,判斷是否為空,實現自己的邏輯,擠掉還是不允許登入

Map<String, HttpSession> loginUser = SessionListener.loginUser;

相關推薦

session防止使用者登入重複

思路,主要是實現一些session監聽器的介面,在session中set屬性時,判斷是不是user物件,然後快取下來,userName為key,session物件為value, 然後,每次登入的時候去這個快取中查詢是否有這個使用者,取出來的ses

session實現唯一登入及普通類呼叫Service層的方法的實現思路

最近在寫專案的時候遇到一個問題:如何實現使用者唯一登入?一開始的想法是給t_user表新增一個欄位login_status(登入狀態),使用者登入前去查詢t_user的login_status的值,login_status為未登入狀態,則可以進行登入;否則,不能

使用session禁止使用者重複登入

          在web應用中,常常需要禁止使用者重複登入。這裡,介紹的方法是通過配置session監聽+shiro許可權控制框架實現。具體的方法是: 使用者登入成功後,將使用者資訊放入HashMap中,如果存在重複,強制登出之前的session,使之過期。      

Session線上統計人數,簡單的單點登入

import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import jav

springboot session

配置 package com.***.config; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.co

session案例:防止表單重複提交、一次性校驗碼

session案例1:防止表單重複提交 原理: 1,表單頁面由servlet程式生成,servlet為每次產生的表單頁面分配一個唯一的隨機標識號,並在FORM表單的一個隱藏欄位中設定這個標識號,同時在當前使用者的Session域中儲存這個標識號。 2,當用戶提交FOR

Session統計網站的線上人數HashSet

import java.util.ArrayList; import java.util.HashSet; import java.util.List; import javax.servlet.S

shiro session

spring 使用 shiro 後,由於shiro重新封裝了原有的session,所以不能再使用原來的session監聽方法了 (1)在shiro配額只檔案中設定監聽類 <!-- shiroS

java web session銷燬跳轉

1.瞭解如何使用HttpSessionListener監聽session的銷燬。2.瞭解如何使用HttpSessionBindingListener監聽session的銷燬。一. 使用HttpSessionListener編寫一個OnlineUserListener。pac

關於session瀏覽器關閉伺服器執行destory的證實

session監聽初次訪問的時候會生成session放在cookie裡 瀏覽器關閉 伺服器延遲執行destory tomcat8+spring4 public class SessionHelpListen implements HttpSessionListener

Session

1、監聽類: package com.bigdatalearning.utils; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpSession; impor

Spring之事件(觀察模型)

respond reg nal @override ace sin 繼承 abstract http 目錄 Spring事件監聽 一、事件監聽案例 1.事件類 2.事件監聽

觀察模式實際應用:線程,意外退出線程後自動重啟

lee text 實時 之間 最終 ren tap instance and 摘要:  觀察者模式,定義對象之間的一種一對多的依賴關系,當對象的狀態發生改變時,所有依賴於它的對象都得到通知並且被自動更新。觀察者模式在JDK中有現成的實現,java.util.Obsera

Spring session 失效方法

con eve spring註解 無法 nco clas textutils creat 監聽器 public class SessionCounter implements HttpSessionListener { private static int activ

內容觀察實現短信

view next() png ces alt 方法 dex pri cti 內容觀察者實現短信監聽 通過內容觀察者監聽短信是否發生變化,如果發生變化,就用內容提供者讀取短信的內容。 原理: 當短信發生變化(比如說來短信),短信應用就會通知內容觀察者我的短信發生了變化,並把

Java事件機制與觀察設計模式

idea demo1 script 操作 alt face ner over 方法 一. Java事件監聽機制 1. 事件監聽三要素: 事件源,事件對象,事件監聽器 2. 三要素之間的關系:事件源註冊事件監聽器後,當事件源上發生某個動作時,事件源就會調用事件監聽的一個方法,

利用session防止表單重複提交

使用者在提交表單的過程中,由於網路等原因,可能重複點選提交按鈕,向資料庫重複寫入或者讀取資料,為了防止這種情況發生。   解決方式: 1.客戶端防表單重複提交,在前端使用javascript限制。但是在前端並不能完全限制,比如下網頁原始碼更改,重複重新整理等。 2.服務端防

觀察模式下es6的實現(自定義可事件)

定義 觀察者模式:又叫釋出訂閱模式,多個觀察者可以實時監聽一個主題物件,而javascript中最常用的實現方式是事件觸發機制。 es6實現: 要知道需要有什麼東西,類和建構函式是es6中基本的物件結構 class BaseEvent {   constructor() {} } 首先類中要能儲

java設計模式(java觀察設計模式)

今天給大家分享一下觀察者設計模式(監聽設計模式),該模式在很多主流得框架、原始碼中使用率非常高。在分享之前先給大家講一個我們使用手機的一個場景,我們都用過手機,當我們手機來電話的時候,會有各種複雜的操作,比如會響鈴、手機震動、螢幕會亮屏等等,大家有沒有考慮過這個場景是怎麼實現的呢?其實這個地方就是使

觀察模式和事件模式的區別

監聽機制 其他 不包含 機制 監聽 多態 場景 觀察者模式 特定 事件監聽模式更像是觀察者模式的進階。 觀察者模式中,‘主題’會在特定邏輯下通知所有‘觀察者’。如果這個通知不包含任何信息,那麽這種實現就是通常的觀察者模式。 如果‘主題’通知‘觀察者’的過程帶有一些<其