1. 程式人生 > >掃碼登入的原理以及jsp簡單實現

掃碼登入的原理以及jsp簡單實現

                                      掃碼登入實現

簡介:

在一次專案的開發中,看到了一篇文章掃碼登入的原理,覺得好像可以做這個,於是乎就自己動手寫了這個簡單版本的掃碼登入,已及遇到的問題,在這裡和大家分享一下。

1.實現原理

用一張圖片來概括一下,實現原理來自於java團長的一篇文章,掃碼登入實現原理

掃碼登入原理

2.程式碼實現

我寫的是一個簡單版本,因為我沒有手機客戶端,所以在實現的思路上可能和圖片裡的不大一樣,但是大體思路是一致的,僅供大家參考

2.1頁面上有一個ajax的方法不停的去請求伺服器,用隨機產生的字串作為鍵,因為要不重新整理頁面每次請求的字元建都要是一致的,所以使用了無刷新技術,接收到後臺發過來值來判斷髮送到什麼頁面

setInterval("fanw()","2000");//不停的請求
  function fanw(){
	  $.ajax({
		  type: "post",
		  url: "useraction.action?methodName=loginfalg",
		  dataType: "json",
		  data:{
			   <%String x=UUID.randomUUID().toString();%>
			   random:'<%=x%>'//一個隨機的字串用來作為鍵去請求伺服器
		  },
		   success: function(msg){
	//返回處理的方法
	if(msg==2){//普通使用者
		location.href="index.jsp";
	}else if(msg==1){//管理員
		location.href="addBook.jsp";
	}
		   }
		   

		});
  }

2.2在二維碼中儲存一個隨機的字串用來區分使用者,java也可以使用jar包達到二維碼生成的效果但是沒有辦法重新整理,所以使用了jQuery的二維碼生成器下載地址為http://www.jq22.com/jquery-info294

//生成二維碼
$(function(){
	$('#tables').qrcode({
	    render: "canvas", //也可以替換為table
	    width: 300,
	    height: 300,
	    //掃碼動作 地址為自己的電腦ip 加專案名和請求的地址
 	    text:"http://192.168.43.217:8080/InternetBook/useraction.action?methodName=sm&user_name=admins&random=<%=x%>"

	});
})

2.3在手機上輸入你釋出了的網址(因為沒有手機端所以要這樣做事先登入的動作),先登入好。然後去掃碼,實際上是去請求二維碼中儲存的網址,因為手機瀏覽器請求了這個方法手機瀏覽器session 會把隨機的字串儲存下來,並且去取手機瀏覽器裡的session中儲存的使用者物件(因為session是一個會話),將隨機字元作為鍵,session取到的使用者物件儲存到Context上下文中,這樣才能被頁面上請求的方法請求到

/**
	 * 
	 * @Title: sm
	 * @Description: (判斷有沒有掃碼動作)
	 * @param request
	 * @param response
	 * @return
	 * @return ActionForward
	 */
	public ActionForward sm(HttpServletRequest request, HttpServletResponse response) {
		String random = request.getParameter("random");//隨機字元用來區分使用者
         //手機瀏覽器
		Object attribute = request.getSession().getAttribute("users");//使用者手機的物件
		if (attribute != null) {
			/**
			 * 有掃碼動作後將random鍵賦值
             *因為要和電腦端聯絡起來所以存放於上下文
			 */
			Users u=(Users) attribute;
			request.getServletContext().setAttribute(random, u);
		}
		 try {
//手機端上提示
			response.getWriter()
			 .println("<script>alert('登入成功!');</script>");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

2.4頁面不停請求的方法,用頁面傳過來的隨機字元作為鍵去context中取值,如果值不為空則證明使用者有掃碼動作,並且也有使用者資訊物件,則將此物件儲存到電腦的session中,並且將隨機字元的鍵值對清空,不佔用伺服器的記憶體,然後將使用者型別儲存下來轉換成json物件,傳送到頁面上

/**
	 * 
	 * @Title: loginfalg
	 * @Description: (login不停的請求)
	 * @param request
	 * @param response
	 * @return
	 * @return ActionForward
	 */
	public ActionForward loginfalg(HttpServletRequest request, HttpServletResponse response) {
         String  random=request.getParameter("random");
         Object attribute=null;
         if(random!=null) {
		 attribute = request.getServletContext().getAttribute(random);// 掃碼動作物件
		}
		int index = 0;// 用index作為條件讓使用者判斷
		  if (attribute != null) {// 有掃碼動作 和手機端登入時
			/**
			 * 將掃碼動作儲存下來的物件清空
			 */
			request.getServletContext().setAttribute(random, null);
			/**
			 * 將手機端物件儲存到session
			 */
			request.getSession().setAttribute("users", attribute);

			Users u = (Users) attribute;
			index = u.getUser_type();// 是不是管理員
		}

		String str = JSON.toJSONString(index);
		try {
			super.print(str, response);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

3.總結

到此一個簡易版本的掃碼登入就算是實現了,重點就是每個頁面產生不同的隨機字元來作為鍵儲存值和請求值鍵,因為沒有手機端,不能讓手機獲取到鍵,所以要用session來傳遞值在方法裡獲取手機的使用者物件,注意請求和儲存的鍵要為同一個,而且前臺的方法要使用ajax來寫,不能讓它不停的重新整理。思路很重要,而且對於一個食物要有自己的看法,希望這篇文章能夠對你能起到幫助