登入模組(手機驗證碼)
本人為實習生,第一次寫部落格,寫的不好的大家多多諒解
應公司近期需求,需要單獨開發一個後臺管理系統。
自己按實際業務寫了一個登入介面已經實現,時序圖如下
原始碼牽扯業務量太大,這裡只放出部分關鍵實現原始碼,整合思路可以配合時序圖去理解。
Controller層
package com.royalnu.business.login.franchisee.gateway.web; import java.sql.Timestamp; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.poi.util.StringUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.alibaba.druid.util.StringUtils; import com.fasterxml.jackson.core.JsonProcessingException; import com.royalnu.common.exception.CommonException; import com.royalnu.common.security.MD5Utils; import com.royalnu.common.utils.json.GsonUtil; import com.royalnu.common.validate.json.JsonSchemaValidator; import com.royalnu.core.component.cache.redis.service.StringRedisCache; import com.royalnu.core.module.com.BaseController; import com.royalnu.business.login.franchisee.api.model.Franchisee; import com.royalnu.business.login.franchisee.api.service.FranchiseeService; import com.royalnu.business.login.franchiseeDetailed.api.model.FranchiseeDetailed; import com.royalnu.business.login.franchiseeDetailed.api.service.FranchiseeDetailedService; import com.royalnu.business.login.message.api.model.Message; import com.royalnu.business.login.message.api.service.MessageService; import com.royalnu.util.FilePath; import com.royalnu.util.FranchiseeMethodUtils; import com.royalnu.util.FranchiseeParamUtils; import com.royalnu.util.InitializationUtil; import com.royalnu.util.IpUtil; import com.royalnu.util.RedisKeyPrefixUtil; import com.royalnu.util.SingleSendSms; import com.royalnu.util.VerifyCode; import lombok.extern.log4j.Log4j2; @Log4j2 @SuppressWarnings("unused") @RestController @RequestMapping(value = "/franchisee/login") public class FranchiseeController extends BaseController<Franchisee> { @Autowired private FilePath filePath; @Resource private FranchiseeService franchiseeService; @Resource private FranchiseeDetailedService franchiseeDetailedService; @Resource private MessageService messageService; @Resource private StringRedisCache stringRedisCache; @Autowired private HttpSession session; private IpUtil ipUtil = new IpUtil(); // 加盟商登入入口 附手機驗證碼 @RequestMapping(value = "/dologin", method = RequestMethod.POST) public String dologin(Franchisee franchisee, HttpServletRequest request,HttpServletResponse response) throws CommonException { Map<String, Object> data = new HashMap<String, Object>(); Map<String, Object> params = new HashMap<>(); // 驗證請求手機號 String codeTelephone = request.getParameter("codeTelephone"); // 驗證碼 String codeNum = request.getParameter("codeNum"); // 獲取ip地址 String UserIp = ipUtil.getIpAddr(request); // 獲取系統當前時間 Timestamp currentTime = new Timestamp(System.currentTimeMillis()); // 模擬前端加密傳參 /*String idip = "ww-" + franchisee.getTelephone() + "{xykj}" + UserIp + "+lsw";*/ String idipPassword = request.getParameter("idipPassword"); // 後臺解密獲取正確引數 if(idipPassword==null||idipPassword.equals("")) { data.put("code", 2); data.put("msg", "訪問源IP地址非法,請確認"); return GsonUtil.GSON.toJson(data); } String idipPassword1 = idipPassword.substring(3, idipPassword.length() - 4).replace("{xykj}", ""); Message message1 = messageService.getNewestMessage(codeTelephone); Franchisee franchisee1 = franchiseeService.selectByQuery(franchisee); if (franchisee1 == null) { data.put("code", 1); data.put("msg", "賬號或密碼輸入錯誤"); return GsonUtil.GSON.toJson(data); } else if (!idipPassword1.equals(franchisee.getTelephone() + UserIp)) { data.put("code", 2); data.put("msg", "訪問源IP地址非法,請確認"); return GsonUtil.GSON.toJson(data); } int count = franchiseeDetailedService.selectTelephoneByCount(franchisee.getTelephone()); if (count <= 0) { FranchiseeDetailed fd1 = new FranchiseeDetailed(); fd1.setCreateTime(new Date()); fd1.setRealIp(UserIp); fd1.setFId(franchisee1.getId()); // 插入加盟商詳細表記錄登入情況 franchiseeDetailedService.insertSelective(fd1); } FranchiseeDetailed fd = franchiseeDetailedService.selectByTelephone(franchisee1.getTelephone()); // 判斷前端是否接受到引數 if (codeTelephone == null || codeTelephone.equals("") && codeNum == null || codeNum.equals("")) { // 當天是否獲取過驗證碼,同天IP地址是否發生改變 if (fd != null && fd.getLastTime() != null && fd.getLastTime().getYear() == currentTime.getYear() && fd.getLastTime().getMonth() == currentTime.getMonth() && fd.getLastTime().getDay() == currentTime.getDay() && UserIp.equals(fd.getRealIp())) { String token = MD5Utils.md5(franchisee.getUserName() + franchisee.getPassword() + System.currentTimeMillis()); fd = franchiseeDetailedService.selectByTelephone(franchisee1.getTelephone()); fd.setRealIp(UserIp); fd.setFId(franchisee1.getId()); fd.setLastTime(new Date()); fd.setToken(token); // 插入加盟商詳細表記錄登入情況 franchiseeDetailedService.updateByPrimaryKeySelective(fd); //插入cokie,redis this.getUserCokieRedis(franchisee, response); data.put("code", 3); data.put("msg", "登陸成功"); return GsonUtil.GSON.toJson(data); // 需要重新獲取新驗證碼 } else if (fd == null || fd.getLastTime() == null || (fd.getLastTime().getYear() != currentTime.getYear() || fd.getLastTime().getMonth() != currentTime.getMonth() || fd.getLastTime().getDay() != currentTime.getDay()) || !UserIp.equals(fd.getRealIp())) { fd = franchiseeDetailedService.selectByTelephone(franchisee1.getTelephone()); fd.setRealIp(UserIp); fd.setUpdateTime(new Date()); fd.setFId(franchisee1.getId()); franchiseeDetailedService.updateByPrimaryKeySelective(fd); data.put("code", 4); data.put("msg", "系統檢測您在一臺新的裝置或者當天第一次登入,為保障您\r\n" + "的賬戶安全,需要進行一次身份核實。"); return GsonUtil.GSON.toJson(data); } else { data.put("code", 5); data.put("msg", "檢測到異常"); return GsonUtil.GSON.toJson(data); } // 需要驗證碼登入 } else { if (message1 == null) { data.put("code", 6); data.put("msg", "驗證碼傳送異常,請重新獲取驗證碼"); return GsonUtil.GSON.toJson(data); } else if (messageService.getCurListCount(params) >= 100) { data.put("code", 7); data.put("msg", "驗證碼獲取次數超限,請聯絡運營人員"); return GsonUtil.GSON.toJson(data); } else if (!codeNum.equals(message1.getCode())) { fd = franchiseeDetailedService.selectByTelephone(franchisee1.getTelephone()); fd.setRealIp(UserIp); fd.setFId(franchisee1.getId()); fd.setUpdateTime(new Date()); // 插入加盟商詳細表記錄登入情況 franchiseeDetailedService.updateByPrimaryKeySelective(fd); data.put("code", 8); data.put("msg", "驗證碼輸入錯誤"); return GsonUtil.GSON.toJson(data); } else { String token = MD5Utils.md5(franchisee.getUserName() + franchisee.getPassword() + System.currentTimeMillis()); fd = franchiseeDetailedService.selectByTelephone(franchisee1.getTelephone()); fd.setRealIp(UserIp); fd.setFId(franchisee1.getId()); fd.setLastTime(new Date()); fd.setToken(token); // 插入加盟商詳細表記錄登入情況 franchiseeDetailedService.updateByPrimaryKeySelective(fd); //插入cokie,redis this.getUserCokieRedis(franchisee, response); data.put("code", 3); data.put("msg", "登陸成功"); return GsonUtil.GSON.toJson(data); } } } //獲取驗證碼方法 @RequestMapping(value = "/dogetCode", method = RequestMethod.POST) public String getCode(HttpServletRequest request) throws Exception { Map<String, Object> data = new HashMap<String, Object>(); // 驗證請求手機號 String codeTelephone = request.getParameter("codeTelephone"); // 新增驗證碼 Message message = new Message(); message.setTelephone(codeTelephone); // 生成驗證碼 VerifyCode v = new VerifyCode(); String code = v.productCode(); // 傳送驗證碼 SingleSendSms app = new SingleSendSms(); app.sendMsg(codeTelephone, code); // 插入訊息 message.setCode(code); message.setCreatetime(new Date()); message.setState(1); messageService.insertSelective(message); data.put("code", 5); data.put("msg", "已經發送驗證碼,請查收"); return GsonUtil.GSON.toJson(data); } //插入cokie,redis public void getUserCokieRedis(Franchisee franchisee, HttpServletResponse response) { Franchisee franchisee1 = franchiseeService.selectByQuery(franchisee); // 登入名+密碼+時間戳進行md5加密生產token String token = MD5Utils.md5(franchisee1.getUserName() + franchisee1.getPassword() + System.currentTimeMillis()); // 傳送cookie FranchiseeMethodUtils.responseCookie(response, franchisee1.getId(), franchisee1.getUserName(), token); // 往快取放置登入token,以便後續所有操作的驗證 stringRedisCache.set(FranchiseeParamUtils.REDIS_FRANCHISEE_PREFIX + franchisee1.getUserName() + "-" + franchisee1.getId(), token, FranchiseeParamUtils.REDIS_TIMEOUT_TOKEN, FranchiseeParamUtils.REDIS_UNIT_TOKEN); } }
獲取使用者IP地址
package com.royalnu.util; import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHostException; public class IpUtil { /** * 獲取登入使用者IP地址 * * @param request * @return */ public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); if (ip.equals("127.0.0.1")) { //根據網絡卡取本機配置的IP InetAddress inet = null; try { inet = InetAddress.getLocalHost(); } catch (UnknownHostException e) { e.printStackTrace(); } ip = inet.getHostAddress(); } } // 對於通過多個代理的情況,第一個IP為客戶端真實IP,多個IP按照','分割 if(ip != null && ip.length() > 15){ if(ip.indexOf(",") > 0){ ip = ip.substring(0, ip.indexOf(",")); } } return ip; } }
驗證碼實體類
產生隨機數(驗證碼)package com.royalnu.util; import com.royalnu.core.module.com.Identifiable; import java.util.Date; import lombok.Getter; import lombok.Setter; @Setter @Getter public class Message extends Identifiable { private static final long serialVersionUID = 1L; /** * <pre> * </pre> * */ private String telephone; /** * <pre> * </pre> * */ private String code; /** * <pre> * </pre> * */ private Date createtime; /** * <pre> * </pre> * */ private String connectId; /** * <pre> * </pre> * */ private Integer state; /** * <pre> * </pre> * */ private String remark; }
package com.royalnu.util;
import java.util.Random;
public class MyRandom {
static Random r = new Random();
static String ssource = "0123456789";
static char[] src = ssource.toCharArray();
//產生隨機字串
private static String randString (int length)
{
char[] buf = new char[length];
int rnd;
for(int i=0;i<length;i++)
{
rnd = Math.abs(r.nextInt()) % src.length;
buf[i] = src[rnd];
}
return new String(buf);
}
//呼叫該方法,產生隨機字串,
//引數i: 為字串的長度
public static String runVerifyCode(int i)
{
String VerifyCode = randString(i);
return VerifyCode;
}
public static void main(String[] args) {
MyRandom t=new MyRandom();
System.out.println(t.runVerifyCode(6));
}
}
package com.royalnu.util;
import java.util.Random;
public class VerifyCode {
private int codeCount = 6;
char[] codeSequence = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
public String productCode() {
// 建立一個隨機數生成器類
Random random = new Random();
// randomCode用於儲存隨機產生的驗證碼,以便使用者登入後進行驗證。
StringBuffer randomCode = new StringBuffer();
// 隨機產生codeCount數字的驗證碼。
for (int i = 0; i < codeCount; i++) {
// 得到隨機產生的驗證碼數字。
String strRand = String.valueOf(codeSequence[random.nextInt(10)]);
// 將產生的四個隨機數組合在一起。
randomCode.append(strRand);
}
return randomCode.toString();
}
public static void main(String[] args) {
VerifyCode v = new VerifyCode();
System.out.println(v.productCode());
}
}
雲通訊簡訊API產品(需要pom.xml)
package com.royalnu.util;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
public class SingleSendSms {
// private final static String APP_KEY = "23865664"; // AppKey從控制檯獲取
// private final static String APP_SECRET =
// "4683eef32debc7e0d9847dc5924e0345"; // AppSecret從控制檯獲取
// private final static String SIGN_NAME = "創躍網路科技公司"; //
// 簽名名稱從控制檯獲取,必須是稽核通過的
// private final static String TEMPLATE_CODE = "SMS_72940060"; //
// 模板CODE從控制檯獲取,必須是稽核通過的
// private final static String HOST = "sms.market.alicloudapi.com"; //
// API域名從控制檯獲取
// 產品名稱:雲通訊簡訊API產品,開發者無需替換
static final String product = "Dysmsapi";
// 產品域名,開發者無需替換
static final String domain = "dysmsapi.aliyuncs.com";
static final String accessKeyId = "LTAIyH6tgxGSmnXK";
static final String accessKeySecret = "cBmLUp1FyoEVPA7swkwoTXj5fOKzb3";
/*
* 尊敬的${customer},歡迎您使用阿里大魚簡訊服務,阿里大魚將為您提供便捷的通訊服務!
*/
private final static String ERRORKEY = "errorMessage"; // 返回錯誤的key
// @phoneNum: 目標手機號,多個手機號可以逗號分隔;
// @params: 簡訊模板中的變數,數字必須轉換為字串,如簡訊模板中變數為${no}",則引數params的值為{"no":"123456"}
public void sendMsg(String phoneNum, String params) throws Exception {
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
// 初始化acsClient,暫不支援region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou",
accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product,
domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
// 組裝請求物件-具體描述見控制檯-文件部分內容
SendSmsRequest request = new SendSmsRequest();
// 必填:待發送手機號
request.setPhoneNumbers(phoneNum);
// 必填:簡訊簽名-可在簡訊控制檯中找到
request.setSignName("十一分便利店");
// 必填:簡訊模板-可在簡訊控制檯中找到
request.setTemplateCode("SMS_115680033");
// 可選:模板中的變數替換JSON串,如模板內容為"親愛的${name},您的驗證碼為${code}"時,此處的值為
request.setTemplateParam("{\"code\":" + "\"" + params + "\"}");
// 選填-上行簡訊擴充套件碼(無特殊需求使用者請忽略此欄位)
// request.setSmsUpExtendCode("90997");
// 可選:outId為提供給業務方擴充套件欄位,最終在簡訊回執訊息中將此值帶回給呼叫者
request.setOutId("yourOutId");
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
/*
* String path = "/singleSendSms";
*
* Request request = new Request(Method.GET, HttpSchema.HTTP + HOST,
* path, APP_KEY, APP_SECRET, Constants.DEFAULT_TIMEOUT);
*
* // 請求的query Map<String, String> querys = new HashMap<String,
* String>(); querys.put("SignName", SIGN_NAME);
* querys.put("TemplateCode", TEMPLATE_CODE); querys.put("RecNum",
* phoneNum); querys.put("ParamString", params);
* request.setQuerys(querys);
*
* try { Map<String, String> bodymap = new HashMap<String, String>();
* Response response = Client.execute(request); //
* 根據實際業務需要,調整對response的處理 if (null == response) {
* System.out.println("no response"); } else if (200 !=
* response.getStatusCode()) { System.out.println("StatusCode:" +
* response.getStatusCode()); System.out .println("ErrorMessage:" +
* response.getErrorMessage()); System.out.println("RequestId:" +
* response.getRequestId()); } else { bodymap =
* ReadResponseBodyContent(response.getBody()); if (null !=
* bodymap.get(ERRORKEY)) { // 當傳入的引數不合法時,返回有錯誤說明
* System.out.println(JSON.toJSONString(bodymap));
* System.out.println(bodymap.get(ERRORKEY)); } else { //
* 成功返回map,對應的key分別為:message、success等
* System.out.println(JSON.toJSONString(bodymap)); } } } catch
* (Exception e) { System.out.println(e.getMessage()); }
*/
}
private Map<String, String> ReadResponseBodyContent(String body) {
Map<String, String> map = new HashMap<String, String>();
try {
JSONObject jsonObject = JSON.parseObject(body);
if (null != jsonObject) {
for (Entry<String, Object> entry : jsonObject.entrySet()) {
map.put(entry.getKey(), entry.getValue().toString());
}
}
if ("false".equals(map.get("success"))) {
map.put(ERRORKEY, map.get("message"));
}
} catch (Exception e) {
map.put(ERRORKEY, body);
}
return map;
}
public static void main(String agrs[]) throws Exception {
SingleSendSms app = new SingleSendSms();
app.sendMsg("15817219181", "123456");
// app.sendMsg("15018669294", "{'customer':'David'}");
System.out.println("success");
}
}
<!-- 阿里雲簡訊服務 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.15</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.2.3</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.royalnu</groupId>
<artifactId>ms-message</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
相關推薦
登入模組(手機驗證碼)
本人為實習生,第一次寫部落格,寫的不好的大家多多諒解應公司近期需求,需要單獨開發一個後臺管理系統。自己按實際業務寫了一個登入介面已經實現,時序圖如下原始碼牽扯業務量太大,這裡只放出部分關鍵實現原始碼,整合思路可以配合時序圖去理解。Controller層package com.
python的random模組(生成驗證碼)
python的random模組(生成驗證碼) random模組常用方法 random.random() #生成0到1之間的隨機數,沒有引數,float型別 random.randint(1, 3) #生成引數1到引數2之間的隨機數,輸出為int型別,[1,3]
Bootstrap+web+Idea實現登入頁面(含驗證碼)
style.css(自己設定的css樣式) html { background: url("../../assets/img/windows-10.jpg") no-repeat center center fixed; -webkit-b
php通過curl擴展進行模擬登錄(含驗證碼)
程序 valid 做的 .cn ica ews fclose har user 以下為本人工作中遇到的需要做的事情,之前也沒怎麽用過curl,查了好多資料,才稍微弄明白一點;本文所有內容只是自己平日工作的記錄,僅供大家參考:<?php/*** 模擬登錄*/head
圖像識別練習(flash驗證碼)
探討 野比 2012由於破解可能給他人帶來困擾,所以我只說大概的思路,不會提供源碼。-----------------本次目標是www.iboling.com的flash驗證碼。這個網站很新穎,用的是flash動畫,隨機給出大小球,然後讓用戶用鼠標點擊相應的球,實現驗證碼輸入。像這樣本來這是個很不錯的思路,跳
winform模擬登陸(帶驗證碼)
CookieContainer cookies = new CookieContainer(); //驗證碼 &n
android session的使用(圖片驗證碼)
功能:android端要實現圖片驗證碼功能。 1、方法一:本地實現圖片驗證 在本地實現圖片驗證碼:這種方式,是不與伺服器驗證的,驗證碼在android端生成,並且自已校驗。 2、方法二:接收伺服器驗證圖片,提交時伺服器校驗。 這種方法,我
YII中順豐快遞查詢API(無驗證碼)
順豐快遞查詢API(無驗證碼) yii中:baseContoller.php public function get
三層架構(MVC)實現簡單登陸註冊驗證(含驗證碼)
前言在我的上一篇微博裡我已經提出了登陸的方法,當時我採取的是純servlet方式,因為當時剛接觸到servlet,正好網上沒有這方面的全面講解,所以我就發飆了。不過在現實生產中我們大多采用的三層架構。所
python--random模組(產生隨機值)、洗牌、驗證碼應用
前言: 在python中用於生成隨機數的模組是random,在使用前需要import random.random():生成一個0-1之間的隨機浮點數. random.uniform(a, b):生成[a,b]之間的浮點數. random.randi
註冊登入(設計圖片驗證碼)
圖片驗證碼的實現 (註冊、下單、支付均有涉及) 1. 目的: 1) 驗證操作者是否是人,不是機器。 2) 防止表單重複提交。每次提交要判斷驗證碼的正確與否 生成驗證碼的要點: 1) 使用java程式碼生成圖片物件 2) 使用Random生成隨機字串 3) 將圖片物件用 Imag
Django PIL模組(生成隨機驗證碼)
PIL簡介 什麼是PIL PIL:是Python Image Library的縮寫,影象處理的模組。主要的類包括Image,ImageFont,ImageDraw,ImageFilter PIL的匯入 首先需要安裝一下pillow包
利用scrapy爬取需要登入的網站的資料(包含驗證碼的處理)
利用scrapy爬取需要登入的網站的資料(包含驗證碼的處理)–以爬取豆瓣網資料為例 1、在cmd命令列中輸入 scrapy startproject douban,建立scrapy爬蟲專案 2、在cmd命令列中調整到douban專案資料夾下輸入 scrapy genspider -t
16 Django - 登入(含隨機生成圖片驗證碼)、註冊示例
Django - 登入(含隨機生成圖片驗證碼)、註冊示例 一、登入 - 隨機生成圖片驗證碼 1、隨機生成驗證碼 Python隨機生成圖片驗證碼,需要使用PIL模組,安裝方式如下: pip3 install pillo
關於登入(使用者名稱,密碼,驗證碼)
htmlajaxControllerUserServiceImpl驗證碼ControllerYzmServiceImpl宣告Constant類驗證碼util類package com.xinbo.www.utils; import org.slf4j.Logger;import org.slf4j.Logge
關於登入(用戶名,密碼,驗證碼)
客戶端 val dst urn 緩沖 color 內存 nco return htmlajaxControllerUserServiceImpl驗證碼ControllerYzmServiceImpl聲明Constant類驗證碼util類package com.xinbo.w
SSM框架下登入頁面,圖片驗證碼,密碼加密對比資料庫資料(二)
登入頁面的Controller的程式碼如下: 在這過程中,需要對填入資料進行判斷,是否為使用者名稱存在?是否密碼有誤?是否驗證碼有誤?如若都沒有錯誤則頁面跳轉至登入成功頁面。 @RequsetMapper("/login.do") public @Respons
網路爬蟲_網頁登入(蘇寧 有驗證碼)—基於HtmlUnit
輸入驗證碼: public static String getCode(){ System.out.println("請輸入驗證碼:"); Scanner sc = new Scanner(System.in); String code = s
註冊/找回密碼等功能中傳送手機驗證碼後倒計時效果的實現(基於vue)
註冊/找回密碼等功能中傳送手機驗證碼後倒計時效果的實現,基於vue、element-ui<template> <el-button size="small" type="prima
Python爬蟲學習4:requests.post模擬登入豆瓣(包括獲取驗證碼)
1. 在豆瓣登入網頁嘗試登入後開啟開發者工具,可以查詢後去Headers和Form Data資訊。2. 實現程式碼import requests import html5lib import re from bs4 import BeautifulSoup s = re