重发和重定向有什么区别

重发

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

  • 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的算法,其具体过程为:

  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进制即可生成短链接。

  • https://tool.lu/hexconvert/
重发和重定向有什么区别与重定向应用

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

短链接生成

实现思路

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

  1. 建立一个存短链接的表
重发和重定向有什么区别与重定向应用

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