Oauth2.0认证原理

正则表达式 同时验证手机号码和固定电话号码(带区号或不带区号或带分机号) 正则表达式: ^1\d{10}$|^(0\d{2,3}-?|\(0\d{2,3}\))?[1-9]\d{4,7}(-\d{1,8})?$ 规则说明: 1、可以是1开头的11位数字(手机号) 2、可以是“区号-电话号-分机号”或者是“(区号)电话号-分机号”格式 3、区号是0开头的3~4位数字,可以没有区号 4、电话号是5~8位数字,不能以0开头 5、分机号是1~8位数字,可以没有分机号 合法数据示例: ①13812341234 ②010-12345678 ③(0432)1234567-1234 ④12 阅读详情

Oauth2.0认证原理

Oauth2.0 认证协议

Oauth2.0 应用场景: 微信联合登录     授权管理  

 

互联网开放平台互相调用保证安全

    微信提供api  给toov5调用  然后就可以获取一些微信的信息  比如微信头像

    开放平台有 支付宝  微信 百度等等

    不同的开放平台 对接的oauth2.0协议流程都是相同,无非接口地址不同

  

Oauth2.0原理 (appId appsecret access_token  openId  回调地址 授权地址)

使用:

   在微信开放平台申请对应的appId信息

    toov5生成登录授权连接

    用于在确认微信登录之后  跳转回到回调地址(配置域名权限)

    获取到授权码 使用授权码获取对应的accessToken(调用腾讯借口权限)

    使用accessToken+openId获取用户相关信息 (openid 开放userId)

 

  

配置 授权访问连接: 通过controller跳转到 腾讯的连接

 

用户点击确定登录时候  进入到callback,并且获取到前面返回的code

拿到code 后面就可以获取到相应的 token 和 id了

 

 

 第一步:用户同意授权,获取code
2 第二步:通过code换取网页授权access_token
3 第三步:刷新access_token(如果需要)
4 第四步:拉取用户信息(需scope为 snsapi_userinfo)
5 附:检验授权凭证(access_token)是否有效

maven:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
    </parent>
    <dependencies>



        <!-- SpringBoot 对lombok 支持 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!-- SpringBoot web 核心组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </dependency>
        <!-- SpringBoot 外部tomcat支持 -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>

        <!-- springboot-log4j -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j</artifactId>
            <version>1.3.8.RELEASE</version>
        </dependency>
        <!-- springboot-aop 技术 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
    </dependencies>

 

yml:

spring:
  mvc:
    view:
      # 页面默认前缀目录
      prefix: /WEB-INF/jsp/
      # 响应页面默认后缀
      suffix: .jsp
      
appid: wx5c43fde3c9733d9e
secret: b8b217126c33a5fb7074927d5e72a81a
redirectUri: http://127.0.0.1:8080/callback
### 生成微信授权   官方提供的授权接口
authorizedUrl: https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
###获取code后,请求以下链接获取access_token
access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
###拉取用户信息(需scope为 snsapi_userinfo)
userinfo: https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

Controller:

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.fastjson.JSONObject;
import com.itmayiedu.base.BaseApiService;
import com.itmayiedu.utils.HttpClientUtils;
import com.itmayiedu.utils.WeiXinUtils;

@Controller
public class OauthController extends BaseApiService {

    @Autowired
    private WeiXinUtils weiXinUtils;
    private String errorPage = "errorPage";

    // 生成授权链接
    @RequestMapping("/authorizedUrl")
    public String authorizedUrl() {
        System.out.println(weiXinUtils.getAuthorizedUrl());
        return "redirect:" + weiXinUtils.getAuthorizedUrl();   //重定向到微信的开放平台地址
    }

    // 微信授权回调地址
    @RequestMapping("/callback")
    public String callback(String code, HttpServletRequest request) {
        // 1.使用Code 获取 access_token
        String accessTokenUrl = weiXinUtils.getAccessTokenUrl(code);
        JSONObject resultAccessToken = HttpClientUtils.httpGet(accessTokenUrl);
        boolean containsKey = resultAccessToken.containsKey("errcode");

        if (containsKey) {
            request.setAttribute("errorMsg", "系统错误!");
            return errorPage;
        }
        // 2.使用access_token获取用户信息
        String accessToken = resultAccessToken.getString("access_token");
        String openid = resultAccessToken.getString("openid");
        // 3.拉取用户信息(需scope为 snsapi_userinfo)
        String userInfoUrl = weiXinUtils.getUserInfo(accessToken, openid);
        JSONObject userInfoResult = HttpClientUtils.httpGet(userInfoUrl);
        System.out.println("userInfoResult:" + userInfoResult);
        request.setAttribute("nickname", userInfoResult.getString("nickname"));
        request.setAttribute("city", userInfoResult.getString("city"));
        request.setAttribute("headimgurl", userInfoResult.getString("headimgurl"));
        return "info";
    }

}

Base:

 

import org.springframework.stereotype.Component;

import com.itmayiedu.utils.Constants;

@Component
public class BaseApiService {

    public ResponseBase setResultError(Integer code, String msg) {
        return setResult(code, msg, null);
    }

    // 返回错误,可以传msg
    public ResponseBase setResultError(String msg) {
        return setResult(Constants.HTTP_RES_CODE_500, msg, null);
    }

    // 返回成功,可以传data值
    public ResponseBase setResultSuccessData(Object data) {
        return setResult(Constants.HTTP_RES_CODE_200, Constants.HTTP_RES_CODE_200_VALUE, data);
    }

    public ResponseBase setResultSuccessData(Integer code, Object data) {
        return setResult(code, Constants.HTTP_RES_CODE_200_VALUE, data);
    }

    // 返回成功,沒有data值
    public ResponseBase setResultSuccess() {
        return setResult(Constants.HTTP_RES_CODE_200, Constants.HTTP_RES_CODE_200_VALUE, null);
    }

    // 返回成功,沒有data值
    public ResponseBase setResultSuccess(String msg) {
        return setResult(Constants.HTTP_RES_CODE_200, msg, null);
    }

    // 通用封装
    public ResponseBase setResult(Integer code, String msg, Object data) {
        return new ResponseBase(code, msg, data);
    }

}

 

import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

@Getter
@Setter
@Slf4j
public class ResponseBase {

    private Integer rtnCode;
    private String msg;
    private Object data;

    public ResponseBase() {

    }

    public ResponseBase(Integer rtnCode, String msg, Object data) {
        super();
        this.rtnCode = rtnCode;
        this.msg = msg;
        this.data = data;
    }

    public static void main(String[] args) {
        ResponseBase responseBase = new ResponseBase();
        responseBase.setData("123456");
        responseBase.setMsg("success");
        responseBase.setRtnCode(200);
        System.out.println(responseBase.toString());
        log.info("itmayiedu...");
    }

    @Override
    public String toString() {
        return "ResponseBase [rtnCode=" + rtnCode + ", msg=" + msg + ", data=" + data + "]";
    }

}

 

Entity:

public class AppEntity {

    private long id;
    private String appId;
    private String appName;
    private String appSecret;
    private String accessToken;
    private String redirectUri;
    private int isFlag;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getAppId() {
        return appId;
    }

    public void setAppId(String appId) {
        this.appId = appId;
    }

    public String getAppName() {
        return appName;
    }


    public void setAppName(String appName) {
        this.appName = appName;
    }

    public String getAppSecret() {
        return appSecret;
    }


    public void setAppSecret(String appSecret) {
        this.appSecret = appSecret;
    }

    public int getIsFlag() {
        return isFlag;
    }


    public void setIsFlag(int isFlag) {
        this.isFlag = isFlag;
    }

    public String getAccessToken() {
        return accessToken;
    }

    
    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }

    public String getRedirectUri() {
        return redirectUri;
    }


    public void setRedirectUri(String redirectUri) {
        this.redirectUri = redirectUri;
    }

}
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

@Getter
@Setter
@Slf4j
public class ResponseBase {

    private Integer rtnCode;
    private String msg;
    private Object data;

    public ResponseBase() {

    }

    public ResponseBase(Integer rtnCode, String msg, Object data) {
        super();
        this.rtnCode = rtnCode;
        this.msg = msg;
        this.data = data;
    }

    public static void main(String[] args) {
        ResponseBase responseBase = new ResponseBase();
        responseBase.setData("123456");
        responseBase.setMsg("success");
        responseBase.setRtnCode(200);
        System.out.println(responseBase.toString());
        log.info("itmayiedu...");
    }

    @Override
    public String toString() {
        return "ResponseBase [rtnCode=" + rtnCode + ", msg=" + msg + ", data=" + data + "]";
    }

}

 

Util:

public interface Constants {
    // 响应请求成功
    String HTTP_RES_CODE_200_VALUE = "success";
    // 系统错误
    String HTTP_RES_CODE_500_VALUE = "fial";
    // 响应请求成功code
    Integer HTTP_RES_CODE_200 = 200;
    // 系统错误
    Integer HTTP_RES_CODE_500 = 500;
    // 未关联QQ账号
    Integer HTTP_RES_CODE_201 = 201;
    // 发送邮件
    String MSG_EMAIL = "email";
    // 会员token
    String TOKEN_MEMBER = "TOKEN_MEMBER";
    // 支付token
    String TOKEN_PAY = "TOKEN_pay";
    // 支付成功
    String PAY_SUCCESS = "success";
    // 支付白
    String PAY_FAIL = "fail";
    // 用户有效期 90天
    Long TOKEN_MEMBER_TIME = (long) (60 * 60 * 24 * 90);
    int COOKIE_TOKEN_MEMBER_TIME = (60 * 60 * 24 * 90);
    Long PAY_TOKEN_MEMBER_TIME = (long) (60 * 15);
    // cookie 会员 totoken 名称
    String COOKIE_MEMBER_TOKEN = "cookie_member_token";

}
import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSONObject;


public class HttpClientUtils {
    private static Logger logger = LoggerFactory.getLogger(HttpClientUtils.class); // 日志记录

    private static RequestConfig requestConfig = null;

    static {
        // 设置请求和传输超时时间
        requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();
    }


    public static JSONObject httpPost(String url, JSONObject jsonParam) {
        // post请求返回结果
        CloseableHttpClient httpClient = HttpClients.createDefault();
        JSONObject jsonResult = null;
        HttpPost httpPost = new HttpPost(url);
        // 设置请求和传输超时时间
        httpPost.setConfig(requestConfig);
        try {
            if (null != jsonParam) {
                // 解决中文乱码问题
                StringEntity entity = new StringEntity(jsonParam.toString(), "utf-8");
                entity.setContentEncoding("UTF-8");
                entity.setContentType("application/json");
                httpPost.setEntity(entity);
            }
            CloseableHttpResponse result = httpClient.execute(httpPost);
            // 请求发送成功,并得到响应
            if (result.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                String str = "";
                try {
                    // 读取服务器返回过来的json字符串数据
                    str = EntityUtils.toString(result.getEntity(), "utf-8");
                    // 把json字符串转换成json对象
                    jsonResult = JSONObject.parseObject(str);
                } catch (Exception e) {
                    logger.error("post请求提交失败:" + url, e);
                }
            }
        } catch (IOException e) {
            logger.error("post请求提交失败:" + url, e);
        } finally {
            httpPost.releaseConnection();
        }
        return jsonResult;
    }


    public static JSONObject httpPost(String url, String strParam) {
        // post请求返回结果
        CloseableHttpClient httpClient = HttpClients.createDefault();
        JSONObject jsonResult = null;
        HttpPost httpPost = new HttpPost(url);
        httpPost.setConfig(requestConfig);
        try {
            if (null != strParam) {
                // 解决中文乱码问题
                StringEntity entity = new StringEntity(strParam, "utf-8");
                entity.setContentEncoding("UTF-8");
                entity.setContentType("application/x-www-form-urlencoded");
                httpPost.setEntity(entity);
            }
            CloseableHttpResponse result = httpClient.execute(httpPost);
            // 请求发送成功,并得到响应
            if (result.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                String str = "";
                try {
                    // 读取服务器返回过来的json字符串数据
                    str = EntityUtils.toString(result.getEntity(), "utf-8");
                    // 把json字符串转换成json对象
                    jsonResult = JSONObject.parseObject(str);
                } catch (Exception e) {
                    logger.error("post请求提交失败:" + url, e);
                }
            }
        } catch (IOException e) {
            logger.error("post请求提交失败:" + url, e);
        } finally {
            httpPost.releaseConnection();
        }
        return jsonResult;
    }


    public static JSONObject httpGet(String url) {
        // get请求返回结果
        JSONObject jsonResult = null;
        CloseableHttpClient client = HttpClients.createDefault();
        // 发送get请求
        HttpGet request = new HttpGet(url);
        request.setConfig(requestConfig);
        try {
            CloseableHttpResponse response = client.execute(request);

            // 请求发送成功,并得到响应
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                // 读取服务器返回过来的json字符串数据
                HttpEntity entity = response.getEntity();
                String strResult = EntityUtils.toString(entity, "utf-8");
                // 把json字符串转换成json对象
                jsonResult = JSONObject.parseObject(strResult);
            } else {
                logger.error("get请求提交失败:" + url);
            }
        } catch (IOException e) {
            logger.error("get请求提交失败:" + url, e);
        } finally {
            request.releaseConnection();
        }
        return jsonResult;
    }

}

 

import java.net.URLEncoder;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;


@Component
public class WeiXinUtils {
    @Value("${appid}")
    private String appId;
    @Value("${secret}")
    private String secret;
    @Value("${redirecturi}")
    private String redirectUri;
    @Value("${authorizedUrl}")
    private String authorizedUrl;
    @Value("${access_token}")
    private String accessToken;
    @Value("${userinfo}")
    private String userinfo;

    public String getAuthorizedUrl() {
        return authorizedUrl.replace("APPID", appId).replace("REDIRECT_URI", URLEncoder.encode(redirectUri));
    }

    public String getAccessTokenUrl(String code) {
        return accessToken.replace("APPID", appId).replace("SECRET", secret).replace("CODE", code);
    }

    public String getUserInfo(String accessToken, String openId) {
        return userinfo.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);
    }

}

 

启动类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AppOauth {

    public static void main(String[] args) {
        SpringApplication.run(AppOauth.class, args);
    }

}

 

【身份安全】OAuth 2.0工作原理(一) OAuth是一个授权框架,它使应用程序能够在 HTTP 服务上获得对用户帐户的有限访问权限。它的工作原理是将用户身份验证委托给托管用户帐户的服务,并授权第三方应用程序访问该用户帐户。OAuth 2 为 Web 和桌面应用程序以及移动设备提供授权流程。 阅读详情

相关推荐

oauth2.0认证原理

OAuth2.0(开放授权)是最流行的认证授权机制,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用, 兼容http。

change_fate的博客 1319

OAuth2.0 原理

文章目录一、OAuth2.0是什么?二、三方指的是哪三方?三、OAuth2.0的作用1、解决的问题2、项目应用场景四、OAuth2.0名词定义五、OAuth2.0授权流程1、OAuth的思路2、交互流程六、OAuth2.0的授权模式1、授权码模式2、简化模式3、密码模式4、客户端模式七、令牌的使用和更新令牌的使用令牌的更新八、OAuth2.0和1.0的区别九、三方登录中OAuth2.0的使用1、三方登录如何做到的呢?2、微信三方登录OAuth2.0获取access_token流程总结参考文献 一、OAut

安梓晨的博客 2万+

OAuth2.0协议原理与实现

OAuth2.0协议原理与实现

OAuth 2.0协议原理

一.基本原理 OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容。 OAuth 2.0 主要有4类角色: • resource owner:资源所有者,指终端的“用户”(即授权登录中资料信息的拥有者) • resource server:资源服务器,...

罗布泊coding 4485

告别130MB/s瓶颈!用Zynq+NVMe实现1.2GB/s高速存储的PL数据分流实战

本文详细介绍了如何通过Zynq+NVMe实现1.2GB/s高速存储的PL数据分流方案,突破传统Zynq架构130MB/s的瓶颈。文章分享了PL直连NVMe的硬件架构设计、软件栈优化及性能调优实战技巧,帮助开发者实现高速数据流的稳定存储。

weixin_42653691的博客 372

银河麒麟系统完美安装EasyConnect

Kylin V10桌面版完美安装EasyConnect

weixin_53874797的博客 1万+

推荐在线验证js正则表达式的网站

http://tools.netshiftmedia.com/regexlibrary/#     //验证包括手机号码和固定电话号码 ^(13[0-9]{9}|15[89]\d{8}|[0-9]{7,8}|0[0-9]{2,3}\-[0-9]{7,8}(\-[0-9]{0-4})?)$   可以通过验证的手机号码: 13566546654 15895656654 固定电话 0...

weixin_34248487的博客 197

SAP增强实施-第四代显式和隐式增强技术介绍

概念介绍 SAP第四代增强- Enhancement-Point,分为2种显式增强和隐式增强,显式增强就是手动加入到程序中的Enhancement options,隐式增强就是系统内置的Enhancement options。 第四代增强其实是第三代上的加强,都属于面向对象语言的接口技术的应用,但第四代增强使SAP增强实施更具灵活性,四代增强可以直接在源代码里面写增强了代码了,输入参数也不像 二代...

weixin_40672823的博客 7954

表单验证-正则表达式

本周的学习任务是制作一个正则表达式。学长给了一个正则表达式教程,看完了以后发现并没有记住什么。正则表达式真的要记的东西很多,所以我都是直接在网上找相应的表达式,因为要调试验证,慢慢也记住了一些最基本的东西。现在拿到一个正则表达式还是能够做一些最基本分析,也能看懂一部分。尽管如此,在制作表单验证的时候还是出现了一些问题。 首先,最开始我是把每个函数都用提交按钮去测试,后来发现最后提交的时候怎么办呢

HL141916的博客 869

独立游戏开发者必看:STEAM税务信息更新全流程(附中国区避坑指南)

本文为独立游戏开发者详细解析了Steam税务信息更新的全流程,重点针对中国区开发者提供了避坑指南。文章深入解释了W-8BEN表格的填写要点,并指导如何准备个人所得税纳税记录和身份证等核心证明文件,以确保顺利通过审核,避免收入被预扣税款。

tcp8optimizer的博客 1297

比Synergy更轻量!Barrier鼠标共享工具实测:5分钟实现Win/Mac/Linux三设备无缝切换

本文实测了开源免费的Barrier鼠标共享工具,详细指导用户如何在5分钟内于Windows、macOS和Linux三台设备间实现一套键鼠的无缝切换。文章对比了其与Synergy的优势,提供了分平台安装、核心服务端-客户端配置、防火墙设置等完整教程,并分享了解决连接问题的关键技巧,是提升多设备办公效率的实用指南。

weixin_29304021的博客 597

正则表达式在线测试工具

正则表达式在线测试工具是一款纯前端的正则表达式处理工具,支持正则编写、实时匹配、高亮展示、分组信息查看四大核心功能。所有处理在浏览器本地完成,数据不上传服务器,接口密钥等敏感信息也能放心使用。支持 gimsu 五种标记修饰符,满足不同场景的匹配需求。正则表达式是每个开发者的日常刚需,与其肉眼比对匹配结果,不如用工具一键搞定。立即体验正则表达式测试工具,让正则编写效率翻倍。

lfs124596的博客 493

Java炫酷烟花③(完整代码)

Java语言实现炫酷烟花动画的完整代码。 下载代码 下载链接:我是一只有趣的兔子,感谢你的喜欢。

AIGC 784

android工具类正则表达式,Android开发中超好用的正则表达式工具类RegexUtil完整实例...

本文实例讲述了android开发中超好用的正则表达式工具类regexutil。分享给大家供大家参考,具体如下:/************************************************ 正则表达式工具** @author chen.lin* @version 1.0************************************************/public...

weixin_35677065的博客 223

微信小程序 - 最新详细实现调起手机摄像头拍摄身份证人像面和国徽面取景框功能,在拍照相机上增加身份证证件照的轮廓或自定义文字,支持替换扫描拍摄辅助线图片及文本,小程序实现拍照身份证时带取景轮廓框拍摄!

微信小程序,身份证,证件照,人像,证件照提示框模板,vue身份证拍照框,摄像机相机里有引导内容,取景框拍摄,微信小程序实现拍照界面自定义实现,自拍人相框拍摄,取景框,户口簿取景框,画布指定区域生成图片,微信小程序身份证正反面拍照如何加入辅助图片引导照片,身份证取景框拍摄,服务器,上传,正反面,调起手机摄像头: 拍摄身份证的正反面,自定义身份证取景框,在相机上绘制 “身份证轮廓“ 与提示文字,拍摄身份证时出现人像框怎么实现,在相机上增加图片和文字,微信小程序怎么给调起的相机加入自定义图片,小程序实现给相机上面

🏆 前端领域优质创作者 3404

从零开始学习PX4源码20(遥控器模式切换如何执行)

本节主要学习PX4的手动遥控器切换模式,具体是如何实现的,具体改变了哪些变量,和模式管理有什么联系。

陌城烟雨 316

固定电话+手机号码 正则表达式

正则匹配:   区号+座机号码+分机号码:regexp="^(0[0-9]{2,3}/-)?([2-9][0-9]{6,7})+(/-[0-9]{1,4})?$" 手机(中国移动手机号码):regexp="^((/(/d{3}/))|(/d{3}/-))?13[456789]/d{8}|15[89]/d{8}" 所有手机号码:regexp="^((/(/d{3}/))|(/d{3}/-))?1...

幽篁晓筑的博客 3486

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

正则表达式

1.什么是正则表达式     正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去匹配符合规则的字符。 2. 在线匹配工具:    1 http://www.regexpal.com/    2 http://rubular.com/ 3.正则表达式的常用字符及其含义     4.几种常用的正则表达式表示方法

weixinru4631260的博客 343

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

常用正则表达式-附在线测试地址

常用正则表达式 在线地址:正则表达式 - 在线工具 - Netools (luoboit.cn) 一、数字 数字 ^[0-9]*$ n位的数字 ^\d{n}$ 至少n位的数字 ^\d{n,}$ m-n位的数字 ^\d{m,n}$ 零和非零开头的数字 ^(0|[1-9][0-9]*)$ 非零开头的最多带两位小数的数字 ^([1-9][0-9]*)+(\.[0-9]{1,2})?$ 带1-2位小数的正数或负数 ^(\-)?\d+(\.\

lwplvx的专栏 254

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

用css和js写表单验证,使用javascript及正则表达式实现表单验证(CSS,js练习)

标签:注册界面body{margin:0px;padding:0px;}.zc{width:380px;height:600px;margin:0 auto;line-height:40px;}.main{font-size:20px;border:1px solid #000;padding:10px;background-color:#FFC;}.top{font-size:30px;font...

weixin_33146151的博客 383

正则表达式说明

qt里 \\\\ ==\ \\w ==\w 本文中// ==/           /w==/w 目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。 正则表达式的使用,可以通过简单的办法来实现强大的功能。为了简单有效而又不失强大,造成了正则表

恋文 438

JavaScript中的-----正则表达式

一、什么是正则表达式 它本身就是一个字符串,有它规定的语法,它的用途主要是用来匹配某个字符串是否符合指定的规则,规则由正则表达式来进行描述。 二、如何创建正则表达式 1、var reg=new RegExp(“正则表达式”,“gim”); 2、var reg=/正则表达式/gim; gim可有可无,g表示全局匹配,i表示忽略大小写,m可以多行匹配,多行就是字符串带有\r 回车。 三、常用的正则表达式 1、是否是整数 可以 负号 开头,都由数字组成 4、匹配国内的固定电话号码 以0开头,后面省会和直辖市是2

norang的博客 530

正则表达式:验证固定电话或者手机号或者手机号(+86)或者手机号(86)

(^(0[0-9]{2,3}\-)?([2-9][0-9]{6,7})+(\-[0-9]{1,4})?$)|(^((\(\d{3}\))|(\d{3}\-))?(1[358]\d{9})$)|(^86((\(\d{3}\))|(\d{3}\-))?(1[358]\d{9})$)|(^\+86((\(\d{3}\))|(\d{3}\-))?(1[358]\d{9})$) NND,忒长了 ...

weixin_30361641的博客 904

正则表达式全解析+常用示例_通过正则表达式解析网页响应示例

这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b),这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。常用于表示IP地址 形如: ((25[0-5]|2[0-4][0-9]|[0-1]\d\d).){3}(25[0-5]|2[0-4][0-9]|[0-1]\d\d)[1-9])|((1|2)[0-9])|30|31)$"正确格式为;

2501_90425406的博客 790

java正则表达式校验工具

package com.toutou; import java.util.regex.*; /** * @author toutou * @date by 1997/05 */ public class TouTouRegex { /** * 验证Email * * @param email email地址,格式:zhang@gmail.com,zhang@xxx.com.cn,xxx代表邮件服务商 * @return 验证成功返回true,验证失败

WoshiAnQia的博客 285
上一篇: 互联网开放平台API安全设计
下一篇: 接口安全加密传输(对称加密与非对称加密)
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值