java url参数转换:_提示:通过URL激活并发送参数
java url参数转换:
世界上最安全的密码是不存在的密码。 使用完全随机的密钥从等式中删除用户。 公平地说,这有一些缺点,并且密码仍然存在于某处(在您的电话/电子邮件中),但通常这样效果很好...
诀窍很简单,如果我们想验证用户身份,我们可以通过电子邮件向他发送单个使用URL,例如mycoolapp://act-32548b09-d328-4330-8243-d7d30c322e40
。 如您所见,这很难猜测或蛮力。 一旦单击,URL就会变得无效,因此即使以某种方式公开了该URL仍然是无关紧要的。 为此,我们需要两个部分:
- 服务器逻辑
- 客户端URL处理
两者都很容易。
服务器
一个警告是mycoolapp
将在设备上运行,但是您无法在电子邮件或浏览器中单击它。 因此,我们需要您服务器上的https
URL。
服务器看起来像这样,请注意这是Spring Boot Controller代码,但是您应该可以在其中使用任何服务器:
public boolean sendSigninEmail(String e) {List<UserObj> ul = users.findByEmailIgnoreCase(e);if(ul.isEmpty()) {return false;}UserObj u = ul.get(0);u.setHashedActivationToken(UUID.randomUUID().toString()); (1)users.save(u); (2)email.sendEmail(e, "Signin to the Codename One App", "This is a one time link to activate the Codename One App. Click this link on your mobile device: \n\nhttps://ourserverurl.com/app/activateURL?token=act-" + u.getHashedActivationToken()); (3)return true;
}
public User activateViaToken(String t) throws ServerAppAPIException {List<UserObj> ul = users.findByHashedActivationToken(t); (4)if(ul.isEmpty()) {throw new ServerAppAPIException(ServerErrorCodes.NOT_FOUND);}UserObj u = ul.get(0);String val = u.getAppToken(); (5)u.setHashedActivationToken(null); (6)users.save(u);User r = u.getUser();r.setAppToken(u.getAppToken());return r;
}
1个 | 我们使用UUID生成长激活字符串 |
2 | 我们将其保存在数据库中,覆盖旧的URL(如果存在) |
3 | 我们可以发送带有HTTPS URL的电子邮件或SMS来激活应用程序 |
4 | 接下来,我们使用收到的令牌激活用户帐户。 我们找到正确的帐户条目 |
5 | 访问令牌是服务器生成的安全密码,它是完全随机的,并且仅对应用程序可见 |
6 | 现在删除了URL中使用的激活令牌,从而使URL成为一次性使用工具 |
所有这些大部分都很简单,但是仍然缺少一个。 我们的应用程序需要一个mycoolapp
URL,而HTTPS URL不会启动它。 解决方案是302重定向:
@RequestMapping(value="/activateURL", method=RequestMethod.GET)
public void activateURL(@RequestParam String token, HttpServletResponse httpServletResponse) {httpServletResponse.setHeader("Location", "mycoolapp://" + token);httpServletResponse.setStatus(302);
}
这会将设备自动发送到mycoolapp
URL,并使用令牌启动您的应用程序!
客户端
在客户端上,我们需要截获mycoolapp
URL并进行解析。 首先,我们需要添加两个新的构建提示:
android.xintent_filter=<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="mycoolapp" /> </intent-filter>
ios.plistInject=<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string>com.mycompany.myapp.package.name</string> </dict> <dict> <key>CFBundleURLSchemes</key> <array> <string>mycoolapp</string> </array> </dict> </array>
不要忘记将
mycoolapp
和com.mycompany.myapp.package.name
修复为应用程序中的适当值
接下来,我们要做的就是在start()
方法中检测URL。 这需要驻留在检查当前Form
的代码之前:
String arg = getProperty("AppArg", null); (1)
if(arg != null) {if(arg.contains("//")) { (2)List<String> strs = StringUtil.tokenize(arg, "/");arg = strs.get(strs.size() - 1);while(arg.startsWith("/")) {arg = arg.substring(1);}}if(!arg.startsWith("act-")) { (3)showLoginForm();callSerially(() ->Dialog.show("Invalid Key", "The Activation URL is invalid", "OK", null));return;}arg = arg.substring(4);Form activating = new Form("Activating", new BorderLayout(BorderLayout.CENTER_BEHAVIOR_CENTER));activating.add(CENTER, new InfiniteProgress());activating.show();sendActivationTokenToServer(arg); (4)return;
}
1个 |
这是从全球导入的CN 类中获得的。 app参数是URL
|
2 | 我们删除参数的URL部分 |
3 |
使用act- 前缀来验证URL是否正确
|
4 | 这会将激活密钥发送到我们上面讨论的服务器逻辑 |
在模拟器中测试
这将适用于iOS和Android。 从下周开始,您还可以使用模拟器中新的“发送应用程序自变量”菜单选项在模拟器上进行测试。
要将其正确集成到应用程序中,通常需要一个仅接受电子邮件/电话的登录菜单。 或基于Web的UI中的系统将邀请链接发送到应用程序。
Whatsapp使用此技巧的反面来激活其桌面应用程序。 他们会在您的设备上显示QR码,一旦您使用whatsapp手机扫描该QR码,就会激活桌面版本。 那比密码好得多。
翻译自: https://www.javacodegeeks.com/2018/09/tip-activate-via-url-and-send-arguments.html
java url参数转换:
java url参数转换:_提示:通过URL激活并发送参数相关推荐
- 提示:通过URL激活并发送参数
世界上最安全的密码是不存在的密码. 使用完全随机的密钥从等式中删除用户. 公平地说,这有一些缺点,并且密码仍然存在于某个地方(在您的电话/电子邮件中),但通常效果很好. 诀窍很简单,如果我们想对用户进 ...
- vue如何使浏览器url固定_关于前端url加密方式总结 (Vue-cli中使用)
下边是url加密和解密方法 /** * url参数加密 * 传入json格式的串 * @param {*Object} query */ const EncryUrl = query => { ...
- java获取url文件格式_本地文件/url获取文件类型
package com.cjw.baidu.ocr; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringU ...
- python播放url音频_如何从URL播放mp3
抱歉,我没有Python3要在这里测试,要使用pyaudio流mp3您需要在PCM数据中解码它,我知道pymedia可以做到,但它太旧了,只支持python27. 要以正确的方式执行此操作,您需要知道 ...
- java reduce 分组_使用JAVA8 stream中三个参数的reduce方法对List进行分组统计
背景 平时在编写前端代码时,习惯使用lodash来编写'野生'的JavaScript; lodash提供来一套完整的API对JS对象(Array,Object,Collection等)进行操作,这其中 ...
- java parameters用法_(四)Parameters,简单参数就用这个
Parameters注解在测试方法上指定参数列表,然后在测试方法中声明对应的形参,形参与参数列表一一对应,但名字可以不同,如下所示: public class Test1 { @Parameters( ...
- java的prefetch()_聊聊FluxFlatMap的concurrency及prefetch参数
序 本文主要研究下FluxFlatMap的concurrency及prefetch参数 实例 @Test public void testConcurrencyAndPrefetch(){ int c ...
- android和flask交互,java - 当我从Android向Flask Web服务发送参数时,如何解决“ SSL库故障”? - 堆栈内存溢出...
我确实尝试将一些值作为" application / json "从Android应用程序发送到Flask Web服务. 这是我的Java代码 : Thread thread = ...
- java 怎么对url解码_如何在Java中进行URL解码?
在Java中,我想将其转换为: https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type 对此: https ...
最新文章
- 提高 TDD 效率的一些小诀窍
- Juqery让世界更美好--超级简单实用的(上、下)自动翻的最佳效果,有图为证!...
- 如何在Outlook中的电子邮件上显示快速操作按钮
- axure 组件_技巧分享 | Axure后台组件制作的全过程
- jdk7默认gc算法_JDK 7的算法和数据结构
- java记录pv,计算500万PV/每天的网站
- P5714 【深基3.例7】肥胖问题--python3实现
- 硬板床害死中国人?西方人都睡软床垫?究竟是谁睡错了?
- python Selenium调用 IE/GoogleChrome/Firefox浏览器驱动的方法及下载地址
- 渣渣的leetcode刷题笔记-树(1)
- 选择性搜索(selective search)+opencv实现
- Form的显式方式。
- rs232读取智能电表_预付费电表高性价比型号推荐 预付费抄表系统免费安装
- 神经网络信息双向传播,神经网络反向传播推导
- 向量叉积和点积混合运算_matlab中的向量的数量积和向量积
- [ArcGIS] 空间分析(三)栅格数据
- w ndows10输入法设置,Win10输入法设置技巧:切换输入法
- Db2 SQL PL简介
- 4、基本命令-系统管理
- MOS驱动电机正反转
热门文章
- 动态规划练习【一】 背包问题
- [线性代数学习笔记] 线性递推数列及 Berlekamp-Massey 算法的详细推导过程
- P3746 [六省联考 2017] 组合数问题(倍增、dp)
- 51nod-有限背包计数问题【dp】
- P3261-[JLOI2015]城池攻占【左偏树】
- 【2018.5.12】模拟赛之一-ssl2413 排名【玄学】
- jzoj1373-食物链【并查集】
- codeforces D.MADMAX 动态规划、记忆化搜索
- Spark SQL(六)之加载数据的参数配置
- Dubbo(一)之简介