如何阻止ajax自动重定向_重发和重定向有什么区别与重定向应用
重發(fā)和重定向有什么區(qū)別
重發(fā)
方式1:
request.getRequestDispatcher("new.jsp").forward(request, response);//轉(zhuǎn)發(fā)到new.jsp方式2:
<jsp:forward page="apage.jsp" />重定向
方式一:
response.sendRedirect("new.jsp");//重定向到new.jsp方式二:
<%response.sendRedirect("new.jsp");//重定向到new.jsp%>轉(zhuǎn)發(fā)是服務(wù)器行為,重定向是客戶端行為
如何理解重定向與轉(zhuǎn)發(fā)
重定向,其實(shí)是兩次request,
第一次,客戶端request A,服務(wù)器響應(yīng),并response回來,告訴瀏覽器,你應(yīng)該去B。這個(gè)時(shí)候IE可以看到地址變了,而且歷史的回退按鈕也亮了。重定向可以訪問自己web應(yīng)用以外的資源。在重定向的過程中,傳輸?shù)男畔粊G失。
轉(zhuǎn)發(fā)
請求轉(zhuǎn)發(fā)是服務(wù)器內(nèi)部把對一個(gè)request/response的處理權(quán),移交給另外一個(gè) 對于客戶端,它只知道自己最早請求的那個(gè)A,而不知道中間的B,甚至C、D。傳輸?shù)男畔⒉粫G失。
更形象的解釋:
重定向:你先去了A局,A局的人說:“這個(gè)事情不歸我們管,去B局”,然后,你就從A退了出來,自己乘車去了B局。
轉(zhuǎn)發(fā):你先去了A局,A局看了以后,知道這個(gè)事情其實(shí)應(yīng)該B局來管,但是他沒有把你退回來,而是讓你坐一會兒,自己到后面辦公室聯(lián)系了B的人,讓他們辦好后,送了過來。
- https://blog.csdn.net/meiyalei/article/details/2129120?utm_medium=distribute.wap_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.wap_blog_relevant_pic&depth_1-utm_source=distribute.wap_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.wap_blog_relevant_pic
重定向的應(yīng)用 : 短連接跳轉(zhuǎn)
舉個(gè)例子:
這樣一個(gè)短連接,點(diǎn)擊后,會跳轉(zhuǎn)到真實(shí)的 app 的一個(gè)頁面,這個(gè)是怎么實(shí)現(xiàn)的?
為啥要短鏈接
給用戶發(fā)送短信的時(shí)候,發(fā)送一個(gè)鏈接,當(dāng)用戶點(diǎn)擊鏈接的時(shí)候,能夠打開app,同時(shí)跳轉(zhuǎn)到app的某一個(gè)頁面。這個(gè)時(shí)候就需要app端給我提供一個(gè)鏈接(肯定帶了參數(shù)),但是發(fā)送短信的時(shí)候又不能完全把這個(gè)鏈接發(fā)送給用戶。一是因?yàn)槟菢拥逆溄犹?#xff0c;二是因?yàn)樘L。所以則用到了短鏈接。
- https://blog.csdn.net/qq_38111316/article/details/88587845
短鏈接實(shí)現(xiàn)原理?
就是把一個(gè)長地址如:http://zhyq.shibei.com/article/article.htm 用一個(gè)算法轉(zhuǎn)換成短地址如:http://csdn.cn/7bqr87dc。然后把7bqr87dc------->http://zhyq.shibei.com/article/article.htm之間的對應(yīng)關(guān)系保存到數(shù)據(jù)庫中去。當(dāng)用戶訪問http://csdn.cn/7bqr87dc鏈接時(shí),系統(tǒng)到數(shù)據(jù)庫中找到真實(shí)的URL地址,實(shí)現(xiàn)跳轉(zhuǎn)。
短鏈接算法
算法1
MD5的生成的 ,其實(shí)這個(gè)算法主要是把長字符串變小 ,這個(gè)算法是不可逆的,所以別想著去直接反轉(zhuǎn)短地址 .
利用MD5的算法,其具體過程為:
算法實(shí)現(xiàn):
import java.security.MessageDigest;public class ShotUrlUtil {public static void main(String[] args) {System.out.println(shortUrl("http://www.baidu.com/"));}public static String shortUrl(String url) {String[] chars = new String[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x","y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P","Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };// 對傳入網(wǎng)址進(jìn)行 MD5 加密String md5str = getMD5Str(url);System.out.println(md5str);String hex = md5str;String sTempSubString = hex.substring(8, 16);long lHexLong = 0x3FFFFFF3 & Long.parseLong(sTempSubString, 16);String outChars = "";for (int j = 0; j < 6; j++) {long index = 0x0000003C & lHexLong;outChars += chars[(int) index];// 每次循環(huán)按位右移 5 位lHexLong = lHexLong >> 5;}return outChars;}private static String getMD5Str(String str) {MessageDigest messageDigest = null;try {messageDigest = MessageDigest.getInstance("MD5");messageDigest.reset();messageDigest.update(str.getBytes("UTF-8"));} catch (Exception e) {System.out.println("catch!");}byte[] byteArray = messageDigest.digest();StringBuffer md5StrBuff = new StringBuffer();for (int i = 0; i < byteArray.length; i++) {if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));elsemd5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));}return md5StrBuff.toString();} }算法2
算法本質(zhì)上就是一個(gè)長短鏈接的映射過程,那么一個(gè)簡單的想法是用遞增的序號來表示短鏈接,每次進(jìn)來一個(gè)長鏈接時(shí),把它映射成當(dāng)前的序號,同時(shí)把序號遞增以供下一個(gè)鏈接使用。因?yàn)殒溄拥刂吠瑫r(shí)使用的是a-z、A-Z和0-9這62個(gè)字符,把10進(jìn)制的序號值轉(zhuǎn)化為這個(gè)62進(jìn)制的表示即可得到對應(yīng)的短鏈接。
26個(gè)大寫字母 26小寫字母,10個(gè)數(shù)字,隨機(jī)生成6個(gè)然后插入數(shù)據(jù)庫對應(yīng)一個(gè)id,短連接跳轉(zhuǎn)的時(shí)候,根據(jù)字符串查詢到對應(yīng)id,即可實(shí)現(xiàn)相應(yīng)的跳轉(zhuǎn)!不過2的62次方,大概率上不會重復(fù)。這個(gè)利用的就是低進(jìn)制轉(zhuǎn)化為高進(jìn)制時(shí),字符數(shù)會減少的特性。
key 就是id value 是真實(shí) url ,id 轉(zhuǎn)換成62進(jìn)制即可生成短鏈接。
- https://tool.lu/hexconvert/
這個(gè)直接的想法非常簡單粗暴,另外一個(gè)直觀的想法是使用隨機(jī)的方法生成長短鏈接的映射關(guān)系。每次進(jìn)來一個(gè)長鏈接時(shí)就隨機(jī)一個(gè)短鏈接來進(jìn)行映射,如果通過數(shù)據(jù)庫查詢發(fā)現(xiàn)此短鏈接已經(jīng)使用過,則重新進(jìn)行隨機(jī)直到產(chǎn)生一個(gè)未曾使用過的短鏈接為止
短鏈接生成
實(shí)現(xiàn)思路
服務(wù)器收到一個(gè)短鏈接請求時(shí),需要把從http地址中解析出短鏈接,然后將得到的短鏈接在數(shù)據(jù)庫中進(jìn)行查詢,找到其對應(yīng)的長連接,進(jìn)而重定向到該長長鏈接對應(yīng)的地址。
2.當(dāng)點(diǎn)擊短鏈接的時(shí)候,跳轉(zhuǎn)到一個(gè)html頁面,然后加載該頁面的時(shí)候,通過ajax調(diào)用一個(gè)接口,返回該鏈接的真實(shí)地址,然后在重定向到真實(shí)的地址。
<script type="text/javascript" > window.onload =function() {var locationurl = this.location.href;$.get("http://zhyq.shibei.com:8080/cnp/webservice.cnp?method=getShortLink&noSign=true",{"link":locationurl}, function(result){var u = navigator.userAgent;var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android終端var isiOS = !!u.match(/(i[^;]+;( U;)? CPU.+Mac OS X/); //ios終端if (isAndroid) {window.location.href=result.data.android_url;} else if (isiOS){window.location.href=result.data.real_link_url; } else {alert("不支持當(dāng)前設(shè)備");}},"json"); } </script>舉個(gè)例子
當(dāng)我們在瀏覽器里輸入 http://t.cn/RlB2PdD 時(shí)
- DNS首先解析獲得 http://t.cn 的 IP 地址
- 當(dāng) DNS 獲得 IP 地址以后(比如:74.125.225.72),會向這個(gè)地址發(fā)送 HTTP GET 請求,查詢短碼 RlB2PdD
- http://t.cn 服務(wù)器會通過短碼 RlB2PdD 獲取對應(yīng)的長 URL
- 請求通過 HTTP 301 轉(zhuǎn)到對應(yīng)的長 URL https://m.helijia.com 。
301 是永久重定向,302 是臨時(shí)重定向。短地址一經(jīng)生成就不會變化,所以用 301 是符合 http 語義的。同時(shí)對服務(wù)器壓力也會有一定減少。
歡迎關(guān)注公眾號:程序員開發(fā)者社區(qū)
總結(jié)
以上是生活随笔為你收集整理的如何阻止ajax自动重定向_重发和重定向有什么区别与重定向应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hadoop namenode启动不了_
- 下一篇: 如何用vs做界面_5分钟改完100个界面