重发和重定向有什么区别与重定向应用

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 重发和重定向有什么区别与重定向应用

重发和重定向有什么区别



重发


方式1:


request.getRequestDispatcher("new.jsp").forward(request, response);//转发到new.jsp

方式2:


<jsp:forward page="apage.jsp" />

重定向


方式一:


response.sendRedirect("new.jsp");//重定向到new.jsp

方式二:


<%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的人,让他们办好后,送了过来。


重定向的应用 :短连接跳转


举个例子:

640.png

这样一个短连接,点击后,会跳转到真实的 app 的一个页面,这个是怎么实现的?


为啥要短链接


给用户发送短信的时候,发送一个链接,当用户点击链接的时候,能够打开app,同时跳转到app的某一个页面。这个时候就需要app端给我提供一个链接(肯定带了参数),但是发送短信的时候又不能完全把这个链接发送给用户。一是因为那样的链接太丑,二是因为太长。所以则用到了短链接。


短链接实现原理?


就是把一个长地址如: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的算法,其具体过程为:

  1. 将原始长链接进行MD5加密,为了避免防止算法泄漏,可以在原链接上添加自定义的字符串作为密钥。
  2. 把128位的MD分成四组,每组32位,对应一个候选短链接。
  3. 对于每个32位的数,将它与0x3FFFFFFF进行位与运算,取其低30位的数据。把得到的值与0x0000003D进行位与运算,再把得到的结果作为下标在字符表中选取字符,再把原数字右移5位进行相同操作,重复进行6次得到6个字符,即组成一个候选短链接地址。
  4. 在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进制即可生成短链接。


640.png


这个直接的想法非常简单粗暴,另外一个直观的想法是使用随机的方法生成长短链接的映射关系。每次进来一个长链接时就随机一个短链接来进行映射,如果通过数据库查询发现此短链接已经使用过,则重新进行随机直到产生一个未曾使用过的短链接为止


短链接生成


实现思路


服务器收到一个短链接请求时,需要把从http地址中解析出短链接,然后将得到的短链接在数据库中进行查询,找到其对应的长连接,进而重定向到该长长链接对应的地址。


  1. 建立一个存短链接的表

640.png


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 语义的。同时对服务器压力也会有一定减少。

相关文章
|
存储 Java 应用服务中间件
一文了解转发与重定向
一文了解转发与重定向
106 0
|
应用服务中间件
重定向(重要)!!
重定向(重要)!!
177 1
重定向(重要)!!
|
存储 C++ iOS开发
C++中的I/O重定向
在 C 中,我们可以使用函数freopen()将现有的 FILE 指针重定向到另一个流。freopen() 的原型为
83 0
|
前端开发
请求转发与请求重定向
请求转发与请求重定向
266 0
请求转发与请求重定向
45请求转发和请求重定向区别
45请求转发和请求重定向区别
92 0
45请求转发和请求重定向区别
|
搜索推荐
重定向响应
什么是重定向响应
|
Python
一日一技:怎么>重定向不过去了?
一日一技:怎么>重定向不过去了?
224 0
一日一技:怎么>重定向不过去了?
转发与重定向有什么区别
转发与重定向有什么区别
117 0
|
搜索推荐 Linux Apache
301重定向是什么?301重定向怎么做?
页面永久性移走(301重定向)是一种非常重要的“自动转向”技术。网址重定向最为可行的一种办法。当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。 301永久重定向对SEO无任何不好的影响,而且网页A的的权重都会传达给网页B,对于搜索引擎优化、网站优化来说,给搜索引擎一个友好的信息,告诉它此页面已永久重定向,避免搜索引擎找不到页面。
304 0
|
缓存 Shell