扫码登录的原理以及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来写,不能让它不停的刷新。思路很重要,而且对于一个食物要有自己的看法,希望这篇文章能够对你能起到帮助

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值