欢迎大家来到IT世界,在知识的湖畔探索吧!
重发和重定向有什么区别
重发
方式1:
request.getRequestDispatcher("new.jsp").forward(request, response);//转发到new.jsp
欢迎大家来到IT世界,在知识的湖畔探索吧!
方式2:
欢迎大家来到IT世界,在知识的湖畔探索吧!<jsp:forward page="apage.jsp" />
重定向
方式一:
response.sendRedirect("new.jsp");//重定向到new.jsp
方式二:
欢迎大家来到IT世界,在知识的湖畔探索吧!<%response.sendRedirect("new.jsp");//重定向到new.jsp%>
转发是服务器行为,重定向是客户端行为
如何理解重定向与转发
重定向,其实是两次request,
第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
转发
请求转发是服务器内部把对一个request/response的处理权,移交给另外一个 对于客户端,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。传输的信息不会丢失。
更形象的解释:
重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。
转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了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
重定向的应用 : 短连接跳转
举个例子:
这样一个短连接,点击后,会跳转到真实的 app 的一个页面,这个是怎么实现的?
为啥要短链接
给用户发送短信的时候,发送一个链接,当用户点击链接的时候,能够打开app,同时跳转到app的某一个页面。这个时候就需要app端给我提供一个链接(肯定带了参数),但是发送短信的时候又不能完全把这个链接发送给用户。一是因为那样的链接太丑,二是因为太长。所以则用到了短链接。
- https://blog.csdn.net/qq_38111316/article/details/88587845
短链接实现原理?
就是把一个长地址如:http://zhyq.shibei.com/article/article.htm 用一个算法转换成短地址如:http://csdn.cn/7bqr87dc。然后把7bqr87dc——->http://zhyq.shibei.com/article/article.htm之间的对应关系保存到数据库中去。当用户访问http://csdn.cn/7bqr87dc链接时,系统到数据库中找到真实的URL地址,实现跳转。
短链接算法
算法1
MD5的生成的 ,其实这个算法主要是把长字符串变小 ,这个算法是不可逆的,所以别想着去直接反转短地址 .
利用MD5的算法,其具体过程为:
- 将原始长链接进行MD5加密,为了避免防止算法泄漏,可以在原链接上添加自定义的字符串作为密钥。
- 把128位的MD分成四组,每组32位,对应一个候选短链接。
- 对于每个32位的数,将它与0x3FFFFFFF进行位与运算,取其低30位的数据。把得到的值与0x0000003D进行位与运算,再把得到的结果作为下标在字符表中选取字符,再把原数字右移5位进行相同操作,重复进行6次得到6个字符,即组成一个候选短链接地址。
- 在4个候选短链接中随机选择一个作为最终的短链接,把长短链接映射关系存入数据库中。
算法实现:
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" };
// 对传入网址进行 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];
// 每次循环按位右移 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]));
else
md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
}
return md5StrBuff.toString();
}
}
算法2
算法本质上就是一个长短链接的映射过程,那么一个简单的想法是用递增的序号来表示短链接,每次进来一个长链接时,把它映射成当前的序号,同时把序号递增以供下一个链接使用。因为链接地址同时使用的是a-z、A-Z和0-9这62个字符,把10进制的序号值转化为这个62进制的表示即可得到对应的短链接。
26个大写字母 26小写字母,10个数字,随机生成6个然后插入数据库对应一个id,短连接跳转的时候,根据字符串查询到对应id,即可实现相应的跳转!不过2的62次方,大概率上不会重复。这个利用的就是低进制转化为高进制时,字符数会减少的特性。
key 就是id value 是真实 url ,id 转换成62进制即可生成短链接。
- https://tool.lu/hexconvert/
这个直接的想法非常简单粗暴,另外一个直观的想法是使用随机的方法生成长短链接的映射关系。每次进来一个长链接时就随机一个短链接来进行映射,如果通过数据库查询发现此短链接已经使用过,则重新进行随机直到产生一个未曾使用过的短链接为止
短链接生成
实现思路
服务器收到一个短链接请求时,需要把从http地址中解析出短链接,然后将得到的短链接在数据库中进行查询,找到其对应的长连接,进而重定向到该长长链接对应的地址。
- 建立一个存短链接的表
2.当点击短链接的时候,跳转到一个html页面,然后加载该页面的时候,通过ajax调用一个接口,返回该链接的真实地址,然后在重定向到真实的地址。
<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("不支持当前设备");
}
},"json");
}
</script>
举个例子
当我们在浏览器里输入 http://t.cn/RlB2PdD 时
- DNS首先解析获得 http://t.cn 的 IP 地址
- 当 DNS 获得 IP 地址以后(比如:74.125.225.72),会向这个地址发送 HTTP GET 请求,查询短码 RlB2PdD
- http://t.cn 服务器会通过短码 RlB2PdD 获取对应的长 URL
- 请求通过 HTTP 301 转到对应的长 URL https://m.helijia.com 。
301 是永久重定向,302 是临时重定向。短地址一经生成就不会变化,所以用 301 是符合 http 语义的。同时对服务器压力也会有一定减少。
欢迎关注公众号:程序员开发者社区
本文使用 mdnice 排版
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/34655.html