热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java口令_java动态口令登录实现过程详解

1.实现一个ItsClient客户端用来实例化调用验证功能publicclassItsClient{privatestaticfinalStringroutingv1.0sect

1.实现一个ItsClient 客户端用来实例化调用验证功能

public class ItsClient {

private static final String routing = "/v1.0/sectoken/otp_validation";

// ! HTTPS消息验证地址

private String httpsVerifyUrl = "";

// ! otp ipAddr

private String ipAddr = "";

// ! otp port

private String port = "";

// ! otp appID

private String appID = "";

// ! otp appKey

private String appKey = "";

// ! 错误码

private int errorCode = 0;

// ! 错误消息

private String errorMessage = "";

TreeMap errorCodeTable = new TreeMap() {

{

put(200, "请求成功");

put(400, "输入不合法,比如请求数据不是json");

put(401, "AppID不合法");

put(402, "指纹不合法");

put(410, "非法用户,验证otp时,传入的uid有误,找不到用户");

put(411, "错误的otp");

put(412, "一个周期内动态口令只能使用一次");

put(413, "已达一个周期内最大尝试次数");

put(500, "ITS服务器内部错误");

put(601, "参数错误");

put(602, "sha1签名失败");

put(603, "操作json失败");

put(604, "url访问错误:");

put(605, "较验返回指纹失败");

}

};

public ItsClient() {

this.ipAddr = ItsConf.GetIpAddr();

this.port = ItsConf.GetPort();

this.appID = ItsConf.GetOtpAppID();

this.appKey = ItsConf.GetOtpAppKey();

httpsVerifyUrl = "https://" + this.ipAddr + ':' + this.port + routing;

}

//获取错误信息

public St ring GetErrorMessage() {

return this.errorMessage;

}

//获取错误码

public int GetErrorCode() {

return this.errorCode;

}

public void SetError(int errorCode, String extMessage) {

this.errorCode = errorCode;

this.errorMessage = this.errorCodeTable.get(this.errorCode).toString() + extMessage;

}

public static String SHA1(String decript) throws NoSuchAlgorithmException {

String ret = "";

MessageDigest sha1 = MessageDigest.getInstance("SHA1");

byte[] sha1bytes = sha1.digest(decript.getBytes());

if (sha1bytes != null) {

ret = new BASE64Encoder().encode(sha1bytes);

}

return ret;

}

public String EncodeJson(TreeMap map) {

JSONObject jmap = new JSONObject(map);

return jmap.toString();

}

public TreeMap DecodeJson(String jsonStr) throws ParseException {

JSONObject jsonObject = new JSONObject(jsonStr);

TreeMap retMap = new TreeMap();

Iterator iter = jsonObject.keys();

String key = null;

Object value = null;

while (iter.hasNext()) {

key = iter.next();

value = jsonObject.get(key);

retMap.put(key, value);

}

return retMap;

}

public String BuildQueryStr(TreeMap params) {

String queryStr = "";

Iterator itr = params.keySet().iterator();

while (itr.hasNext()) {

String key = itr.next();

queryStr += (key + "=" + params.get(key).toString() + "&");

}

return queryStr.substring(0, queryStr.length() - 1);

}

public boolean IsEmptyOrNull(String param) {

return param &#61;&#61; null || param.length() <&#61; 0;

}

/**

* &#64;brief 验证otp

* &#64;param uid ITS主账号UID或已配置的从账号

* &#64;param otp 需要验证的动态口令

* &#64;return bool true: 成功, false: 失败

*/

&#64;SuppressWarnings("serial")

public boolean AuthOtp(final String uid, final String otp) {

if (IsEmptyOrNull(this.ipAddr) || IsEmptyOrNull(this.port) || IsEmptyOrNull(this.appID)

|| IsEmptyOrNull(this.appKey) || IsEmptyOrNull(uid) || IsEmptyOrNull(otp)) {

SetError(601, "");

return false;

}

TreeMap params &#61; new TreeMawww.cppcns.comp() {

{

put("app_id", appID);

put("app_key", appKey);

put("uid", uid);

put("otp", otp);

}

};

String qureyStr &#61; this.BuildQueryStr(params);

String fingerprint &#61; "";

try {

fingerprint &#61; SHA1(qureyStr);

} catch (Exception ex) {

ex.printStackTrace();

SetError(602, ex.getMessage());

return false;

}

params.remove("app_key");

params.put("fingerprint", fingerprint);

String postStr &#61; "";

try {

postStr &#61; EncodeJson(params);

} catch (Exception ex) {

ex.printStackTrace();

SetError(603, "json encode" &#43; ex.getMessage());

return false;

}

HttpsClient conn &#61; null;

String res

2.实现一个HttpsClient 请求工具

public class HttpsClient {

final static HostnameVerifier doNotVerifier &#61; new HostnameVerifier() {

public boolean verify(String hostname, SSLSession session) {

return true;

}

};

/**

* &#64;brief 发送请求

* &#64;param httpsUrl 请求的地址

* &#64;param postStr 请求的数据

* &#64;throws Exception

*/

public String post(String httpsUrl, String postStr) throws Exception {

HttpsURLConnection conn &#61; null;

StringBuffer recvBuff &#61; new StringBuffer();

String resData &#61; "";

try {

conn &#61; (HttpsURLConnection) (new URL(httpsUrl)).openConnection();

conn.setHostnameVerifier(doNotVerifier);

conn.setDoInput(true);

conn.setDoOutput(true);

conn.setRequestMethod("POST");

conn.setRequestProperty("Content-Type", " application/json");

conn.setRequestProperty("Content-Length", String.valueOf(postStr.getBytes("utf-8").length));

conn.setUseCaches(false);

//设置为utf-8可以解决服务器接收时读取的数据中文乱码问题

conn.getOutputStream().write(postStr.getBytes("utf-8"));

conn.getOutputStream().flush();

conn.getOutputStream().close();

&nbwww.cppcns.comsp; BufferedReader in &#61; new BufferedReader(new InputStreamReader(conn.getInputStream()));

String line;

while ((line &#61; in.readLine()) !&#61; null) {

recvBuff.append(line);

}

resData &#61; recvBuff.toString();

return resData;

} catch (MalformedURLException ex) {

throw ex;

} catch (IOException ex) {

throw ex;

} catch (Exception ex) {

throw ex;

}

}

}

3.实现Its一个配置用来配置Its服务器信息接口访问地址

public class ItsConf {

// ITS服务器地址 1.1.1.1 或 xxx.xxx.com的形式

private static String ipAddr &#61; "";

// ITS服务器端口

private static String port &#61; "";

// OTP服务的AppID

private static Stwww.cppcns.comring otpAppID &#61; "";

// OTP服务的AppKey

private static String otpAppKey &#61; "";

public static String GetIpAddr() {

return ipAddr;

}

public static String GetPort() {

return port;

}

public static String GetOtpAppID() {

return otpAppID;

}

public static String GetOtpAppKey() {

return otpAppKey;

}

}

4.接下来就是LoginContorller 完成口令认证

//username 用户名

//code动态口令密码

ItsClient itsClient &#61; new ItsClient();

if(itsClient.AuthOtp(username, code)){

//认证成功,跳转页面

}

5.登陆页面就省略了,自己完成吧

以上就是本文的全部内容&#xff0c;希望对大家的学习有所帮助&#xff0c;也希望大家多多支持我们。

本文标题: java动态口令登录实现过程详解

本文地址: http://www.cppcns.com/ruanjian/java/264603.html



推荐阅读
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文介绍了Java中Hashtable的clear()方法,该方法用于清除和移除指定Hashtable中的所有键。通过示例程序演示了clear()方法的使用。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
author-avatar
萝莉分享创意科技
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有