日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

手机发送短信验证码登录完整实例

發(fā)布時(shí)間:2023/12/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手机发送短信验证码登录完整实例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

項(xiàng)目需求

后臺(tái)生成隨機(jī)6位數(shù)作為驗(yàn)證碼,發(fā)送給手機(jī),同時(shí)將驗(yàn)證碼存入緩存,用戶登錄時(shí)驗(yàn)證輸入的驗(yàn)證碼是否過期或者是否正確。

一、發(fā)送短信

1.了解短信發(fā)送

通過發(fā)送短信的API,建立一個(gè)URL類的對(duì)象打開網(wǎng)絡(luò)連接,通過連接對(duì)象得到輸入流,就能實(shí)現(xiàn)短信發(fā)送 URL url= new URL(""https://XXXXXX?phoneNumbers=[手機(jī)號(hào)]&content=[短信內(nèi)容]"");//使用方法,拼接參數(shù) url.openConnection().getInputStream(); 封裝上述方法 import com.alibaba.fastjson.JSONObject; import org.apache.commons.lang.StringUtils;import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry;public class SendRequestMethod {/*** 向指定 URL 發(fā)送POST方法的請(qǐng)求** @param url 發(fā)送請(qǐng)求的 URL* @param param 請(qǐng)求參數(shù),請(qǐng)求參數(shù)應(yīng)該是 name1=value1&name2=value2 的形式。* @return 所代表遠(yuǎn)程資源的響應(yīng)結(jié)果*/public static String postMethod(String url, String param, Map<String, String> headParam) {Long s0 = System.currentTimeMillis();PrintWriter out = null;BufferedReader in = null;String result = "";try {URL realUrl = new URL(url);// 打開和URL之間的連接HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();// 設(shè)置通用的請(qǐng)求屬性conn.setRequestProperty("accept", "*/*");conn.setRequestMethod("POST");conn.setRequestProperty("Accept-Charset", "UTF-8");conn.setRequestProperty("Content-Type", "application/json");conn.setRequestProperty("charset","UTF-8");if (headParam != null) {for (Entry<String, String> entry : headParam.entrySet()) {conn.setRequestProperty(entry.getKey(), entry.getValue());}}// 發(fā)送POST請(qǐng)求必須設(shè)置如下兩行conn.setUseCaches(false);conn.setDoOutput(true);conn.setDoInput(true);conn.setConnectTimeout(1000000);conn.setReadTimeout(1000000);// 獲取URLConnection對(duì)象對(duì)應(yīng)的輸出流if(StringUtils.isNotBlank(param)){out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(),"utf-8"));out.write(param);// flush輸出流的緩沖out.flush();}// 定義BufferedReader輸入流來讀取URL的響應(yīng)in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("發(fā)送 POST 請(qǐng)求出現(xiàn)異常!" + e);System.out.println(JSONObject.toJSONString(e));e.printStackTrace();}//使用finally塊來關(guān)閉輸出流、輸入流finally {try {if (out != null) {out.close();}if (in != null) {in.close();}} catch (IOException ex) {ex.printStackTrace();}}return result;}

發(fā)送短信設(shè)置發(fā)送內(nèi)容和手機(jī)號(hào)

import com.alibaba.fastjson.JSONObject; import com.wisesoft.core.util.prop.PropertiesUtil; import org.apache.commons.lang.StringUtils;import java.util.*;public class SendMessage {/*** 短信API服務(wù)器地址(根據(jù)自己的url設(shè)置)*/private static String pathUrl= "http://xxxxx";public static JSONObject send(String content,String... phoneNumbers){JSONObject param = new JSONObject(2);param.put("content",content);param.put("phoneNumbers", StringUtils.join(phoneNumbers,","));Map<String,String> headParam = new HashMap<>();headParam.put("Content-Type","application/json;charset=UTF-8");String requestResult = SendRequestMethod .postMethod(pathUrl,param.toJSONString(),headParam);JSONObject result = JSONObject.parseObject(requestResult );return result;} }

二、手機(jī)號(hào)登錄

1.發(fā)送短信接口

寫接口之前,先寫個(gè)緩存(這里用的是Redis)的工具類(只寫了要用的兩個(gè)方法)

package com.wisesoft.scenic.service.joggle.utils.redis;import com.wisesoft.core.util.StringUtil; import com.wisesoft.core.util.prop.FrameworkProps; import com.wisesoft.scenic.interfaceserver.vo.InterfaceServerVO; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.JedisSentinelPool;import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set;public class RedisUtil {private static JedisSentinelPool sentinelPool;private static JedisPool jedisPool;static {String str_host = getProperty("redis.host", "");String str_port = getProperty("redis.port", "");String password = getProperty("redis.password", "");int database = getProperty("redis.database", 0);int timeout = getProperty("redis.timeout", 5000);String runmodel = getProperty("redis.runmodel", "");//連接池配置JedisPoolConfig config = new JedisPoolConfig();config .setMaxTotal(10);config .setMaxIdle(5);config .setMinIdle(5);.....if (StringUtil.isNotBlank(runmodel) && "cluster".equalsIgnoreCase(runmodel)) {// mastername是我們配置給哨兵的服務(wù)名稱String mastername = getProperty("redis.mastername", "");int port = 6379;// 哨兵信息(舉例,根據(jù)實(shí)際情況不同配置)Set<String> sentinels = new HashSet<String>(Arrays.asList("10.201.7.171:26379","10.201.7.175:26379","10.201.7.176:26379"));sentinelPool = new JedisSentinelPool(mastername, sentinels, config, timeout, password, database);} else {int port = Integer.valueOf(str_port);jedisPool = new JedisPool(config, str_host, port, timeout, password);}}private RedisClient() {}public static String getProperty(String name, String defaultValue) {return FrameworkProps.getProperty(name, defaultValue);}/*** 設(shè)置緩存(沒有過期時(shí)間)* */public static String set(String key, String value) {Jedis jedis = getJedis();try {String val = jedis.set(key, value);return val;} finally {jedis.close();}}public static String get(String key) {Jedis jedis = getJedis();try {String val = jedis.get(key);return val;} finally {jedis.close();}}/*** 設(shè)置緩存(有過期時(shí)間)* */public static String set(String key, String value, int second) {Jedis jedis = getJedis();try {String val = jedis.set(key, value);jedis.expire(key, second);return val;} finally {jedis.close();}}public static Long del(String key) {Jedis jedis = getJedis();try {Long obj = jedis.del(key);return obj;} finally {jedis.close();}}/*** 獲取客戶端連接* */public static Jedis getJedis() {if (sentinelPool != null) {return sentinelPool.getResource();}return jedisPool.getResource();}}

發(fā)送短信接口代碼如下:

@RequestMapping(value = "/sendMessage", method = RequestMethod.POST, produces = "application/json;charset=utf-8")@ResponseBodypublic String sendMessage(@RequestBody String jsonStr) {JSONObject object = JSON.parseObject(jsonStr);String phone = object.getString("phone");JSONObject object = new JSONObject();// 隨機(jī)生成驗(yàn)證碼String verifyCode = (int)(Math.random()* 900000 + 100000)+"";// redis配置,實(shí)際應(yīng)該封裝一個(gè)工具類,這里簡(jiǎn)單寫一下RedisUtil.set(phone + "_verifyCode", verifyCode, 600);String content = "【CSDN】驗(yàn)證碼:"+verifyCode+",您正在使用短信驗(yàn)證碼登錄,有效期10分鐘。";JSONObject send = SendMessage.send(content, phone);if(send != null && 200 == send.getIntValue("code")){object.put("code",0);object.put("msg","發(fā)送成功"); return object.toString();} else {object.put("code",1);object.put("msg","發(fā)送失敗"); return object.toString();}}

2.登錄接口

代碼如下:

@RequestMapping(value = "/login", method = RequestMethod.POST, produces = "application/json;charset=utf-8")@ResponseBodypublic String login(@RequestBody String jsonStr) {JSONObject object = JSON.parseObject(jsonStr);String phone = object.getString("phone");String verifyCode = object.getString("verifyCode");JSONObject object = new JSONObject();if (StringUtils.isEmpty(phone) || StringUtils.isEmpty(verifyCode)) {object.put("code",1);object.put("msg","手機(jī)號(hào)或驗(yàn)證碼不能為空"); return object.toString();} else if (!loginService.checkPhone(phone)) {object.put("code",1);object.put("msg","輸入的手機(jī)號(hào)非法,請(qǐng)輸入正確的手機(jī)號(hào)"); return object.toString();}return loginService.loginByPhone(phone, verifyCode);}

登錄業(yè)務(wù)邏輯

@Overridepublic String loginByPhone(String phone, String verifyCode) {JSONObject object = new JSONObject();// 獲取短信驗(yàn)證碼String codeStr = RedisUtil.get(phone + "_verifyCode");if (StringUtil.isEmpty(codeStr)) {object.put("code",1);object.put("msg","驗(yàn)證碼已失效,請(qǐng)重新發(fā)送"); return object.toString();}// 判斷驗(yàn)證碼是否正確if (verifyCode.equals(codeStr)) {// 查詢用戶信息User user = userService.getByPhone(phone);Date date = new Date();// 用戶登錄信息UserAccount account = new UserAccount();// 判斷賬號(hào)是否存在if (user == null) {// 用戶不存在,則注冊(cè)賬號(hào)User userInfo= new User();userInfo.setId(UuidUtil.generateUUID());userInfo.setPhoneNum(phone);userInfo.setCreateTime(date);userInfo.setUpdateTime(date);userInfo.setRegTime(date);userInfo.setLastLoginTime(date);userService.insert(userInfo);BeanUtils.copyProperties(userInfo,account);} else {// 用戶存在if (user.getLastLoginTime() != null) {date = user.getLastLoginTime();}BeanUtils.copyProperties(user,account);// 更新登錄信息user.setLastLoginTime(new Date());userService.update(user);}// 設(shè)置緩存(沒有過期時(shí)間)String userJson = JSONObject.toJSONString(account);RedisUtil.set("user" + account.getUserId(), userJson);object.put("code",0);object.put("msg","登錄成功"); object.put("result",account); return object.toString();} else {object.put("code",1);object.put("msg","輸入驗(yàn)證碼不正確"); return object.toString();}}@Overridepublic boolean checkPhone(String phone) {// 手機(jī)號(hào)格式(不驗(yàn)證號(hào)碼段)Pattern p = Pattern.compile("^^1[0-9]{10}$");Matcher m = p.matcher(phone);return m.matches();}

總結(jié)

以上就是今天要講的內(nèi)容,本文僅僅簡(jiǎn)單介紹了手機(jī)驗(yàn)證碼登錄的流程,很多細(xì)節(jié)并沒有深入,若有問題,還請(qǐng)大家多多指教。

總結(jié)

以上是生活随笔為你收集整理的手机发送短信验证码登录完整实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。