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觀察者設計模式)
今天給大家分享一下觀察者設計模式(監聽設計模式),該模式在很多主流得框架、原始碼中使用率非常高。在分享之前先給大家講一個我們使用手機的一個場景,我們都用過手機,當我們手機來電話的時候,會有各種複雜的操作,比如會響鈴、手機震動、螢幕會亮屏等等,大家有沒有考慮過這個場景是怎麼實現的呢?其實這個地方就是使
觀察者模式和事件監聽模式的區別
監聽機制 其他 不包含 機制 監聽 多態 場景 觀察者模式 特定 事件監聽模式更像是觀察者模式的進階。 觀察者模式中,‘主題’會在特定邏輯下通知所有‘觀察者’。如果這個通知不包含任何信息,那麽這種實現就是通常的觀察者模式。 如果‘主題’通知‘觀察者’的過程帶有一些<其