1. 程式人生 > >登入模組(手機驗證碼)

登入模組(手機驗證碼)

本人為實習生,第一次寫部落格,寫的不好的大家多多諒解

應公司近期需求,需要單獨開發一個後臺管理系統。

自己按實際業務寫了一個登入介面已經實現,時序圖如下



原始碼牽扯業務量太大,這裡只放出部分關鍵實現原始碼,整合思路可以配合時序圖去理解。

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