1. 什么是短网址?
转化为为:http://wzs.ink/2Bn
这样一个网址就变成了短网址
2.短网址的好处?
2.1 短网址美观
2.2 减少了网址的字符
2.3 短地址的请求,可以帮助分析uv,pv,user-agent,ip等相关的信息
3.原理?
3.1 短网址实际上是建立了一个映射:短网址-->原长网址。
3.2 用户使用短网址发起请求, 服务器返回302( 也可以使用301)状态码和对应长地址的location
3.3 用户浏览器看到302状态码的时候, 解析header中的location,请求真正的地址
4.短地址长地址的映射关系建立
1.选定短地址的编码字符集:0-9, a-z, A-Z, 一共62个字符,短地址存储空间可以简单想想一下有多大
2. 选定字符集, 选数据结构, 假设数据是存在数据苦中的,三个简单字段:id, short_url, long_url, 其中id字段自增
3. 对于每一个长地址,都会有一个id, 对id进行62进制编码,就是对应的短地址
4. 短地址路径转化为十进制后就是对应的id, 这样就可以查出对应的长地址
5. 编解码代码:
private static String chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static int scale = 62;
public static String encode(long num) {
StringBuilder sb = new StringBuilder();
int remainder = 0;
while (num > scale - 1) {
remainder = Long.valueOf(num % scale).intValue();
sb.append(chars.charAt(remainder));
num = num / scale;
}
sb.append(chars.charAt(Long.valueOf(num).intValue()));
String value = sb.reverse().toString();
return value;
}
public static long decode(String str) {
str = str.replace("^0*", "");
long num = 0;
int index = 0;
for (int i = 0; i < str.length(); i++) {
index = chars.indexOf(str.charAt(i));
num += (long) (index * (Math.pow(scale, str.length() - i - 1)));
}
return num;
}
6. 重定向代码:
String path = request.getRequestURI().split("/")[1];
Long pathId = WzsUrl.decode(path);
Urls urls = urlsRepository.findFirstById(pathId);
if(urls != null){
response.setStatus(HttpStatus.MOVED_TEMPORARILY.value());
response.setHeader("Location",urls.getLurl());
return false;
}