亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

SpringMVC攔截器實現單點登錄

2024-07-13 10:13:45
字體:
來源:轉載
供稿:網友

單點登錄的功能在實際的應用場景中還是很重要的,邏輯上我們也不允許一個用戶同時在進行著兩個操作,下面就來了解一下SpringMVC的單點登錄實現

SpringMVC的攔截器不同于Spring的攔截器,SpringMVC具有統一的入口DispatcherServlet,所有的請求都通過DispatcherServlet,所以只需要在DispatcherServlet上做文章即可,DispatcherServlet也沒有代理,同時SpringMVC管理的Controller也不有代理。

1,先探究一個基本的實現原理:這個功能還是比較簡單的,就是對于同一個web項目同一個時間只能有一個用戶在進行操作,所以這里就涉及到一個異地登錄的發現,而這里就推出兩條路,1是服務器發現已登錄的用戶通過另一個IP再次執行了登錄操作,然后主動推送一個提醒告訴第一個用戶賬號異地登錄;2是當用戶進行操作的時候發現自己的賬號被擠掉了,有異地登錄。關于這兩個方案,第一種是比較具有實時性的但是還在探究中,下面重點說一說第二種方式。

2,實現第二種也比較簡單,兩個操作,一是在用戶表中多加一個字段,用來存儲登錄用戶的SessionId,因為每一個request請求都會對應一個唯一不重復的Sessionid,然后呢就是用攔截器技術了,對用戶的操作進行攔截,在攔截器中首先是對登錄頁面的相關url請求進行放行,然后還有的就是登錄校驗的請求放行。最后再對用戶進行過濾,(關于用戶登錄,在驗證成功時,不僅要把用戶存入Session中用于登錄攔截的驗證,還需要把Session的ID存入用戶表中對應的Sessionid)對于此次請求的request可以獲取到Session及其ID然后再根據這個ID與數據庫中的Sessionid進行比較是否相同相同則通過放行,不同則提示下線跳轉登錄,因為在一次用戶連接服務器操作中會存在一個Session只要Session不過期每次用戶發起的操作的request的Session的id都是一致的所以會和登錄時存入數據庫中的id匹配,當有其他人通過其他設備再用同一個賬號進行登錄時會重新建立Session會刷新數據庫中的Sessionid而自己的Sessionid還是不變的,但是數據庫中的Session已經發生了改變,所以在攔截器中校驗數據庫中Sessionid是否一致時就會失敗從而攔截用戶操作達到單用戶登錄的功能,(關于Session的說明,當用戶初次與服務器連接時會在服務器端創建一個Session,而之后用戶發起的每一次操作request中都會攜帶這個Session的id而出現一些情況Session的失效,用戶長時間沒有與服務器之間進行操作,用戶退出登錄主動讓Session失效,用戶關閉瀏覽器,或者服務器重新啟動)

下面是SpringMVC中攔截器的實現

public class SingleUserInterceptor implements HandlerInterceptor {	@Autowired	private userMapper mapper;	public void afterCompletion(HttpServletRequest arg0,	HttpServletResponse arg1, Object arg2, Exception arg3)	throws Exception {		// TODO Auto-generated method stub	}	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,	Object arg2, ModelAndView arg3) throws Exception {		// TODO Auto-generated method stub	}	public Boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,	Object arg2) throws Exception {		String url = arg0.getRequestURI();		//如果攔截到的是登錄的頁面的話放行 		if(url.indexOf("login.jsp")>=0||url.indexOf("new/login")>=0||url.indexOf("checkuser")>=0){			return true;		}		//如果用戶名存在放心(即登錄放行) 		Integer user = (Integer) arg0.getSession().getAttribute("user");		if(user!=null){			String sessionid = mapper.getUserEntity(Integer.valueOf(user)).getSessionid();			if(sessionid.equals(arg0.getSession().getId())){				return true;			} else{				arg1.setStatus(arg1.SC_GATEWAY_TIMEOUT);				arg1.setContentType("text/html; charset=utf-8");				PrintWriter out = arg1.getWriter();				out.println("<html>");				out.println("<script>");				out.println("alert('您的賬號在別地登錄,您被迫下線')");				out.println("window.open ('" + arg0.getContextPath()				+ "/new/login','_top');");				out.println("</script>");				out.println("</html>");				// arg0.getRequestDispatcher("login.jsp").forward(arg0, arg1);				return false;			}		}		arg0.getRequestDispatcher("login.jsp").forward(arg0, arg1);		return false;	}}

以上的代碼即可實現當同一個用戶多次登錄時,第一個登錄用戶在進行操作時會被擠下線的功能,可以實現先提示賬號異地登錄,然后跳轉登錄頁面的功能。此處需要說明這個簡單的alert提示功能的要點如果這要想出現這個alert必須能夠時能夠讓請求結束,然后response的打印功能輸出那個alert的提示語句,所以注釋掉的那句跳轉語句不能有,有則不會出alert提示語句,因為你的操作沒有正確的結束而是被轉發或者重定向為其他操作了不論正確與否都是其他的action向頁面的輸出了,所以你的response打印語句就不會出現。所以正確的做法是:攔截請求不在放行(returnfalse),此時請求還是原來的請求,并不會跳轉,而response回頁面的打印信息則可以顯示,至于跳轉登錄頁面則可以用:out.println("window.open('"+arg0.getContextPath()+"/new/login','_top');");來實現即在response所輸出的一段js中執行了一個action請求,指向登錄頁面。

通過上面的代碼基本上已經算是實現了單用戶登錄的功能,但是會發現ajax請求的操作并沒有能夠在異地登錄時指向登錄頁面也沒有提示信息,先說明一下原因,因為你的ajax時在進行一個異步請求,而且也在處理器映射器中匹配到了請求的url所以它會視為請求成功(返回狀態碼為200)而上面的response打印的js語句則會變為success中請求成功的,返回值,大家可以嘗試一下把上面的這句話:arg1.setStatus(arg1.SC_GATEWAY_TIMEOUT);注釋掉。這時需要進行一些其他操作,首先就是剛剛提到的語句arg1.setStatus(arg1.SC_GATEWAY_TIMEOUT);他的功能是設置response返回的狀態碼,上面的設置表示將返回狀態碼504代表請求出錯,此時ajax請求就不會再在success方法中響應,而是會響應ajax的error方法,所以只需要再在ajax的error中執行對應的方法即可例如:

 $.ajax({  url:'new/msd2',  success:function(a){  alert(a);  },  error:function(rs){  if(rs.status==504){  document.write(rs.responseText);  }  }  }); 

當ajax請求因為異地登錄被攔截時通過設置arg1.setStatus(arg1.SC_GATEWAY_TIMEOUT);可以使請求的返回狀態變為504出錯,然后由error方法響應,當判斷到狀態是自己所設置的狀態碼時再document.write(rs.responseText);responseText即為攔截器中所向前臺打印的js語句,而要這些語句能夠執行則需要document.write();方法將那些代碼寫入dom讓其生效,至此,所有的請求,異步ajax請求的單點登錄基本都已實現。

留此文只記錄關鍵代碼及思想及操作的原理

總結

以上就是本文關于SpringMVC攔截器實現單點登錄的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品小视频| 日本一区二三区好的精华液| 亚洲男人第一网站| 91在线|亚洲| 国产精品久久久久7777婷婷| 日韩第一页在线| 北条麻妃99精品青青久久| 日韩欧美aⅴ综合网站发布| 亚洲国产日韩欧美在线图片| 久久不射热爱视频精品| 日韩高清欧美高清| 韩国精品久久久999| 国产精品69精品一区二区三区| 国产精品精品久久久久久| 亚洲影院色在线观看免费| 国产91精品不卡视频| 国产日韩一区在线| 97在线观看免费| 91精品综合久久久久久五月天| 欧美xxxx综合视频| 久久久国产精品一区| 欧洲s码亚洲m码精品一区| 18性欧美xxxⅹ性满足| 国产精品第七影院| 国产区精品在线观看| 中文字幕亚洲自拍| 丝袜美腿精品国产二区| 亚洲视频视频在线| 日韩免费av片在线观看| 国产综合在线视频| 日韩精品免费视频| 欧美成人午夜影院| 北条麻妃久久精品| 一区二区欧美久久| 69久久夜色精品国产7777| 最近中文字幕mv在线一区二区三区四区| 一本色道久久综合狠狠躁篇怎么玩| 国产伦精品免费视频| 日韩电影网在线| 亚洲天堂男人的天堂| 国产精品嫩草影院一区二区| 97在线视频免费看| 亚洲精品色婷婷福利天堂| 日韩中文字幕免费看| 91久久国产综合久久91精品网站| 日韩av电影手机在线观看| 538国产精品一区二区在线| 米奇精品一区二区三区在线观看| 欧美性猛交xxxx乱大交蜜桃| 国产99久久精品一区二区永久免费| 2021久久精品国产99国产精品| 亚洲欧美一区二区三区在线| 国产精品免费视频xxxx| 亚洲免费人成在线视频观看| 国产午夜精品全部视频在线播放| 日韩精品久久久久久久玫瑰园| 亚洲久久久久久久久久久| 日韩成人在线电影网| 精品国产精品三级精品av网址| 国产精品视频xxxx| 亚洲精品国产成人| 97色在线播放视频| 91精品国产色综合| 美女久久久久久久久久久| 懂色av中文一区二区三区天美| 欧美日韩在线视频一区二区| 国产日韩在线播放| 国产精品网址在线| 亚洲理论在线a中文字幕| 国产精品草莓在线免费观看| 欧洲中文字幕国产精品| 国产成人精品a视频一区www| 91精品国产综合久久久久久蜜臀| 日韩高清中文字幕| 97视频在线免费观看| 欧美日本啪啪无遮挡网站| 精品久久久在线观看| 亚洲成人黄色网址| 全亚洲最色的网站在线观看| 欧美一级高清免费播放| 国产精品观看在线亚洲人成网| 欧美激情免费视频| 日韩美女福利视频| 欧美性xxxx极品hd满灌| 精品中文字幕视频| 色多多国产成人永久免费网站| 热门国产精品亚洲第一区在线| 日韩av在线电影网| 91热福利电影| 91久久精品日日躁夜夜躁国产| 大荫蒂欧美视频另类xxxx| 亚洲视频在线播放| 国产色综合天天综合网| 欧美在线欧美在线| 日韩电影免费观看中文字幕| 亚洲精品国产品国语在线| 国产女精品视频网站免费| 欧美日韩国产999| 日韩在线精品视频| 在线成人免费网站| 国产在线观看一区二区三区| 色偷偷888欧美精品久久久| 日韩在线观看网站| 国外色69视频在线观看| 九九久久综合网站| 欧美成人一区在线| 狠狠躁18三区二区一区| 日韩精品免费看| 欧美激情啊啊啊| 日韩av中文字幕在线免费观看| 国产在线精品播放| 欧美日韩国产二区| 色偷偷偷亚洲综合网另类| 色无极影院亚洲| 欧美亚洲国产视频小说| 亚洲免费av片| 日韩精品欧美激情| 国产精品视频26uuu| 国产精品美女主播在线观看纯欲| 久久久国产影院| 欧美日韩一区二区三区| 午夜精品一区二区三区视频免费看| 欧美高清第一页| 日韩一区二区福利| 亚洲一区二区三区视频播放| 精品国产乱码久久久久久虫虫漫画| 91精品久久久久久久久中文字幕| 日韩高清av在线| 日韩成人中文字幕在线观看| 国产97人人超碰caoprom| 韩日精品中文字幕| 国产精品久久久久久久久免费| 欧美日韩在线视频一区| 国产精品视频免费观看www| 成人日韩在线电影| 91网站在线免费观看| 狠狠久久亚洲欧美专区| 国产精品自拍网| 影音先锋欧美精品| 国产suv精品一区二区三区88区| 一本色道久久综合狠狠躁篇的优点| 亚洲免费伊人电影在线观看av| 色综合久久悠悠| 亚洲第一色中文字幕| 在线成人免费网站| 国产精品1区2区在线观看| 亚洲乱码国产乱码精品精天堂| 国内精品视频一区| 亚洲xxxxx性| 另类天堂视频在线观看| 清纯唯美亚洲激情| 性欧美xxxx视频在线观看| 欧美国产激情18| 久久韩剧网电视剧| 精品久久香蕉国产线看观看gif| 亚洲精品视频久久| 日韩欧美中文字幕在线观看| 91精品国产高清自在线| 欧美激情久久久| 丝袜亚洲欧美日韩综合| 国产精品永久免费观看| 亚洲va欧美va在线观看| 欧美午夜精品伦理| 国产一区视频在线播放|