欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringMVC攔截器實現(xiàn)單點登錄

 更新時間:2017年11月23日 14:11:43   作者:Rava722  
這篇文章主要介紹了SpringMVC攔截器實現(xiàn)單點登錄,簡單介紹了springmvc攔截器,單點登錄實現(xiàn)原理等相關內容,具有一定參考價值,需要的朋友可以了解下。

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

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

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

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

下面是SpringMVC中攔截器的實現(xiàn)

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;
	}
}

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

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

 $.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);可以使請求的返回狀態(tài)變?yōu)?04出錯,然后由error方法響應,當判斷到狀態(tài)是自己所設置的狀態(tài)碼時再document.write(rs.responseText);responseText即為攔截器中所向前臺打印的js語句,而要這些語句能夠執(zhí)行則需要document.write();方法將那些代碼寫入dom讓其生效,至此,所有的請求,異步ajax請求的單點登錄基本都已實現(xiàn)。

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

總結

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

相關文章

  • SpringbootJPA分頁 PageRequest過時的替代方法

    SpringbootJPA分頁 PageRequest過時的替代方法

    這篇文章主要介紹了SpringbootJPA分頁 PageRequest過時的替代方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Mybatis批量插入更新xml方式和注解方式的方法實例

    Mybatis批量插入更新xml方式和注解方式的方法實例

    這篇文章主要給大家介紹了關于Mybatis批量插入更新xml方式和注解方式的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Mybatis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-12-12
  • elasticsearch索引index之Mapping實現(xiàn)關系結構示例

    elasticsearch索引index之Mapping實現(xiàn)關系結構示例

    這篇文章主要介紹了elasticsearch索引index之Mapping實現(xiàn)關系結構示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • BeanUtils.copyProperties在拷貝屬性時忽略空值的操作

    BeanUtils.copyProperties在拷貝屬性時忽略空值的操作

    這篇文章主要介紹了BeanUtils.copyProperties在拷貝屬性時忽略空值的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 關于@PostConstruct、afterPropertiesSet和init-method的執(zhí)行順序

    關于@PostConstruct、afterPropertiesSet和init-method的執(zhí)行順序

    這篇文章主要介紹了關于@PostConstruct、afterPropertiesSet和init-method的執(zhí)行順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 解決FeignClient發(fā)送post請求異常的問題

    解決FeignClient發(fā)送post請求異常的問題

    這篇文章主要介紹了FeignClient發(fā)送post請求異常的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • idea引入外部jar包的方法實現(xiàn)

    idea引入外部jar包的方法實現(xiàn)

    本文主要介紹了idea引入外部jar包的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • java文件讀寫工具類分享

    java文件讀寫工具類分享

    這篇文章主要為大家詳細介紹了java文件讀寫工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • springboot中使用mybatisplus自帶插件實現(xiàn)分頁的示例代碼

    springboot中使用mybatisplus自帶插件實現(xiàn)分頁的示例代碼

    這篇文章主要介紹了springboot中使用mybatisplus自帶插件實現(xiàn)分頁,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • SpringDataJpa:JpaRepository增刪改查操作

    SpringDataJpa:JpaRepository增刪改查操作

    這篇文章主要介紹了SpringDataJpa:JpaRepository增刪改查操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評論