實現一個登錄攔截器,重寫doFilter方法,判斷用戶的登錄狀態,在用戶長時間未操作或者異地登錄時前端進行提示,完整代碼如下
1 public class LoginValidateFilter implements Filter { 2 3 private String errorMessage; 4 private Logger log = LoggerFactory.getLogger(this.getClass()); 5 6 @Override 7 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, 8 FilterChain chain) throws IOException, ServletException { 9 try { 10 HttpServletRequest request = (HttpServletRequest) servletRequest; 11 HttpServletResponse response = (HttpServletResponse) servletResponse; 12 13 String url = request.getRequestURI(); 14 if (isResourceRequest(url) 15 || isNotLoginValidate(url, request)) { 16 chain.doFilter(servletRequest, servletResponse); 17 return; 18 } 19 //判斷用戶是否在登錄狀態 20 if (isLogin(request, response)) { 21 //更新session時間:心跳檢測的請求不更新 22 if (url.indexOf("/manage/session/isAlive.do") < 0) { 23 SessionUtil.updateSession(request); 24 } 25 chain.doFilter(servletRequest, servletResponse); 26 } else { 27 SessionUtil.removeSession(request); 28 String path = request.getContextPath(); 29 response.setContentType("text/html"); 30 // String responsePage = ""; 32 33 String responsePage = ""; 34 response.getWriter().print(responsePage); 35 } 36 } catch (Exception e) { 37 log.error("登錄過濾器異常:{}", e); 38 throw new ServletException(e); 39 } 40 } 41 42 private boolean isLogin(HttpServletRequest request, HttpServletResponse response) { 43 Session session = SessionUtil.getSession(request); 44 //未登錄 45 if (session == null) { 46 errorMessage = ""; 47 Session oldSession = SessionUtil.getOldSession(request); 48 if (oldSession != null) { 49 errorMessage = "您的賬號在異地登錄(" + oldSession.getIp() + "),如非授權,建議修改密碼"; 50 } 51 return false; 52 } 53 //登錄超時 54 if (SessionUtil.isLoginTimeout(session)) { 55 SessionUtil.removeSession(session); 56 errorMessage = "因長時間未操作,系統已自動退出,請重新登錄"; 57 return false; 58 } 59 return true; 60 } 61 62 /** 63 * 不用過濾的額外配置 64 * 沒有登錄時,有些請求是必須的,因此不用過濾 65 * 66 * @param url 67 * @param request 68 * @return 69 */ 70 private boolean isNotLoginValidate(String url, HttpServletRequest request) { 71 for (String path : GridProperties.NOT_VALIDATE_PATH) { 72 if (url.startsWith(request.getContextPath() + path)) { 73 return true; 74 } 75 } 76 return false; 77 } 78 79 /** 80 * 資源請求 81 * 82 * @param url 83 * @return 84 */ 85 private boolean isResourceRequest(String url) { 86 if (url.endsWith(".jpg") || url.endsWith(".gif") 87 || url.endsWith(".css") || url.endsWith(".js") 88 || url.endsWith(".png") || url.endsWith(".bmp") 89 || url.endsWith(".ico") || url.endsWith(".txt") 90 || url.endsWith(".apk") || url.endsWith("bootstrap.min.css.map")) { 91 return true; 92 } 93 return false; 94 } 95 96 @Override 97 public void destroy() { 98 this.errorMessage = ""; 99 } 100 101 @Override 102 public void init(FilterConfig filterConfig) throws ServletException { 103 this.errorMessage = ""; 104 } 105 106 }
第30-31行返回給前端返回提示信息,通過url進行傳參進行提示,前端頁面再進行獲取,往往會出現亂碼和刷新頁面數據還在的問題,
考慮通過后端方式給前端傳回數據 都沒有成功。
最后通過使用sessionStorage進行傳遞參數,問題解決。
前端的主要處理代碼如下
console.log(window.sessionStorage.getItem(errorMessage));
var message = window.sessionStorage.getItem(errorMessage);
if (message !=null) {
$(".login-errorMsg").text(message);
window.sessionStorage.removeItem("errorMessage");
}else {
$(".login-errorMsg").text("");
}
通過瀏覽器的F12 我們可以看到如下界面
可以看到我們可以使用localStorage 和sessionStorage來存儲前端交互數據
sessionStorage簡單的存取和讀取方式如下:
sessionStorage.setItem(testKey,這是一個測試的value值); // 存入一個值
window.sessionStorage.getItem(key); //取出一個值
sessionStorage.removeItem("key");//刪除某個key
sessionStorage.clear();//清除所有key/value
可以大膽推斷一下,localStorage 的使用方式應該也是類似的,
具體的使用方法可以參考:https://www.cnblogs.com/polk6/p/5512979.html
https://developer.mozilla.org/zh-CN/docs/Web/API/Window/sessionStorage
https://www.cnblogs.com/minigrasshopper/p/8064367.html
sessionStorage 詳細X 網絡釋義 sessionStorage: 會話存儲 window [w?nd??] window&type=1詳細X 基本翻譯 n. 窗;窗口;窗戶 網絡釋義 window: 窗 Window function: 窗函數 show window: 櫥窗文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/1423.html
摘要:先說點什么和路由攔截這一塊搗鼓的有一段時間了總算是爬出來了特地來分享一下首先聲明沒有什么基礎介紹用的是登錄狀態存儲的方法進入正題刷新刷新相當與重啟項目,之前獲取到的數據也只是通過暫存起來,項目關閉時就不見了,這有些像電腦重啟,存儲在的數據會 先說點什么 vuex和路由攔截這一塊搗鼓的有一段時間了,總算是爬出來了,特地來分享一下,首先聲明沒有什么基礎介紹,用的是登錄狀態存儲session...
摘要:有一天突然想到一個問題,端的權限控制真的能控制權限嗎僅僅靠前端,能不能做到真正的權限控制如果需要后臺配合,應該如何配合可能這是一個老生常談的問題,但還是想整理下,有誤的地方望大家指出。 有一天突然想到一個問題,web端的權限控制:1.真的能控制權限嗎?2.僅僅靠前端,能不能做到真正的權限控制?3.如果需要后臺配合,應該如何配合?可能這是一個老生常談的問題,但還是想整理下,有誤的地方望大...
摘要:實現目標延長過期時間活躍用戶在過期時,在用戶無感知的情況下動態刷新,做到一直在線狀態不活躍用戶在過期時,直接定向到登錄頁登錄返回字段如何簽發,請看上一篇推文,這里不做過多介紹。如果你有更好的做法,歡迎留言告知我,謝謝啦。 前言 記錄一下前后端分離下————token超時刷新策略! 需求場景 昨天發了一篇記錄 前后端分離應用——用戶信息傳遞 中介紹了token認證機制,跟幾位群友討論了...
摘要:用存儲用戶路由守衛路由中設置的字段就在當中每次跳轉的路徑登錄狀態下訪問頁面會跳到如果沒有訪問任何頁面。一個簡單的保存登錄狀態的小。 Vue項目中實現用戶登錄及token驗證 先說一下我的實現步驟: 使用easy-mock新建登錄接口,模擬用戶數據 使用axios請求登錄接口,匹配賬號和密碼 賬號密碼驗證后, 拿到token,將token存儲到sessionStorage中,并跳轉到首...
摘要:所有的高階抽象組件是通過定義選項來聲明的。所以一般在生命周期或者中,需要用實例的方法清除可當你有多個時,就需要重復性勞動銷毀這件事兒。更多的配置請看雙端開啟開啟壓縮的好處是什么可以減小文件體積,傳輸速度更快。本文目錄 接口模塊處理 Vue組件動態注冊 頁面性能調試:Hiper Vue高階組件封裝 性能優化:eventBus封裝 webpack插件:真香 本文項目基于Vue-Cli3,想知...
閱讀 724·2023-04-25 19:43
閱讀 3921·2021-11-30 14:52
閱讀 3794·2021-11-30 14:52
閱讀 3859·2021-11-29 11:00
閱讀 3790·2021-11-29 11:00
閱讀 3882·2021-11-29 11:00
閱讀 3562·2021-11-29 11:00
閱讀 6138·2021-11-29 11:00