如何设计一个安全对外的接口?加签验签了解一下
前言我们在求职面试中,经常会被问到,如何设计一个安全对外的接口呢? 其实可以回答这一点,加签和验签,这将让你的接口更加有安全。接下来,本文将和大家一起来学习加签和验签。从理论到实战,加油哦~
密码学相关概念
加签验签概念
为什么需要加签、验签
加密算法简介
加签验签相关API
加签验签代码实现
公众号:捡田螺的小男孩
本文已经收录到个人github,文章有用的话,可以给个star呀:
https://github.com/whx123/JavaHome
密码学相关概念明文、密文、密钥、加密、解密
明文:指没有经过加密的信息/数据。
密文:明文被加密算法加密之后,会变成密文,以确保数据安全。
密钥:是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥。
加密:将明文变成密文的过程。
解密:将密文还原为明文的过程。
对称加密、非对称加密
对称加密:加密和解密使用相同密钥的加密算法。
非对称加密:非对称加密算法需要两个密钥(公开密钥和私有密钥)。公钥与私钥是成对存在的,如果用公钥对数据进行加密,只有对应的私钥才能解密。
...
记一次代码优化
前言好久没分享工作总结啦,今天来一份代码优化总结。用模板方法+策略+工厂方法模式优化了代码,耐心点看完,应该对大家有帮助的~
本文已经收录到github
https://github.com/whx123/JavaHome
公众号:捡田螺的小男孩
优化代码前先来了解一下类似的业务场景,简言之,就是:多个商户接入我们系统,都是走一个类似的流程通过http请求出去的。
优化前,每个公司对应一个句柄服务,伪代码如下:
1234567891011121314151617181920212223242526272829303132333435// 商户A处理句柄CompanyAHandler implements RequestHandler { Resp hander(req){ //查询商户信息 queryMerchantInfo(); //加签 signature(); // http请求(走代理) httpRequestbyProxy() // 验签 verify(); }}// 商户B处理句柄Compa ...
优化代码的几个小技巧
前言最近看了《重构-改善既有代码的设计》这本书,总结了优化代码的几个小技巧,给大家分享一下。
提炼函数(适当抽取小函数)定义提炼函数就是将一段代码放进一个独立函数中,并让函数名称解释该函数用途。
一个过于冗长的函数或者一段需要注释才能让人理解用途的代码,可以考虑把它切分成一个功能明确的函数单元,并定义清晰简短的函数名,这样会让代码变得更加优雅。
优化例子提炼函数之前:
123456789101112131415161718192021private String name;private Vector<Order> orders = new Vector<Order>();public void printOwing() { //print banner System.out.println("****************"); System.out.println("*****customer Owes *****"); System.out.println("****** ...
写代码有这些想法,同事才不会认为你是复制粘贴程序员
前言最近做完12月份版本需求,有一些思考不够深入的代码,因此写一下总结,希望大家日常写代码多点思考,多点总结,加油!同时哪里有不对的,也望指出。
一、复杂的逻辑条件,是否可以调整顺序,让程序更高效呢。假设业务需求是这样:会员,第一次登陆时,需要发一条感谢短信。如果没有经过思考,代码直接这样写了
123if(isUserVip && isFirstLogin){ sendMsg();}
假设总共有5个请求,isUserVip通过的有3个请求,isFirstLogin通过的有1个请求。那么以上代码,isUserVip执行的次数为5次,isFirstLogin执行的次数也是3次,如下:
如果调整一下isUserVip和isFirstLogin的顺序呢?
123if(isFirstLogin && isUserVip ){ sendMsg();}
isFirstLogin执行的次数是5次,isUserVip执行的次数是1次,如下:
酱紫你的程序是否更高效呢?
二、你的程序是否不经意间创建了不必要的对象。举个 ...
Java日期处理易踩的十个坑
前言整理了Java日期处理的十个坑,希望对大家有帮助。
一、用Calendar设置时间的坑反例:
123Calendar c = Calendar.getInstance();c.set(Calendar.HOUR, 10);System.out.println(c.getTime());
运行结果:
1Thu Mar 26 22:28:05 GMT+08:00 2020
解析:
我们设置了10小时,但运行结果是22点,而不是10点。因为Calendar.HOUR默认是按12小时制处理的,需要使用Calendar.HOUR_OF_DAY,因为它才是按24小时处理的。
正例:
12Calendar c = Calendar.getInstance();c.set(Calendar.HOUR_OF_DAY, 10);
二、Java日期格式化YYYY的坑反例:
1234567Calendar calendar = Calendar.getInstance();calendar.set(2019, Calendar.DECEMBER, 31);Date testDate = calendar. ...
Mysql中,21个写SQL的好习惯
前言每一个好习惯都是一笔财富,本文分SQL后悔药, SQL性能优化,SQL规范优雅三个方向,分享写SQL的21个好习惯,谢谢阅读,加油哈~
github地址,感谢每颗star
https://github.com/whx123/JavaHome
公众号:捡田螺的小男孩
1. 写完SQL先explain查看执行计划(SQL性能优化)日常开发写SQL的时候,尽量养成这个好习惯呀:写完SQL后,用explain分析一下,尤其注意走不走索引。
1explain select * from user where userid =10086 or age =18;
2、操作delete或者update语句,加个limit(SQL后悔药)在执行删除或者更新语句,尽量加上limit,以下面的这条 SQL 为例吧:
1delete from euser where age > 30 limit 200;
因为加了limit 主要有这些好处:
降低写错SQL的代价, 你在命令行执行这个SQL的时候,如果不加limit,执行的时候一个不小心手抖,可能数据全删掉了,如果删错了呢?加了lim ...
CAS乐观锁解决并发问题的一次实践
前言最近做新项目,货币充值消耗,送礼竞争勋章等都使用了CAS解决并发问题,所以做一下笔记,谈谈CAS,大家一起互相学习。
乐观锁,悲观锁:讨论CAS的话,先来说有一下乐观锁,悲观锁。
悲观锁:每次去取数据,很悲观,都觉得会被别人修改,所以在拿数据的时候都会上锁。简言之,共享资源每次都只给一个线程使用,其他线程阻塞,等第一个线程用完后再把资源转让给其他线程。synchronized和ReentranLock等都是悲观锁思想的体现。
乐观锁:每次去取数据,都很乐观,觉得不会被被人修改。因此每次都不上锁,但是在更新的时候,就会看别人有没有在这期间去更新这个数据,如果有更新就重新获取,再进行判断,一直循环,直到拿到没有被修改过的数据。CAS(Compare and Swap 比较并交换)就是乐观锁的一种实现方式。
CAS算法:CAS涉及三个操作数1.需要读写的内存地址V
2.进行比较的预期原值A
3.拟写入的新值B
如果内存位置的值V与预期原A值相匹配,那么处理器会自动将该位置值更新为新值B。CAS思想:要进行更新时,认为位置V上的值还是跟A值相等,如果是是相等,就认为它没有被别的线程更改过, ...
Java日常开发的21个坑
前言最近看了极客时间的《Java业务开发常见错误100例》,再结合平时踩的一些代码坑,写写总结,希望对大家有帮助,感谢阅读~
1. 六类典型空指针问题
包装类型的空指针问题
级联调用的空指针问题
Equals方法左边的空指针问题
ConcurrentHashMap 这样的容器不支持 Key 和 Value 为 null。
集合,数组直接获取元素
对象直接获取属性
1.1包装类型的空指针问题12345678910public class NullPointTest { public static void main(String[] args) throws InterruptedException { System.out.println(testInteger(null)); } private static Integer testInteger(Integer i) { return i + 1; //包装类型,传参可能为null,直接计算,则会导致空指针问题 }} ...
腾讯后端面试真题
前言最近有个好朋友换工作了,面了腾讯后端,跟他要了份面试真题,大家一起来探讨一下,哈哈~
腾讯后端一面① JVM内存模型这个可以复习一下《深入理解Java虚拟机》第12章(Java内存模型和线程)哈,也可以看看我之前的文章哈JVM常见面试题解析
JVM内存结构:
Java内存模型图:
②cms和g1有没有了解过,它们有什么区别
CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用;
G1收集器收集范围是老年代和新生代,不需要结合其他收集器使用;
CMS收集器以最小的停顿时间为目标的收集器;
G1收集器可预测垃圾回收的停顿时间
CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片
G1收集器使用的是“标记-整理”算法,进行了空间整合,降低了内存空间碎片。
这个点是可以看《深入理解Java虚拟机》第三章,垃圾收集器与内存分配策略哈
③谈谈你对垃圾回收的了解,什么时候发生垃圾回收,回收过程可以讲JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,如Minor GC,Major GC,full GC这几个讲清楚,还有对象存活判断方法,还 ...
后端思维篇二:手把手教你实现一个并行调用模板
前言大家好,我是捡田螺的小男孩。
本文是后端思维专栏的第二篇哈。上一篇36个设计接口的锦囊,得到非常多小伙伴的认可。36个设计接口的锦囊中也提到一个点:就是使用并行调用优化接口。所以接下来就快马加鞭,写第二篇:手把手教你写一个并行调用模板。
一个串行调用的例子(App首页信息查询)
CompletionService实现并行调用
抽取通用的并行调用方法
代码思考以及设计模式应用
思考总结
公众号:捡田螺的小男孩
1. 一个串行调用的例子如果让你设计一个APP首页查询的接口,它需要查用户信息、需要查banner信息、需要查标签信息等等。一般情况,小伙伴会实现如下:
12345678910111213public AppHeadInfoResponse queryAppHeadInfo(AppInfoReq req) { //查用户信息 UserInfoParam userInfoParam = buildUserParam(req); UserInfoDTO userInfoDTO = userService.queryUserInfo(userInfoP ...