Android二维码扫描登陆网页
Posted 叶子8324
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android二维码扫描登陆网页相关的知识,希望对你有一定的参考价值。
1 二维码扫描登陆
1,web端生成二维码,传递uuid,并存入数据库
2,web端轮训查询信息,是否有数据库扫描二维码信息
3,手机端扫描二维码,获取UUID,传递用户名、密码web端
4,web查询数据库中用户信息(UserLogin),将登陆信息(用户名,密码)存入数据库。
5,web轮训查到用户登陆信息,信息完整,则登陆成功。
1.1 web端
1.1.1 导入依赖包(二维码生成QRCode.jar)
jar包下载: QRCode.jar
1.1.2 用户登陆信息实体类(UserLogin.java)
@Entity
@Table(name = "UserLogin")
public class UserLogin
@Id
@GeneratedValue(generator = "UserLoginIdGenerator")
@GenericGenerator(name = "UserLoginIdGenerator", strategy = "uuid")
private String id;
@Column
private String name;
@Column
private String password;
@Column
private int uuid;
public String getId()
return id;
public void setId(String id)
this.id = id;
public int getUuid()
return uuid;
public void setUuid(int uuid)
this.uuid = uuid;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getPassword()
return password;
public void setPassword(String password)
this.password = password;
1.1.3 生成二维码(GetQrCodeServlet.java)
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.engine.transaction.jta.platform.internal.JOnASJtaPlatform;
import sun.org.mozilla.javascript.internal.json.JsonParser;
import com.alibaba.fastjson.JSONObject;
import com.jie.qrcode.util.HibernateUtil;
import com.jie.qrcode.util.QRCodeUtil;
import com.jie.qrcode.vo.UserLogin;
/**
* @ClassName: GetQrCodeServlet.java
* @Description: TODO(生成二维码)
* @author yangjie
* @version V1.0
* @Date 2016-5-16 上午11:05:27
*/
public class GetQrCodeServlet extends HttpServlet
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
doPost(request, response);
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
PrintWriter out = response.getWriter();
// 生成唯一ID
int uuid = (int) (Math.random() * 100000);
// 二维码内容
// String content =
// "http://192.168.0.199:8080/QrCodeLogin/PhoneLoginServlet?uuid="
// + uuid;
JSONObject obj = new JSONObject();
obj.put("url",
"http://192.168.0.199:8080/QrCodeLogin/PhoneLoginServlet");
obj.put("uuid", uuid);
String content = obj.toString();
System.out.println("obj:" + content);
// 生成二维码
String imgName = uuid + "_" + (int) (new Date().getTime() / 1000)
+ ".png";
String contextRoot = request.getContextPath();
String webpath = request.getSession().getServletContext()
.getRealPath("/");
System.out.println(webpath);
String imgPath = webpath + "/img/qrCodeImg/" + imgName;
String logoPath = webpath + "/img/logo.png";
QRCodeUtil handler = new QRCodeUtil();
// handler.encoderQRCode(content, imgPath, "png");
handler.encoderQRCode(content, imgPath, logoPath, "png");
// uuid保存
SessionFactory sf = HibernateUtil.getSessionFacotry();
Session session = sf.openSession();
session.beginTransaction();// 事务开始
UserLogin userlogin = new UserLogin();
userlogin.setUuid(uuid);
session.save(userlogin);// 将uuid保存到数据库
session.getTransaction().commit();// 事务提交
session.close();
sf = null;
// 生成的图片访问地址
String qrCodeImg = "http://192.168.0.199:8080/QrCodeLogin/img/qrCodeImg/"
+ imgName;
String jsonStr = "\\"uuid\\":" + uuid + ",\\"qrCodeImg\\":\\"" + qrCodeImg
+ "\\"";
out.print(jsonStr);
out.flush();
out.close();
1.1.4 用长连接,检查登录状态(LongConnectionCheckServlet.java)
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import com.jie.qrcode.util.HibernateUtil;
import com.jie.qrcode.vo.UserLogin;
/**
* @ClassName: LongConnectionCheckServlet.java
* @Description: TODO(用长连接,检查登录状态)
* @author yangjie
* @version V1.0
* @Date 2016-5-16 上午11:09:32
*/
public class LongConnectionCheckServlet extends HttpServlet
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
doPost(request, response);
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
int uuid = Integer.parseInt(request.getParameter("uuid"));
String jsonStr = "";
System.out.println("in");
System.out.println("uuid:" + uuid);
long inTime = new Date().getTime();
Boolean bool = true;
while (bool)
try
Thread.sleep(5000);
catch (InterruptedException e)
e.printStackTrace();
// 根据uuid查询数据库登录表信息
String username = "";
SessionFactory sf = HibernateUtil.getSessionFacotry();
Session session = sf.openSession();
Criteria criteria = session.createCriteria(UserLogin.class);
criteria.add(Restrictions.eq("uuid", uuid));
List<UserLogin> result = criteria.list();
if (result.size() > 0)
for (UserLogin s : result)
username = s.getName();
if(!"".equals(username)&&username!=null)//如果用户名信息不为空,则登陆成功
bool = false;
session.clear();
session.beginTransaction();
session.delete(s);//删除二维码登录信息,表明已登录
session.getTransaction().commit();
jsonStr = "\\"uname\\":\\"" + username + "\\"";
System.out.println(username);
else
if (new Date().getTime() - inTime > 5000)
bool = false;
session.close();
sf = null;
System.out.println("login ok : " + jsonStr);
PrintWriter out = response.getWriter();
out.print(jsonStr);
out.flush();
out.close();
1.1.5 接收手机二维码回传信息(PhoneLoginServlet.java)
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import com.jie.qrcode.util.HibernateUtil;
import com.jie.qrcode.vo.UserLogin;
/**
* @ClassName: PhoneLoginServlet.java
* @Description: TODO(手机二维码登陆)
* @author yangjie
* @version V1.0
* @Date 2016-5-16 上午11:20:16
*/
public class PhoneLoginServlet extends HttpServlet
private static final long serialVersionUID = 1L;
public PhoneLoginServlet()
super();
// TODO Auto-generated constructor stub
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
doPost(request, response);
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
int uuid = Integer.parseInt(request.getParameter("uuid"));
String uname = request.getParameter("uname");
String upwd = request.getParameter("upwd");
System.out.println(uuid);
System.out.println(uname);
System.out.println(upwd);
// 验证登陆
boolean bool = true;
//是否登陆
boolean islogin = false;
if (bool)
// 将登陆信息存入数据库
SessionFactory sf = HibernateUtil.getSessionFacotry();
Session session = sf.openSession();
Criteria criteria = session.createCriteria(UserLogin.class);
criteria.add(Restrictions.eq("uuid", uuid));
List<UserLogin> result = criteria.list();
if (result.size() > 0)
for (UserLogin s : result)
s.setName(uname);
s.setPassword(upwd);
session.clear();
session.beginTransaction();//开始事务
session.saveOrUpdate(s);
session.getTransaction().commit();// 事务提交
bool = false;
islogin = true;
else//没有该uuid信息,表明已登录,二维码过期
islogin = false;
System.out.println("二维码已过期,请刷新页面");
session.close();
sf = null;
PrintWriter out = response.getWriter();
out.print(islogin);//传递登陆是否成功
out.flush();
out.close();
1.1.6 二维码扫描界面(index.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<script type="text/javascript" src="js/jquery-1.11.0.min.js"></script>
<style>
.div-content
text-align: center;
.img
margin-top: 150px;
.div-content-text
text-align: center;
margin-top: 20px;
font-size: 36px;
color: blue;
</style>
<body>
<div id="divCon" class="div-content">
<img src="" id="QrCodeImg" class="img" />
<div class="div-content-text">扫描二维码登陆</div>
</div>
</body>
<script type="text/javascript">
$(document).ready(
function()
var uuid;
$.get("GetQrCodeServlet", function(data, status)
var obj = eval("(" + data + ")");
//存储UUID
uuid = obj.uuid;
//显示二维码
$("#QrCodeImg").attr("src", obj.qrCodeImg);
//开始验证登录
validateLogin();
);
function validateLogin()
$.get("LongConnectionCheckServlet?uuid=" + uuid, function(
data, status)
if (data == "")
validateLogin();
else
var obj = eval("(" + data + ")");
alert("登录成功了:" + obj.uname);
window.location.href = "home.html";
);
);
</script>
</html>
1.1.7 运行效果
1.2 手机端
1.2.1 导入依赖工程BarCodeLibrary
工程下载: Android二维码扫描1.2.2 创建工程并引入依赖包
1.2.3 手机二维码界面(activity_main.xml)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:gravity="center" >
<Button
android:id="@+id/btn_scan"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:background="@android:color/holo_blue_light"
android:textColor="@android:color/white"
android:text="扫码登录" />
</LinearLayout>
1.2.4 MainActivity.java
package com.jie.qrcode;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import com.alibaba.fastjson.JSONObject;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.RequestParams;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest;
import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;
import com.zxing.activity.CaptureActivity;
public class MainActivity extends Activity implements OnClickListener
private Button btnScan;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnScan = (Button) findViewById(R.id.btn_scan);
btnScan.setOnClickListener(this);
@Override
public void onClick(View v)
// TODO Auto-generated method stub
Intent intent = new Intent(this, CaptureActivity.class);
startActivityForResult(intent, 0);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==Activity.RESULT_OK)
String result = data.getExtras().getString("result");//获取扫描的结果
//Log.i("result",result);
JSONObject obj = JSONObject.parseObject(result);
String uuid = obj.getString("uuid");
String httpUrl = obj.getString("url");
//Toast.makeText(getApplicationContext(), result, 1000).show();
//将扫描内容提交到网页
HttpUtils http = new HttpUtils();
RequestParams params = new RequestParams();
params.addBodyParameter("uuid", uuid);
//Log.i("uuid",uuid);
params.addBodyParameter("uname", "yangjie");
params.addBodyParameter("upwd", "123456");
http.send(HttpMethod.POST, httpUrl, params , new RequestCallBack<String>()
@Override
public void onFailure(HttpException arg0, String arg1)
// TODO Auto-generated method stub
Log.i("http.send","failuer");
Toast.makeText(getApplicationContext(), "登陆失败,二维码过期,请刷新页面!", 1000).show();
@Override
public void onSuccess(ResponseInfo<String> arg0)
// TODO Auto-generated method stub
Log.i("http.send","success");
Toast.makeText(getApplicationContext(), "登陆成功!", 1000).show();
);
1.2.5 运行效果
1.3 完整工程源码请点击下载:二维码扫描登陆-完善
以上是关于Android二维码扫描登陆网页的主要内容,如果未能解决你的问题,请参考以下文章