20191109 短链接技术

短链接(Short Link)顾名思义就是长度比较短的网址。如:http:/ /mrw.so。早期,短链接主要应用在网站的图片上传中,上传网站通过特定的算法缩短 URL(Uniform Resource Locator,统一资源定位符)链接地址,达到减少代码字符数的目的。

自己的理解:把网址长度变短的技术,减少代码字符数。如何生成短的链接?短链接生成器。域名重定向技术。短链接压缩算法

分享的内容也呈多样化趋势,使得短链接服务活跃起来。 借助短链接生成器可以用简短的网址替代原来冗长的网址,给用户留下更多的正文空间。

使url显示的更简短美观,或者使品牌信息更为突出。

微博限制字数为140字一条,那么如果我们需要发一些连接上去,但是这个连接非常的长,以至于将近要占用我们内容的一半篇幅,这肯定是不能被允许的,所以短网址应运而生了。

短链接的实现原理:短链接主要是通过域名重定向技术,将长网址通过一定的算法转换成一个短链接。当用户访问这个短链接时就可以直接跳转到较长的URL地址上。域名重定向技术也可以称为URL 转发技术,它是通过网站服务器或者各种应用程序的设置,将访问当前域名的用户引导至指定的另一个URL地址。

当我们生成短链接之后,只需要在表中(数据库或者NoSql )存储原始链接与短链接的映射关系即可。当我们访问短链接时,只需要从映射关系中找到原始链接,即可跳转到原始链接。

 

@Controller
public class ShortUrlController {

    @GetMapping(value = "/short/url")
    @ResponseBody
    public BaseResponse processShortUrl(HttpServletResponse httpServletResponse) {
        httpServletResponse.setStatus(302);
        //短链接的生成逻辑。
        httpServletResponse.setHeader("location", "https://www.baidu.com/");
        return BaseResponse.toResponse("success");
    }
}

 

长网址转短码一般流程:

1)在数据表 phurl_urls中查找是否已存在该长网址记录,有则返回对应的短码 ;

2)无记录则取数据表 phurl_settings中last_num ber进行高进制转换得到短码 ;

3)数据表phurl_settings中last_num ber加一备以后使用;

4)在 phurl_urls表尾插入短码及长网址对应的新记录。

根据 Phurl的算法,短码无规律可言,短链接和长网址间不存在文本上的关联关系,由于高进制对应字符串的不同,以及短链接请求的先后顺序不同,会导致同样使用 Phurl的不同网站对同一长网址的处理所得到的结果不同。

 

Phurl的转换算法就是将短码和长网址在本地数据库建立一一对应的关系。用户访问短链接时,后台通过查找到对应的长网址,通知客户端,客户端进行页面转向操作。

 

当访问短链接的时候,直接跳转到长链接;

详细的实现步骤是什么?

同一长链接,每次转成的短链接是否一样?

HTTP 301与 302的区别

301 是永久重定向,302 是临时重定向。短地址一经生成就不会变化,所以用 301 是符合 http 语义的。同时对服务器压力也会有一定减少。

但是如果使用了 301,我们就无法统计到短地址被点击的次数了。而点收集击次数的意义那就不言而喻了,关键是现在服务器硬件设备都很好,还有支持高并发的NGINX,所以对服务器的压力几乎可以忽略,最终也就选择302。

 

整个交互流程如下:

1)用户访问短链接:http://t.cn/RtFFvic

2)短链接服务器t.cn收到请求,根据URL路径RtFFvic获取到原始的长链接:http://blog.csdn.net/poem_qianmo/article/details/52344732

3)服务器返回302状态码,将响应头中的Location设置为:http://blog.csdn.net/poem_qianmo/article/details/52344732

4)浏览器重新向http://blog.csdn.net/poem_qianmo/article/details/52344732发送请求

5)返回响应

 

服务器端如何返回指定的302状态码? 302重定向。直接设置HttpResponse响应头即可。

SpringBoot如何获取Request和Response的方法?

在你的方法上加上HttpServletResponse参数,Springboot就会帮你绑定,你可以直接使用。

testMethod( ){

ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();

HttpServletRequest request = servletRequestAttributes.getRequest();

HttpServletResponse response = servletRequestAttributes.getResponse();

}

你可能感兴趣的:(服务器端)