java扫码登录

article/2025/9/18 7:35:54

这篇博文主要记录我实现扫码登录的步骤,及代码。其实之前从网上搜了很久扫码登录,copy版很多,所以回答也就那几种。

我把我自己的思路也说一下吧。如果有更好的意见或者我有不对的地方,请指出。

首先说一下我用的技术, maven构建项目,ssh ,redis, shiro, goeasy推送,ZXing二维码生成。


图有点粗糙。凑合看,我解释一下,首先我认为,session肯定是浏览器和服务器交互唯一的标识,所以我认为sessionid可以直接定位到是哪一个用户进行扫码登录,

OK,那么围绕这一点,当浏览器打开我们的网站时,我们就getsession,这样保证先给浏览器一个session对象。

接下来我将用代码展示的方式给大家展示一下流程

首先从网上扒了一个监听全局session的监听器。

public class MySessionContext {private static HashMap mymap = new HashMap();public static synchronized void AddSession(HttpSession session) {if (session != null) {mymap.put(session.getId(), session);}}public static synchronized void DelSession(HttpSession session) {if (session != null) {mymap.remove(session.getId());}}public static synchronized HttpSession getSession(String session_id) {if (session_id == null)return null;return (HttpSession) mymap.get(session_id);}
}

public class MySessionListener {public void sessionCreated(HttpSessionEvent httpSessionEvent) {MySessionContext.AddSession(httpSessionEvent.getSession());}public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {HttpSession session = httpSessionEvent.getSession();MySessionContext.DelSession(session);}
}


 <listener>
<listener-class>cn.itcast.web.action.lisener.MySessionListener</listener-class>
</listener>


这个实际上没啥必要。。。直接通过jssionid获取就可以了。当时没想到


登录Action

@Action("loginAction_login")public String login() throws Exception {Map<String, Object> session = ActionContext.getContext().getSession();Subject subject = SecurityUtils.getSubject();//shiroif(session.get(SysConstant.CURRENT_USER_INFO)!=null){//如果有session用户信息,直接走验证,说明是手机扫码的User user = (User) session.get(SysConstant.CURRENT_USER_INFO);subject.login(new UsernamePasswordToken(user.getUserName(),user.getPassword()));}if(subject.isAuthenticated()){//验证成功直接返回成功。return SUCCESS;}if(UtilFuns.isEmpty(username)){//为浏览器分配sessionHttpServletRequest request = ServletActionContext.getRequest();sessID = request.getSession().getId();super.push(sessID);request.getSession().setAttribute("ssid", sessID);return "login";}try {//登录成功赋值sessionString md5 = Encrypt.md5(password, username);subject.login(new UsernamePasswordToken(username, md5));session.put(SysConstant.CURRENT_USER_INFO, (User)subject.getPrincipal());} catch (Exception e) {e.printStackTrace();request.put("errorInfo", "对不起,登录失败,用户名或密码错误!!!");HttpServletRequest request = ServletActionContext.getRequest();sessID = request.getSession().getId();super.push(sessID);//压栈request.getSession().setAttribute("ssid", sessID);//为了获得图片二维码时有sessionreturn "login";}User user =(User)subject.getPrincipal();//4.将user对象保存到session域中session.put(SysConstant.CURRENT_USER_INFO, user);//5.跳页面return SUCCESS;}

这里实际上页面也悄悄工作了

<script>
function changeCode(){$("#erweima").attr('src','${ctx}/mobile/MobileCode?t='+new Date().getTime());//选择二维码时直接去替换二维码图片
}
</script>
<script type="text/javascript" src="http://cdn.goeasy.io/goeasy.js"></script>
<script type="text/javascript">var goEasy = new GoEasy({appkey: 'BC-c9196bffff9b4fcabd70a200f95a51d2'});goEasy.subscribe({channel: '${sessID }',//这里绑定sessionid保证推送是指定用户onMessage: function(message){location.reload()}});</script></head>



public class QRCodeUtil extends BaseAction{  @Action(value="MobileCode")public void getcode(){//生成二维码HttpServletResponse response;String urls;Hashtable<EncodeHintType, String> hints;BitMatrix matrix;try {response = (HttpServletResponse)ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);Jedis jedis =new Jedis("192.168.123.101");HttpServletRequest request = ServletActionContext.getRequest();String sessID = (String) session.get("ssid");String id = request.getSession().getId();MySessionContext.AddSession(request.getSession());String key = Encrypt.md5(UUID.randomUUID().toString(), "cao");jedis.set(key, sessID, "NX", "EX", 1800);urls = "http://192.168.123.96:8080/test/mobileAutoLog?parms="+key;//这是手机端扫码的结果hints = new Hashtable<EncodeHintType, String>();  hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");  matrix = null;matrix = new MultiFormatWriter().encode(urls,  BarcodeFormat.QR_CODE, 300, 300, hints);  MatrixToImageWriter.writeToStream(matrix, "jpg", response.getOutputStream());} catch (Exception e1) {// TODO Auto-generated catch blocke1.printStackTrace();}  }  


然后假装扫码成功

我不得不插一段安卓代码了。。。

public void ineedLogin(View v){//扫码成功SharedPreferences sharedPreferences = getSharedPreferences("userinfo", 1);token = sharedPreferences.getString("username", "");try {GetDataFromService();} catch (Exception e) {e.printStackTrace();}}private void GetDataFromService() throws   Exception{RequestParams params = new RequestParams(result+"&username="+token);//去访问浏览器发过来的请求,并且拼接上用户的用户名。x.http().post(params, new Callback.CacheCallback<String>() {@Overridepublic boolean onCache(String result) {return false;}@Overridepublic void onSuccess(String result) {}@Overridepublic void onError(Throwable ex, boolean isOnCallback) {}@Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic void onFinished() {}});

其实我这里选了一个比较low的。。我为了省事,安卓直接拼了username过去。。还用了个Xutils...搞得重写了很多方法。。别笑我。。哈哈哈哈

好了我们再来看扫码成功的action

Jedis jedis =new Jedis("192.168.123.101");String jedisParms = jedis.get(parms);if(jedisParms!=null&&!jedisParms.equals("")){//去看redis是否有手机端传过来这个码,List<User> find = userService.find(new Specification<User>() {@Overridepublic Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {return cb.equal(root.get("userName").as(String.class),username);}});User u1 = find.iterator().next();//拿到用户信息HttpSession session = MySessionContext.getSession(jedisParms);//拿到sessionsession.setAttribute(SysConstant.CURRENT_USER_INFO, u1);final String APP_KEY="BC-c9196bffff9b4fcabd70a200f95a51d2";GoEasy goEasy =new GoEasy(APP_KEY);goEasy.publish(jedisParms,"heh" ); //直接推送前端return NONE;}else{System.out.println("验证失败");}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return "error";
}

前端收到推送之后会刷新页面,并且session里面已经有值,那么会走登录验证的方法,session有值的方法。

我们再来看shiro,这里当时我有点懵,因为shiro实际上我用的不是很熟悉,就知道它运行的流程,当时不知道怎么才能让他验证通过,所以走了很多次shiro的登录方法,如果有别的好办法!也希望大家告诉我!!!

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {Map<String, Object> session = ActionContext.getContext().getSession();User object = (User) session.get(SysConstant.CURRENT_USER_INFO);if(object!=null){//手机final String username = object.getUserName();List<User> findUser = userService.find(new Specification<User>() {@Overridepublic Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {// TODO Auto-generated method stubreturn cb.equal(root.get("userName").as(String.class), username);}});return new SimpleAuthenticationInfo(findUser,findUser.get(0).getPassword(),this.getName());}else{//电脑UsernamePasswordToken  userNamePassword=(UsernamePasswordToken) arg0;final String username = userNamePassword.getUsername();List<User> findUser = userService.find(new Specification<User>() {@Overridepublic Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {// TODO Auto-generated method stubreturn cb.equal(root.get("userName").as(String.class), username);}});if(findUser!=null && findUser.size()!=0){return new SimpleAuthenticationInfo(findUser,findUser.get(0).getPassword(),this.getName());}}return null;}


因为之前没有加扫码登录时,我HashMd5是在这个密码比较器里加的,加了扫码之后,页面出过来明文我就直接加密了。所以密码比较器里面,直接比较就可以了


	public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {UsernamePasswordToken uToken =(UsernamePasswordToken) token;String en =new String(uToken.getPassword());return equals(en, info.getCredentials());}


到此java扫码登录完成!

如果各位有别的好思路,希望也分享给我。


http://chatgpt.dhexx.cn/article/2CFU3UuV.shtml

相关文章

微信公众号开发—扫描二维码实现登录方案

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 微信公众号开发—扫描二维码实现登录方案 ⏱️ 创作时间&#xff1a; …

第三方登录之微信扫码登录

文章目录 1. 申请微信接入&#xff1a;2. 项目环境搭建&#xff1a;3.后端Controller接口&#xff1a;4.HTML页面代码&#xff1a;5.测试结果&#xff1a;6.补充说明&#xff1a; 小伙伴们有各种疑问可以去参考官方文档进行详细的学习下 微信开发文档 &#xff0c;此次介绍的将…

扫码登录操作过程

转载自http://justcoding.iteye.com/blog/2213661浏览器输入&#xff1a;https://wx.qq.com/?langzh_CN手机登录微信&#xff0c;利用“扫一扫”功能扫描网页上的二维码手机扫描成功后&#xff0c;提示“登录网页版微信”&#xff1b;网页上显示“成功扫描 请在手机点击确认以…

实现手机扫描二维码进行登录

项目结构&#xff1a; 实现流程&#xff1a; pc端&#xff1a; 1:打开二维码登录网页index.html 2:index.html调用GetQrCodeServlet 3:GetQrCodeServlet干2件事 a:生成随机的uuid,是一个唯一标识&#xff0c;该标识贯穿整个流程 b:生成二维码图片&#xff0c;二维码信息&#x…

扫码登录,背后是如何实现的?

引言 近年来&#xff0c;随着智能手机和移动支付的普及以及互联网应用的不断更新迭代&#xff0c;扫码登录已经成为了我们日常生活中非常普遍的登录方式。扫码登录能够迅速的成为我们各大网站常用的登录方式一定存在它的原因。 首先一个非常重要的原因&#xff0c;扫码登录还可…

网站实现微信扫码登录

网站实现微信扫码登录 1 准备工作1.1 申请网站应用 2 快速开始2.1 微信扫码登录流程说明2.2 生成微信二维码的两种方式2.2.1 微信提供的二维码生成URL2.2.2 将微信登录二维码内嵌到自己页面 2.3 系统微信扫码登录示例2.3.1 流程说明2.3.2 核心代码2.3.2.1 前端代码2.3.2.2 后端…

【一】微信公众号之扫码登录

微信公众号之扫码登录 ​ 原来公司的官网就支持账号密码、手机验证码、QQ扫码授权、微信扫码授权等多种登录方式。今天要分享的就是关于微信扫码授权登录的原理。 一、准备工作 使用的是微信登录功能实现的&#xff0c;需要先在微信开放平台注册开发者帐号&#xff0c;并拥有一…

公众号扫码登录

1.流程概述 1.1 申请公众号 1.2 创建带参数的公众号二维码&#xff0c;参数值为scen_id的值 1.3 微信基础配置接口编写&#xff0c;get方式的接口为微信测试接口&#xff0c;必须能正常访问&#xff0c;post方式的接口为扫码回调接口&#xff0c;从请求中获取微信返回的xml包…

二维码扫描登录,你必须知道的 3 件事!

作者 | 互联网平头哥 本文经授权转载自互联网平头哥&#xff08;ID&#xff1a;it_pingtouge&#xff09; 扫二维码登录现在比较常见&#xff0c;比如微信、支付宝等 PC 端登录&#xff0c;并且好像每款 APP 都支持扫码登录&#xff0c;不搞个扫码登录都不好意思。作为技术人员…

微信扫码登录实现

需求 使用微信扫码登录的授权方式登录系统 实现 此扫码登陆过程中使用了&#xff0c;微信开放平台&#xff08;需支付300开通开发者认证&#xff09;的网站应用实现的。 官方文档&#xff1a;https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wec…

web扫码登录

文章目录 需求流程交互流程服务交互流程 关键思路代码生成二维码&#xff0c;返回给PC展示轮询查询二维码状态APP扫码请求登录 总结 需求 pc端实现app扫码登录 流程 交互流程 服务交互流程 关键思路 主要问题在于如何识别APP端用户&#xff0c;然后传递给PC端已经登录成功 …

开放平台–扫描微信二维码登录

准备 如不了解第三方登录流程&#xff0c;建议先大概了解一下&#xff0c;在来看看代码。 说明&#xff1a; 由于开放平台无测试号测试&#xff0c;所以只能上开放平台进行配置信息。公众平台的测试号并不能给开放平台使用。 微信开放平台地址&#xff1a;https://open.weixi…

二维码登陆

上一段时间研究微信公共账号,发现微信提供了一个扫码登陆验证的功能。近期头痛于经常忘记用户名密码,因此考虑是否可以结合这个功能,完成免密码登陆。百度后发现&#xff0c;有很多仁兄已经做过类似的功能了。 如这篇文章: 实现网站二维码扫描登录 仔细研究后&#xff0c;发现很…

二维码登录(三)扫码登录

承接上篇博客&#xff0c;在进行二维码生成之后&#xff0c;app进行扫码&#xff0c;扫码成功之后&#xff0c;手机点击登录&#xff0c;进行绑定登录关系&#xff0c;后台做自动关联与自动登录。 本文git地址&#xff1a;https://github.com/xvshu/qrlogin 1&#xff0c;扫码…

微信扫码登陆(1)---扫码登录流程讲解、获取授权登陆二维码

扫码登录流程讲解、获取授权登陆二维码 具体流程可以看微信官网的扫码登录文档 地址&#xff1a;准备工作 | 微信开放文档 其实官方文档已经讲的非常清楚而且讲的也很明白。 一、扫码登录流程讲解 1、首先准备工作 网站应用微信登录是基于OAuth2.0协议标准构建的微信OAut…

二维码扫码登录

项目结构 模块介绍 流程1 pc端&#xff1a;1:打开二维码登录网页index.html2:index.html调用GetQrCodeServlet3:GetQrCodeServlet干2件事 a:生成随机的uuid,是一个唯一标识&#xff0c;该标识贯穿整个流程 b:生成二维码图片&#xff0c;二维码信息&#xff1a;http://60.2…

扫码登录详解

目录 扫码流程分析 流程详解 步骤一&#xff1a;PC端准备二维码 步骤三&#xff1a;状态确认 token认证机制 扫码流程分析 1.扫码前&#xff0c;手机端已经是登陆状态&#xff0c;PC端显示一个二维码&#xff0c;等待扫描。 2.手机端打开应用&#xff0c;扫描PC端的二维码…

新增商品

1、在http代理设置&#xff0c;添加过滤参数&#xff1a; .*pusher\.*\/websocket.* .*/venilog/log/one .*\.(bmp|css|js|gif|ico|jpe?g|png|swf|woff) .*pusher\/info.* 2、启动http代理设置&#xff0c;录制脚本&#xff0c;将登陆和发布商品的脚本修改成’登陆‘&#x…

自定义商品分类,选择分类之后,添加商品附属性;仿淘宝后台添加商品附属性的价格和数量

效果图&#xff08;图片较大&#xff0c;加载较慢&#xff09; 页面部分&#xff1a; <div class"layui-form-item" id"add_attribute"><label class"layui-form-label">商品分类</label><div class"layui-input-i…

javaScript原生版购物车:全选、单选、全删、商品数量增减、计算总价、添加商品(代码)

题目&#xff1a; CSS代码如下&#xff1a; <style> *{ margin: 0px; padding: 0px; } .header,.content,.floot{ width: 800px; margin:0px auto; } .header ul li,.content ul li{ float: left; list-style: none; width: 100px; line-height: 100px; text-align: cen…