发送短信验证码+登陆功能

       业务:

       手机端点击发送验证码,调用第三方平台(我们用的是“任信了”平台)的接口,去给手机发短信验证码。


  过程:   

                    


       代码:

           

/*** 发送短信验证码     * @param json 前台传入电话号码* @return 返回发送结果向前台*/@RequestMapping("/getTestCode")@ResponseBodypublic GetTestCodeResult sendTestCode(@RequestParam(value="phone",defaultValue="") String phoneNumber ){GetTestCodeResult result = new  GetTestCodeResult();if(phoneNumber == null || phoneNumber.length()==0  ){result.setState(Result.ERROR);result.setMessage("手机号为空");return result;}String code =TestCode.getCode();if( code== null || code.length()==0){result.setState(Result.ERROR);result.setMessage("无效的验证码");return result;}try {SMS.batchsendsm(phoneNumber,code);} catch (Exception e) {result.setState(Result.ERROR);result.setMessage("验证码发送失败");return result;}TestCodeInforVo testCodeInfor = new TestCodeInforVo();testCodeInfor.setCode(code);testCodeInfor.setPhone(phoneNumber);testCodeInfor.setDate(System.currentTimeMillis());testCodeInforMap.put(phoneNumber,testCodeInfor);result.setState(Result.SUCCESS);result.setMessage("验证码发送成功");result.setData(code);  					//测试return  result;}

        上面这个是发送验证码的方法,其中包括了2个工具类:


        No.1 生成5位随机数

        

public class TestCode {private final static int codeLength =5;/*** @see 产生随机验证码* @return 验证码字符串*/public static String getCode(){Random rand = new  Random();int  a ;String  result ="";for( int j =0; j<codeLength; j++ ){a = Math.abs( rand.nextInt()%9 );result += String.valueOf(a);}return  result;}
}

        No.2 调用第三方发送短信接口

        

package com.cn.zhongcai.util.app.util;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class SMS {//把接口地址和参数赋值,之后调用SMS3方法,参数photo是手机号,code是之前生成的验证码。public static void batchsendsm(String phone,String code){try{String  userid = URLEncoder.encode("15732622061","UTF-8"); //188			String url = "http://apis.renxinl.com:8080/smsgate/varsend.do?";String para = "user="+userid+"&pwd=9fa41ab9c5352bc29babd621a73d¶ms="+phone+","+code+"&mid=15552";String str="";str=SMS3(para,url);System.out.println(str);}catch (Exception e) {e.printStackTrace();}}//postData是上面拼接的参数值,postURL 是接口的地址。我觉得这个方法是能访问到第三方接口的方法。public static String SMS3(String postData,String postUrl){try{URL url = new URL(postUrl);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("POST");conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");conn.setUseCaches(false);conn.setDoOutput(true);conn.setDoInput(true);OutputStreamWriter out= new OutputStreamWriter(conn.getOutputStream(),"UTF-8");out.write(postData);out.flush();out.close();if(conn.getResponseCode()!=HttpURLConnection.HTTP_OK){System.out.println("connect failed!");return "";}String line,result = "";BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));while((line= in.readLine()) != null){result += line+"\n";}in.close();return result;}catch(IOException e){e.printStackTrace(System.out);}return "";} }

        其中:

        1、我从第三方那要了一个demo,从中摘出来自己需要用的代码。

        2、短信接口有固定模板和变量模板, 这里我们用到的是变量模板,因为验证码是个变量。

           

         3、接口文档里给的很清楚:

            

            


         4、其中最后一步保存,该手机号的验证码和发送时间,用到了一个Map保存。

           

private final static Map<String, TestCodeInforVo> testCodeInforMap = new HashMap<String,TestCodeInforVo>();
  

          发送完验证码之后:

          

testCodeInforMap.put(phoneNumber,testCodeInfor);
         保存到了map里面,到时候找验证码和时间,也从这个map里面找,手机号是key,这个保存着验证码和时间的实体是value。


         短信验证码就到此告一段落。接下来看登陆的逻辑:

 


   登陆的过程:

                                      


          登陆代码:

           

/*** 用户登录接口* @param json 登录参数* @return 登录成功返回用户信息*/@RequestMapping("/login")@ResponseBodypublic LoginResult login(@RequestParam(value="testCode",defaultValue="") String testCode,@RequestParam(value="identity",defaultValue="") String identity,@RequestParam(value="phone",defaultValue="") String phone, HttpServletRequest request){//String serverPath =   request.getScheme() + "://"+ request.getServerName() + ":" + //	request.getServerPort()+request.getContextPath() + "/";LoginResult result = new  LoginResult();if( identity == null || identity.length() == 0 ){result.setState(Result.ERROR);result.setMessage("证件号为空");return result;}if(phone== null || phone.length() == 0 ){result.setState(Result.ERROR);result.setMessage("手机号为空");return result;}if( testCode == null || testCode.length() == 0 ){result.setState(Result.ERROR);result.setMessage("验证码为空");return result;}TestCodeInforVo testCodeInfor =  (TestCodeInforVo) testCodeInforMap.get(phone);if( testCodeInfor == null || testCodeInfor.getCode() == null || testCodeInfor.getCode().length()==0 ){result.setState(Result.ERROR);result.setMessage("验证码不存在");return result;}if(!testCode.equals(testCodeInfor.getCode())){result.setState(Result.ERROR);result.setMessage("验证码错误");return result;}testCodeInforMap.remove(phone);//验证验证码是否过期if( System.currentTimeMillis()- testCodeInfor.getDate() > testCodeOutDate ){result.setState(Result.ERROR);result.setMessage("验证码已过期");return result;}  List<UserEntity> users = userService.getUserByPhoneIdentity(phone,identity);if( users.isEmpty()){result.setState(Result.ERROR);result.setMessage("用户不存在");return result;}if( users.size() !=  1){result.setState(Result.ERROR);result.setMessage("认证用户不唯一");return result;} if(  users.get(0).getAccountStatus() != null &&  users.get(0).getAccountStatus().equals("0")){result.setState(Result.ERROR);result.setMessage("该用户被冻结");return result;}UserEntity user  = users.get(0);user.setQrCode(user.getQrCode());user.setPersonalPhotos(user.getPersonalPhotos());user.setIdCardAvatarFace(user.getIdCardAvatarFace());user.setIdCardNationalEmblem(user.getIdCardNationalEmblem());String siteID="";//根据user的role去判断该用户所在的站点IDif (user.getRole()==0) {//0是管理员//根据用户的ID去站点表里查询站点的最早添加的哪一个站点IdsiteID=userService.findSiteIDByTimeAdmin(user.getId());}if(user.getRole()==2)//2是业主{//根据用户的ID去站点表里查询站点的最早添加的哪一个站点IdsiteID=userService.findSiteIDByTimeOwner(user.getId());}if (user.getRole()==1) {//1是营业员//营业员对应的,最早添加的哪一个站点IdsiteID=userService.findSiteIDByTimeOwnerSale(user.getId());}user.setSiteID(siteID);result.setState(Result.SUCCESS);result.setMessage("登录成功");AppLoginUser appUser=new AppLoginUser();HttpSession session=request.getSession();appUser.setUserID(user.getId());appUser.setUserName(user.getName());appUser.setUserNum(user.getUserNumber());OrgStructure org=orgService.getOrgByAccount(user.getName());//appUser.setOrgId(org.getOrgId());session.setAttribute("appLoginUser", appUser);result.setData(user);return result;}


        其中:

        1、判断验证码是否正确:(从刚才那个map里面,根据手机号取值)

          

TestCodeInforVo testCodeInfor =  (TestCodeInforVo) testCodeInforMap.get(phone);

         从这个实体里面取出验证码和时间。


         2、验证码是否过期:

          过期时间:

          

private final static long testCodeOutDate = 5*60*1000;  //验证码过期时间


//验证验证码是否过期if( System.currentTimeMillis()- testCodeInfor.getDate() > testCodeOutDate ){result.setState(Result.ERROR);result.setMessage("验证码已过期");return result;} 
 

            验证完之后删除他:

         

testCodeInforMap.remove(phone);
 

          3、当初想的是存到session里面会怎么写,还没想好,希望路过的大神指导。



 小结:

      发送验证码和登陆的逻辑之前觉得挺复杂的,当画图总结一遍之后,思路就清楚多了,还是要静下心来多总结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/4474.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT专业应用:生成新闻稿

正文共 949 字&#xff0c;阅读大约需要 4 分钟 媒体工作者必备技巧&#xff0c;您将在4分钟后获得以下超能力&#xff1a; 生成新闻稿 Beezy评级 &#xff1a;A级 *经过寻找和一段时间的学习&#xff0c;一部分人能掌握。主要提升效率并增强自身技能。 推荐人 | Kim 编辑者…

ChatGPT专业应用:创作对联

正文共 727 字&#xff0c;阅读大约需要 3 分钟 文化工作者必备技巧&#xff0c;您将在3分钟后获得以下超能力&#xff1a; 创作对联 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Yolanda ●此图片由L…

如何高效性的使用ChatGPT

目录 简单介绍 考虑以下几点 举几个例子 简单介绍 ChatGPT是由OpenAI开发的一种自然语言处理模型&#xff0c;它基于GPT&#xff08;Generative Pre-trained Transformer&#xff09;架构&#xff0c;旨在为用户提供更加流畅、准确的对话体验。 ChatGPT通过在大规模的互联网…

Claude在线AI注册教程(免费、可平替Chatgpt)

Claude 是Anthropic公司开发的AI聊天机器人&#xff0c;与ChatGPT类似&#xff0c;由OpenAI前副总裁创办。虽然比不上GPT4&#xff0c;但在连续对话能力、写小说、编写代码、解释概念等方面表现出色 Claude 目前还处于免费使用阶段&#xff0c;只需注册一个Slack账号即可以&am…

「ChatGPT最强竞品」爆火:不限量不要钱免注册!一手实测体验在此

点击上方“视学算法”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 金磊 丰色 发自 凹非寺量子位 | 公众号 QbitAI 家人们&#xff0c;终于&#xff01;终于&#xff01; 免费、支持中文、无需注册、不用骚操作直接可用的类ChatGPT产品&…

AIGC——使用Cursor对比直接使用chatGPT有哪些技巧

Cursor等chatGPT相关工具的那些用法 1. 聊聊it团队经常面临的问题2. 试想一些AI辅助的应用场景3. 看回现实可用的工具及其使用3.1 加载文件作为对话上下文3.2 源码工程辅助阅读3.3 批量文件式输入口3.4 规范核查工具3.5 写PPT3.6 口述业务流程或逻辑生成持续图流程图 4 通用思路…

ChatGPT 创业:如何用人工智能 AI 开一家赚钱的公司

这是一篇演示如何使用 ChatGPT prompt &#xff08;提示词&#xff09;的文章。 在了解 ChatGPT 的文案写作能力后&#xff0c;我产生了一个念头&#xff0c;如果让它来写一篇命题作文&#xff0c;会是怎样&#xff1f; Prompt 提示词&#xff0c;和人工智能 AI 对话中一个重要…

如何高效使用 ChatGPT?

最近 ChatGPT 非常火。如果你刷社交媒体&#xff0c;大概已经被各种消息搞得头晕脑胀。从大佬到普通人都对这个话题表现出了浓厚的兴趣&#xff0c;就连 ChatGPT 为主题的学术研讨会通知我都已经收到 3 份了。 参与到这个话题里自然是有好处的&#xff0c;例如可以更容易获取流…

2023 ChatGPT v3.5 谷歌浏览器插件

重要的事情说三遍&#xff1a;免费 免费 免费 安装步骤&#xff1a; 1. 电脑下载谷歌浏览器&#xff0c;如果有&#xff0c;请忽略此步。 2. 下载插件 3. 打开谷歌浏览器&#xff0c;开启右上角开发者模式 4. 将下载的插件解压后&#xff0c;进入子目录&#xff0c;拖入浏…

【chatgpt插件-ChatGPT Sidebar】

ChatGPT Sidebar google chrome插件搜索

ChatGPT插件:让你的 ChatGPT 与众不同!

这个 Chrome 浏览器插件是作者觉得原本的 ChatGPT 界面不太丰富&#xff0c;然后想着自己写一个插件把它变得更加好看一点 &#x1f92a;&#xff0c;因此把这个插件取名为 ChatGPT-theme&#xff0c;目前插件已经发布了是 1.0.1 版本的&#xff0c;因为 1.0.0 作者测了一下有些…

这个 Chrome 插件,让你的 ChatGPT 不再报错

ChatGPT的官网最近几天报错越来越频繁了&#xff0c;相信大家都发现了。 一旦你离开页面时间比较久&#xff0c;再度返回跟它进行对话&#xff0c;就会出现如下报错&#xff1a; 虽然这个报错信息以前也出现过&#xff0c;但现在的频率确实过高&#xff0c;对于每天需要使用 C…

谷歌验证码reCAPTCHA的运用

写在前面 提示&#xff1a;reCAPTCHA因为依赖谷歌网站验证&#xff0c;在国内是无法使用的。但是谷歌提供了国内接口&#xff0c;将google.com替换为recaptcha.net即可。 reCAPTCHA在国内的接口示例&#xff1a;https://www.recaptcha.net/recaptcha/api2/demo 本文中对于所有…

谷歌验证码recaptcha接入

recaptcha是一项谷歌免费验证码服务&#xff0c;本次接入的是reCaptcha v2 1、首先选择reCaptcha的类型&#xff0c;注册申请api密钥对&#xff0c;包含站点密钥和密钥组成&#xff0c;站点密钥用于在网站调用reCAPTCHA服务&#xff0c;密钥则是验证应用后端和 reCAPTCHA 服务校…

技巧|使用Chatgpt在聊天界面直接显示公式

ChatGPT的使用已经越来越多&#xff0c;从问问题到写代码&#xff0c;但是有些时候&#xff0c;当我们问一些数学问题的时候&#xff0c;由于要显示公式&#xff0c;ChatGPT会直接给我们输出Latex代码。有Latex代码当然是好&#xff0c;我们可以把它放到编辑器编辑即可。 但是说…

python实现ChatGPT连续多轮对话

代码如下。注意&#xff0c;api_key需要改成自己的密钥才能成功运行。 import openaiapi_key "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"openai.api_key api_keydef askChatGPT(messages):MODEL "gpt-3.5-turbo"response openai.ChatCom…

用这三本书,探究 ChatGPT 的底层逻辑

最近爆火的ChatGPT能够很好地理解人类的语言&#xff0c;并以流畅且符合逻辑的自然语言来反馈。刚刚发布的GPT-4更是在各种学科考试&#xff08;美国高考SAT、研究生入学考试GRE等&#xff09;和专业考试&#xff08;律师考试等&#xff09;中能拿到前10%的成绩。某种程度上&am…

超火的ChatGPT技术原理与我们关系

文章目录 1 ChatGPT简介2 ChatGPT发展历程3 ChatGPT原理4 ChatGPT与我们关系4.1 ChatGPT与大数据关系4.2 ChatGPT与Java关系 4.3 ChatGPT时代机遇4.4 ChatGPT存在的问题4.5 ChatGPT发展思考 1 ChatGPT简介 众所周知&#xff0c;最近&#xff0c;由美国人工智能公司OpenAI推出的…

这10本书,带你了解 ChatGPT 的底层逻辑!

文章来源&#xff1a;人民邮电出版社 自2022年11月30日发布以来&#xff0c;ChatGPT已经真正意义上地火爆全球&#xff1a;它在不到40天内就拥有了1000万用户&#xff0c;而Instagram足足用了355天&#xff1b;最近它的日活已经达到1000万&#xff0c;这意味着其用户已经超过20…

底层逻辑是什么意思7个,底层逻辑是谁提出来的

本篇文章给大家谈谈底层逻辑是什么意思7个&#xff0c;以及底层逻辑是谁提出来的&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收x藏x本x站喔。 1、chatgpt是什么? chatgpt介绍如下&#xff1a; ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器…