Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
言
為了攔截大部分請求,秒殺案例前端引入了驗證碼。淘寶上很多人吐槽,等輸入完秒殺活動結束了,對,結束了...... 當然了,驗證碼的真正作用是,有效攔截刷單操作,讓羊毛黨空手而歸。
驗證碼
如果想學習Java工程化、高性能及分布式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級交流:854630135,群里有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給大家。
那么到底什么是驗證碼呢?驗證碼作為一種人機識別手段,其終極目的,就是區分正常人和機器的操作。我們常見的互聯網注冊、登錄、發帖、領優惠券、投票等等應用場景,都有被機器刷造成各類損失的風險。
目前常見的驗證碼形式多為圖片驗證碼,即數字、字母、文字、圖片物體等形式的傳統字符驗證碼。這類驗證碼看似簡單易操作,但實際用戶體驗較差(參見12306網站),且隨著OCR技術和打碼平臺的利用,圖片比較容易被破解,被破解之后就形同虛設。
這里我們使用騰訊的智能人機安全驗證碼,告別傳統驗證碼的單點防御,十道安全柵欄打造立體全面的安全驗證,將黑產拒之門外。
場景
下面我們來瞅瞅驗證碼輕松解決了那些場景安全問題:
申請
申請地址:https://007.qq.com/product.html
在線體驗:https://007.qq.com/online.html
只要一個QQ就可以免費申請,對于一般的企業OA系統或者個人博客網站,驗證碼免費套餐足夠了已經,具備以下特點:
2000次/小時的安全防護,一般很少達到如此效果,當然了即時超出閾值,頂多也就是多個廣告而已。
接入
快讀接入:https://007.qq.com/quick-start.html
接入與幫助提供了多種客戶端和服務端的接入案例,這里我們使用我們秒殺案例中最熟悉的Java語言來接入。
前端
引入JS:
<script src="https://ssl.captcha.qq.com/TCaptcha.js"></script>
頁面元素:
<!--點擊此元素會自動激活驗證碼,不一定是button,其他標簽也可以--> <!--id : 元素的id(必須)--> <!--data-appid : AppID(必須)--> <!--data-cbfn : 回調函數名(必須)--> <!--data-biz-state : 業務自定義透傳參數(可選)--> <button id="TencentCaptcha" data-appid="*********" data-cbfn="callback">驗證</button>
JS回調:
<script type="text/javascript"> window.callback = function(res){ console.log(res) // res(未通過驗證)= {ret: 1, ticket: null} // res(驗證成功) = {ret: 0, ticket: "String", randstr: "String"} if(res.ret === 0){ startSeckill(res) } } //后臺驗證ticket,并進入秒殺隊列 function startSeckill(res){ $.ajax({ url : "startSeckill", type : 'post', data : {'ticket' : res.ticket,'randstr':res.randstr}, success : function(result) { //驗證是否通過,提示用戶 } }); } </script>
后端
@Api(tags = "秒殺商品") @RestController @RequestMapping("/seckillPage") public 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<String, String> params= new LinkedMultiValueMap<String, String>(); params.add("aid", aid); params.add("AppSecretKey", appSecretKey); params.add("Ticket", ticket); params.add("Randstr", randstr); params.add("UserIP", IPUtils.getIpAddr(request)); String msg = httpClient.client(url,method,params); /** * response: 1:驗證成功,0:驗證失敗,100:AppSecretKey參數校驗錯誤[required] * evil_level:[0,100],惡意等級[optional] * err_msg:驗證錯誤信息[optional] */ //{"response":"1","evil_level":"0","err_msg":"OK"} JSONObject 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<String, String> params){ RestTemplate client = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); // 請勿輕易改變此提交方式,大部分的情況下,提交方式都是表單提交 headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers); // 執行HTTP請求 ResponseEntity<String> response = client.exchange(url, HttpMethod.POST, requestEntity, String.class); return response.getBody(); } }
獲取IP地址工具類 IPUtils :
/** * IP地址 */ public 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://localhost:8080/seckill/1000.shtml
定制接入
在系統登錄的時候,我們需要先校驗用戶名以及密碼,然后調用驗證碼操作,這里就需要我們定制接入了。
<!-- 項目中使用了Vue --> <div class="log_btn" @click="login" >登錄</div> 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: "json", success: function(result){ //校驗是否成功 } }); } }); captcha.show(); // 顯示驗證碼 },
后臺監控
騰訊后臺還提供了簡單實用的數據監控,如下:
歡迎工作一到八年的Java工程師朋友們加入Java高級交流:854630135
本群提供免費的學習指導 架構資料 以及免費的解答
不懂得問題都可以在本群提出來 之后還會有直播平臺和講師直接交流噢
完小編前段時間發表的HTML學習之后,相信大家對網站建設與網頁編寫有了一定的初步了解,今天我們來開始介紹層疊樣式表css,css是為HTML頁面的排版美化而設計的,可以實現html無法設計的效果,一般是用來配合html來使用的,一般模式:選擇器{屬性:值}即selector{property:value}例如:body{corlor:red;font-size:12px;},他有三種引入方式:行內樣式、內部樣式表、外部樣式表。
css三種嵌入方式:
一、行內樣式
使用style屬性引入CSS樣式。
示例:
<h1 style="color:red;">style屬性的應用</h1>
<p style="font-size:14px;color:green;">直接在HTML標簽中設置的樣式</p>
實際在寫頁面時不提倡使用,在測試的時候可以使用。
例如:
<!DOCTYPE> <html> <head> <meta charset="utf-8" /> <title>行內樣式</title> </head> <body> <!--使用行內樣式引入CSS--> <h1 style="color:red;">Leaping Above The Water</h1> <p style="color:red;font-size:30px;">我是p標簽</p> </body> </html>
二、內部樣式表
在style標簽中書寫CSS代碼。style標簽寫在head標簽中。
示例:
<head>
<style type="text/css">
h3{
color:red;
}
</style>
</head>
例如:<!DOCTYPE> <html> <head> <meta charset="utf-8" /> <title>內部樣式表</title> <!--使用內部樣式表引入CSS--> <style type="text/css"> div{ background: green; } </style> </head> <body> <div>我是DIV</div> </body> </html>
三、外部樣式表
CSS代碼保存在擴展名為.css的樣式表中
HTML文件引用擴展名為.css的樣式表,有兩種方式:鏈接式、導入式。
語法:
1、鏈接式
<link type="text/css" rel="styleSheet" href="CSS文件路徑" />
2、導入式
<style type="text/css">
@import url("css文件路徑");
</style>
例如:<!DOCTYPE> <html> <head> <meta charset="utf-8" /> <title>外部樣式表</title> <!--鏈接式:推薦使用--> <link rel="stylesheet" type="text/css" href="css/style.css" /> <!--導入式--> <style type="text/css"> @import url("css/style.css"); </style> </head> <body> <ol> <li>1111</li> <li>2222</li> </ol> </html>
行內樣式>內部樣式>外部樣式(后兩者是就近原則)。
css注釋格式如下:
/* 注釋如下*/
css中的顏色值表示如下:
可以是直接寫英文單詞,例如藍色盡可以寫blue;還可以寫為十六進制字符,例如#rrggbb\#ffcc00,#rgb如:#fc0十六進制的顏色可以在顏色表中查詢,這里我給大家提供一個,當然網上也有很多,大家也可以自己百度一下:
還有一種顏色的表示方式就是rbg模式,例如:
rgb(x,x,x) 其中x是一個0-255的整數值如:rgb(255,204,0)
rgb(x%,x%,x%) 其中x是一個0-100的整數值如rgb(100%,80%,0%)
Css的長度單位:
相對長度單位:px 像素(Pixel) em 相對于當前文本字體尺寸的倍數 % 百分比
絕對長度單位:in英寸(Inch) pt 點(Point) cm 厘米(Centimeter)mm 毫米(Millimeter)。
換算比例:1in = 2.54cm = 25.4 mm = 72pt
Css的七大類選擇器:
標簽選擇器 例如:p{};
類選擇器 例如.div{};(一個點加命名的類名)
Id選擇器 例如 #div{};(斜體井號加ID名,ID是不可重復的,類可以相同)
通配符選擇器:*{};
偽類選擇器:
a:link{}沒有訪問時的鏈接;
a:visited{}已經訪問過時的鏈接;
a:hove{}鼠標滑過時的鏈接;
a:active{}已經選中的鏈接;
:first-child{}為第一個字符設置樣式;
:last-child{}為最后一個字符設置樣式;
:nth-child(){}可以為指定字符設置樣式
派生選擇器(后代選擇器、子元素選擇器和相鄰兄弟選擇器):
后代選擇器: 以空格分隔
div ul li {color:#0099cc;}
子元素選擇器: 以>分隔
div >ul li
相鄰兄弟選擇器: 以+分隔
div + div ul li
最后一個就是組合選擇器,以逗號隔開
h1, h2, h3, h4, h5, h6 { color: green }
好了,css基礎就給大家介紹到這里,有什么不懂得地方可以給小編留言,如果您有什么好的建議也可以關注小編,我們共同學習,共同討論,共同進步,接下來我們會介紹下css的屬性,敬請期待吧
果想開發一個網站,除了要精通后端開發語言(如:php)外,還要精通HTML代碼。那么,什么是HTML呢?HTML是一種超文本標記語言,它包含有眾多的標簽,我們可以通過這些標簽,把不同的internet資源(如:文字、圖片、視頻、音頻、表單等等)整合在一個統一的文檔中,這就形成了我們可以看得見的網頁。那么,HTML都有哪些常用的標簽呢?
html5文檔類型聲明:<!doctype html>
html4文檔類型聲明:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
這個標簽是html最外層的標簽,所有其它的HTML標簽都要放在這個標簽的內部。
<html>
<head></head>
<body></body>
</html>
在HTML標簽中,有的標簽是成雙成對的,如:<html></html>(如下圖);而有的標簽是單個的,如:<hr>橫線標簽。
head頭部有以下幾種常用標簽:
meta:主要提供有關頁面的元信息。
link:用來定義文檔與外部資源的關系,最常用的是調用CSS樣式文件。
title:頁面標題的標簽。
script:用來調用JS文件或JS代碼。當然,script標簽也可以在body主體中使用。
1、塊級標簽。
塊級標簽的特性是:獨自占有一行;標簽的高與寬、邊距可以修改;沒有設置寬與高時,默認繼承父標簽。例如:
<div>div1</div>
<div>div2</div>
<style>
.aa1{ border:1px solid #000; width:150px; height:100px; margin:30px; }
.aa2{ border:1px solid #000; width:150px; height:100px; margin:30px; }
</style>
前端頁面顯示的效果如下圖:
常用的塊級標簽有:div、h1、h2、h3、h4、h5、h6、hr、menu、ul、ol、li、dl、dt、dd、table、p、form 。
2、內聯標簽。
內聯標簽與塊級標簽不同,它不能獨自占有一行,會與其它內聯標簽在同一樣展示;內聯標簽的高與寬、上下邊距是不能修改的,它里面的文字或圖片有多高,它就是多高。例如如下代碼:
<style>
.aa1{ border:1px solid #000; width:150px; height:100px; margin:30px; }
.aa2{ border:1px solid #000; width:150px; height:100px; margin:30px; }
</style>
<span>span1</span>
<span>span2</span>
CSS樣式代碼跟塊級標簽的例子是一樣的,而顯示的效果就不一樣了,寬與高、上下邊距沒有效果。如下圖:
常用的內聯標簽有:span、a、b、strong、i、em 。
3、內聯塊級標簽。
內聯塊級標簽,既有一些內聯標簽的特性,也有一些塊級標簽的特點:它不能獨自占有一行,但是可以修改它的寬度和高度。例如下面這段代碼:
<style>
.aa1{ border:1px solid #000; width:150px; height:100px; margin:30px; }
.aa2{ border:1px solid #000; width:150px; height:100px; margin:30px; }
</style>
<img src="w5.jpg" alt="">
<img src="w5.jpg" alt="">
CSS樣式代碼跟塊級標簽的那個例子仍然是一樣的,圖片的寬和高、上下邊距修改成功,而2個圖片不能獨自占有一行,而是在同一行。如下圖:
常用的內聯塊級標簽有:img、input、textarea。
4、區域標簽。
所謂區域標簽,就是主要用來劃分布局頁面區域的。如:頭部、主體內容、側邊欄、底部。這樣劃分的好處是:讓頁面布局更加清晰明了。
常用的區域標簽有:header(頭部)、footer(底部)、nav(導航)、aside(側邊欄)、section(主體)、article(獨立內容)。
5、表單標簽。
這個表單標簽我們也是會經常用到的,如:登錄網站的時候、提交數據的時候。如下圖的評論表單:
?表單常用的標簽有:form、input、select、option、textarea 。
以上就是我們開發網頁時,會常用到的HTML標簽。當然,HTML標簽遠不止這些,尤其是html5出來后,新增了許多的新標簽。但是,有些標簽在我們開發中很少用到,所以,這里就沒有做相應的介紹。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。