微信
手机版
网站地图

山东省人力资源和社会保障厅,从构建分布式秒杀体系聊聊验证码,阴阳石

2019-03-30 08:13:30 投稿人 : admin 围观 : 343 次 0 评论

前语

为了阻拦大部分恳求,秒杀事例前端引进了验证码。淘宝上很多人吐槽,等输入完秒杀活动完毕了,对,完毕了...... 当然了,验证码的实在作用是,有用阻拦刷单操作,让羊毛党空手而归。

验证码

假如想学习Java工程化、高性能及分布式、浅显易懂。微效劳、Spring,MyBatis,Netty源码剖析的朋友能够加我的Java高档沟通:854630135,群里有阿里大牛直播解说技能,以及Java大型互联网技能的视频免费共享给咱们。

那么究竟什么是验证码呢?验证码作为一种人机辨认手法,其终极意图,便是区别正常人和机器的操作。咱们常见的互联网注册、登录、发帖、领优惠券、投票等等运用场景,都有被机器刷形成各类丢失的危险。

现在常见的验证码方法多为图片验证码,即数字、字母、文字、图片物体等方法的传统字符验证码。这类验证码看似简略易操作,但实践用户体会较差(拜见12306网站),且跟着O我超勇的CR技能和打码渠道的运用,图片比较简略被破解,被破解之后就形同虚设。

这儿咱们运用腾讯的智能人机安全验证码,离别传统验证码的单点防护,十道安全栅门打造立体全面的安全验证,将黑产拒之门外。

场景

从构建分布式秒杀系统聊聊验证码

下面咱们来瞅瞅验证码轻松处理了那些场景安全问题:

  • 登录注册,为你防护撞库进犯、阻挠注册机批量注册山东省人力资源和社会保障厅,从构建分布式秒杀系统聊聊验证码,阴阳石
  • 活动秒杀,有用阻拦刷单操作,让羊毛党空手而归
  • 点赞发帖,有用处理广告屠版、歹意灌水、刷票问题
  • 数据维护,避免主动机、爬虫盗取网页内容和数据

恳求

恳求地址:https://007.qq.com/product.html

在线体会:https://007.qq.com/online.html

只需一个QQ就能够免费恳求,关于一般的企业OA系统或许个人博客网站,验证码免费套餐足够了现已,具有以下特色:

  • 2000次/小时安全防护
  • 支撑免验证+分级验证
  • 三分钟快速接入
  • 全功能装备后台
  • 支撑HTTPS
  • 阈值内流量无广告

2000次/小时的安全防护,一般很少到达如此作用,当然了即时超出阈值,顶多也便是多个广告罢了融水苗歌。

接入

快暗码子医考读接入:https://007.qq.com/quick-start.html

接入与协助供给了多种客户端和效劳端的接入事例,这儿咱们运用咱们秒杀事例中最了解的Java言语来接入。

前端

引进JS:

 

页面元素:







JS回调:


后端

@安身美利坚Api(tags = "秒杀产品")
@RestController
@RequestMapping("/seckill人和马Page")
pub山东省人力资源和社会保障厅,从构建分布式秒杀系统聊聊验证码,阴阳石lic class SeckillPageController {

@Autowired
private ActiveMQSender activeMQSender;
//自定义东西类
@Autowired
private HttpClient httpClient;
//这儿自行装备参数
@Value("${qq.captcha.url}")
private String url;
@Value("${qq.captcha.aid}")
private String aid;
@Value("${qq.captcha.AppSecretKey}")
private String appSecretKey;

@RequestMapping("/startSeckill")
public Result startSeckill(String ticket,String randstr,HttpServletRequest request) {
HttpMethod method =HttpMethod.POST;
MultiValueMap params= new LinkedMultiValueMap();
params.add("aid", aid);
para迁爱ms.add("AppSecretKey", appSecretKey);
params.add("Ticket", ticket);
params.add("Randstr"川大玻璃杯, randstr);
params.add("UserIP", IPUtils.getIpAddr(request));
String msg = httpClient.client(url,method,params);
/**
* re湖南腊味六绝sponse: 1:验证成功,0:验证失利,100:AppSecretKey参数校验过错[required]
* evil_level:[0,100],歹意等级[optional]
* err_msg:验证过错信息[optional]
*/
//{"response":"1","evil_level":"0","err_msg":"OK"}
JSONOb小敏原唱这条路一同走ject json = JSONObject.parseObject(msg);
String response = (String) json.get("response");
if山东省人力资源和社会保障厅,从构建分布式秒杀系统聊聊验证码,阴阳石("1".equals(response)){
//进入行列、假数据罢了
Destination destination = new ActiveMQQueue("seckill.周芳芳霸座queue");
activeMQSender.sendChannelMess(destination,1000+";"+1);
return Result.ok();
}else{
return Result.error("验证失利");
}
}
}

自定义恳求东西类 HttpClient:

假如想学习Java工程化、高性能及分布式、浅显易懂。微效劳、Spring,MyBatis,Netty源码剖析的朋友能够加我的Java高档沟通:854630135,群里有阿里大牛直播解说技能,以及Java大型互联网技能的视频免费共享给咱们。

@Service
public class HttpClient {
public String client(String url, HttpMethod method, MultiValueMap params){
RestTemplate cli老公不卸职ent = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
// 请勿容易改动此提交方法,大部分的情况下,提交方法都是表单提交
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity> requestEntity = new HttpEntity>(params, headers);
// 履行HTTP恳求
ResponseEntity response = client.exchange(url, HttpMethod.POST, requestEntity, String.class);
return response.getBody();
}
}

获取IP地址东西类 IPUtils :

/**
* IP地址
*/
pub调教美少年lic class IPUtils {
private static Logger logger = LoggerFactory.getLogger(IPUtils.class);
/**
* 获取IP地址
* 运用Nginx等反向署理软件, 则不能经过request.getRemoteAddr()获取IP地址
* 假如运用了多级反向署理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有用IP字符串,则为实在IP地址
*/
public static String getIpAddr(HttpServletRequest request) {
String山东省人力资源和社会保障厅,从构建分布式秒杀系统聊聊验证码,阴阳石 ip = null;
try {
ip = request.getHeader(半玥清腋臭粉"x-forwarded-for");
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(任侠家新浪博客ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
} catch (Exception e) {
logger.error("IPUtils ERROR ", e);
}
// 运用署理,则获取第一个IP地址
if (StringUtils.isEmpty(ip) && ip.length() > 15) {
if (ip.indexOf(",") > 0) {
ip = ip.substring(搞绵羊0, ip.indexOf(","));
}
}
return ip;
}
}

事例作用图

发动项目拜访:http://localho山东省人力资源和社会保障厅,从构建分布式秒杀系统聊聊验证码,阴阳石st:8080/seckill/1000.shtml

从构建分布式秒杀系统聊聊验证码

从构建分布式秒杀系统聊聊验证码

定制接入

在系统登录的时分,咱们需求先校验用户名以及暗码,然后调用验证码操作,这儿就需求咱们定制接入了。


登录

login: function () {
//这儿校验用户名以及暗码
// 直接生成一个验证码目标
var captcha = new TencentCaptcha('2001344788', function(res) {
甄淑梅if(res.ret === 0){//回调成功山东省人力资源和社会保障厅,从构建分布式秒杀系统聊聊验证码,阴阳石
var data = {'username':username,'password':password,'ticket':res.ticket,'randstr':res.randstr}
$.ajax({
type: "POST",
url: "sys/loginCaptcha",
data: data,
dataType: "js亿万宝宝老公不担任on",
success: function(result){
//校验是否成功
}
}起舞捣蒜);
}
});
captcha.show(); // 显现验证码
},

后台监控

腾讯后台还供给了简略有用的数据监控,如下:

欢迎作业一到八年的Java工程师朋友们参加Java高档沟通:854630135

本群供给免费的学习辅导 架构材料 以及免费的回答

不懂得问题都能够在本群提出来 之后还会有直播渠道和讲师直接沟通噢

相关文章

标签列表