1. 程式人生 > >用HandlerInterceptor實現登陸狀態確定

用HandlerInterceptor實現登陸狀態確定

主要目的是:

確定是使用者是否登陸,通過每次請求檢測ticket時候存在來實現。

基本原理:註冊攔截器+實現攔截器+設定執行緒副本變數

一、註冊攔截器:extends WebMvcConfigurerAdapter

@Component
public class WendaWebConfiguration extends WebMvcConfigurerAdapter {
@Autowired
PassportInterceptor passportInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(passportInterceptor);    
    super.addInterceptors(registry);
    }
}

二、實現攔截器:implements HandlerInterceptor

1、配置自己的Interceptor並實現HandlerInterceptor中三個方法。preHandler:指的是請求之前,主要是可以做獲取請求引數如cookie,並由此獲取cookie中的內容ticket,–》得到loginticket –》得到userId–》得到user的引數。

並把該讀取的物件設定到ThreadLocal中,實現併發訪問。hostholder.set();

2、postHandler:指的是請求之後返回了modelAndView即將用此modelAndView渲染之前,這時候可以在model中加入自己引數 model.addObject(“user”,hostHolder.get(user));

3、afterCompletion:請求完成之後清楚ThreadLocal中的執行緒區域性變數:hostHolder.clean()

@Component
public class PassportInterceptor implements HandlerInterceptor {

@Autowired
private LoginTicketDao loginTicketDAO;

@Autowired
private UserDao userDAO;

@Autowired
private HostHolder hostHolder;


@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
    String ticket = null;
    if (httpServletRequest.getCookies() != null) {
        for (Cookie cookie : httpServletRequest.getCookies()) {
            if (cookie.getName().equals("ticket")) {
                ticket = cookie.getValue();
                break;
            }
        }
    }

    if (ticket != null) {
        LoginTicket loginTicket = loginTicketDAO.selectByTicket(ticket);
        if (loginTicket == null || loginTicket.getExpired().before(new Date()) || loginTicket.getStatus() != 0) {
            return true;
        }

        User user = userDAO.selectById(loginTicket.getUserId());
        hostHolder.setUser(user);
    }
    return true;
}

@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    if (modelAndView != null && hostHolder.getUser() != null) {
        modelAndView.addObject("user", hostHolder.getUser());
        System.out.println("passposrt setting user"+hostHolder.getUser());
    }
}

@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        hostHolder.clear();
    }
}

三、設定執行緒副本變數:implements HandlerInterceptor

@Component
public class HostHolder {
private static ThreadLocal<User> users = new ThreadLocal<User>();

public User getUser() {
    return users.get();
}

public void setUser(User user) {
    users.set(user);
}

public void clear() {
    users.remove();
}
}

相關推薦

HandlerInterceptor實現登陸狀態確定

主要目的是: 確定是使用者是否登陸,通過每次請求檢測ticket時候存在來實現。 基本原理:註冊攔截器+實現攔截器+設定執行緒副本變數 一、註冊攔截器:extends WebMvcConfigurerAdapter @Component public

nagios實現伺服器狀態監控

前言   Nagios是一款開源的電腦系統和網路監視工具,能有效監控Windows、Linux和Unix的主機狀態,交換機路由器等網路設定,印表機等。在系統或服務狀態異常時發出郵件或簡訊報警第一時間通

java實現一個簡單的單登陸功能的思路

get 單用戶 這樣的 簡單的 lock ref 數據庫 清除 一個 引用 所謂“單用戶單賬戶登錄”是指:在同一系統中,一個用戶名不能在兩個地方同時登錄。 我們參照 QQ 實現效果:當某賬號在 A 處登錄後,在未退出的情況下,如果再到 B 處登錄,那麽,系統會擠下 A 處

laravel5.4 關於執行刪除管理員時候被刪戶如果當時是登陸狀態還可以操作的處理

關於執行刪除管理員時候被刪用戶如果當時是登陸狀態還可以操作的處理測試中發現,超級管理把普通管理或者超級管理刪除了之後,如果被刪除用戶正在登陸狀態,那麽他還可以進行操作。。那麽這樣的問題就不能在上線發生!laravel框架 自帶的中間件操作就可以處理這樣的事情發生! 我們可以在執行刪除的時候在中間件中做對應的判

AJAX實現“防止未登陸人員訪問指定頁面”的功能

dir ive 重定向 oca 憑據 cookies resp 跳轉 nload 為了保護科協官網不被未登錄的同學訪問,用ajax進行判斷和跳轉 小知識:用ajax訪問的servlet的任何跳轉都是無效的,所以跳轉只能在js代碼中進行 以下是servlet代碼 p

使用python檢測登陸狀態

pythonwin32ts.WTSRegisterSessionNotification監控計算機狀態改變https://msdn.microsoft.com/en-us/library/aa383841(v=vs.85).aspx 用戶狀態改變後,執行函數myststa(event),其中event代表用戶

cookie實現記得狀態登陸

cookie是儲存在瀏覽器的一段小資訊,基本物件是url 可以僅僅在前端js處實現保留登入狀態 核心程式碼 /** * cookie操作基本函式 * cookie的key-value使用"cphone"="xxxx" * * @author chgl16 * @da

Cookie實現使用者免密登陸

1.導jar包 pom.xml <properties> <!-- spring 版本號 --> <spring.version>4.3.8.RELEASE</spring.version> </properties>

ThinkPHP5.0Session和Cookie實現登陸/記住登陸/防止重複登陸/防止未登陸的非法操作

1.程式碼基於ThinkPHP5.0框架; 前端AJAX程式碼   後臺登陸驗證 後臺所有非登陸操作都繼承Base類 ,重寫Base類的_initialize()初始化方法 判斷Cookie中的 PHPSESSID是否存在,存在表示已經登陸

PHP實現同一個帳號不允許同時登陸,只允許一個帳號登入?

  資料庫表user_login_info   欄位:id,user_ip,user_id,last_access_time   user_id做唯一性索引   1.使用者登入後   如果沒有當前使用者的資料,插入一條資料,user_ip(使用者機器的I

使用者登入記住密碼功能(記住登陸狀態),下次不需要重新登入,注意安全問題!實現原理

做網站的時候經常會碰到要實現記住密碼,下次自動登入,一週內免登陸,一個月內免登陸這種需求。這種功能一般都是通過cookie來實現的。 本篇文章將簡單說一下如何使用php實現該需求的。當然實現該需求的方

javaWeb專案過濾器filter實現登陸成功後才能訪問主頁面,否則直接輸入主頁面的地址自動跳轉到登陸介面

想用Filter實現一個登陸驗證的功能,實現登陸成功後才能訪問主頁面,否則直接輸入主頁面的地址會自動跳轉到登陸介面 原理很簡單,每次登陸成功後,建立一個session域物件,將登陸成功的使用者名稱儲存在session中,過濾器要做的就是在每一次跳轉到jsp頁

AJAX實現頁面登陸以及註冊使用者名稱驗證

       AJAX即“Asynchronous Javascript And XML”(非同步JavaScript和XML),是指一種建立互動式網頁應用的網頁開發技術。        AJAX

Drawable 實現Android UI 元素間距效果

purple 固定 展示 .com otto 技巧 log contain dev 源文地址: 巧用Drawable 實現Android UI 元素間距效果 在大部分的移動UI或者Web UI都是基於網格概念而設計的。這種網格一般都是有一些對其的方塊組成,然後

JS調命令實現F11全屏

return ima logs key f11全屏 嘗試 ges div 500px <body onload =‘autoSetFull()‘> <button id=‘btn‘>全屏按鈕</button> <div

C++實現約瑟夫環的問題

content 人在 -h tel padding next family bsp sun 約瑟夫問題是個有名的問題:N個人圍成一圈。從第一個開始報數,第M個將被殺掉,最後剩下一個,其余人都將被殺掉。比如N=6,M=5。被殺掉的人的序號為5,4,6。2。3。最後剩下1

Android調相機實現拍照並裁剪圖片,調手機中的相冊圖片並裁剪圖片

!= findview create 圖片剪裁 顯示 parent 學會 true mfile 在 Android應用中,非常多時候我們須要實現上傳圖片,或者直接調用手機上的拍照功能拍照處理然後直接顯示並上傳功能,以下將講述調用相機拍照處理圖片然後顯示和調用手機相冊中的

init.rc文件中面啟動c++程序,通過jni調java實現

mini val sni ril urn runtime sport mco env </pre><p>註:假設是自己的myself.jar包,還要修改例如以下:</p><p>target/product/core_bas

C# tabcontrol實現窗體類似網頁排版的顯示

code star tar 做的 ide 切換 drop rri all 這裏做的比較簡陋,可以美化下 吧form設置位非頂級控件,直接放在tabcontro裏邊,然後實現tabcontrol的拖拽移除tabpage顯示form以及添加tabpage mousemove的觸

NIO實現http協議

his 開發 非阻塞 etl 必須 操作 nts blocking this 先來看一下本篇博文的目錄: 一:簡介Nio 二:Nio的好處 三:關於http協議 四:代碼實現 五:總結 一:簡介Nio 我們都知道io流,那麽NIO是什麽呢?本篇博文將會帶你一探NIO,NIO