一小时快速撸出一个短网址生成项目

写在最前面

 项目完整源码(欢迎star):https://github.com/wjup/shorturl

引入主题

 前几天在某论坛看到这样一篇帖子,说的是“大家第一个项目,都是从网址导航开始?”,浏览半天回复的内容发现都是大佬啊,有做了个浏览器插件的,有做了个博客的,这个更不错,手撸出来的多厉害。当然也有不少做的网址导航的。
 翻到上面看到一位老哥说的是短网址项目。

 于是我脑瓜一热,百度了下短网址的原理。发现还是很简单的,说时迟那时快,我已经打开了IDEA,创建项目手撸开干。项目架构选择了springboot,持久层还是用的mybatis,前端依然是bootstrap。
用了不到一个下午的时间项目已经出来了。整个项目中,最浪费时间的还是前端调样式。前端菜的一批。

实现原理

下面说下实现的原理
 首先在用户输入一条长链接传到后端的时候,我先生成了数字和字母随机组成的6位字符,然后把这个字符和长链接保存到数据库。保存成功后,把这6位字符拼上我的网址,返回给用户,就像是这样的 https://wjup.top/HtN3Gc
 当用户拿到这个短网址访问的时候。我在后台进行获取这个短网址的6个字符,然后根据这个字符到数据库查询原来的链接,再进行301永久重定向到原网址就可以了。整体实现非常简单。当然我还增加了对短网址加密的功能,只有输入正确的密码才能访问原始链接

逻辑代码

下面放出主要的实现代码。项目完整版可以到github中去克隆岛到本地研究

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
package com.wjup.shorturl.controller;

import com.alibaba.fastjson.JSONObject;
import com.wjup.shorturl.entity.UrlEntity;
import com.wjup.shorturl.service.UrlService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.util.DateUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
import java.util.Locale;
import java.util.Random;
import java.util.UUID;

/**
* Create by wjup on 2019/9/29 11:33
* <p>
* 短网址生成项目
*/

@Controller
public class UrlController {

@Autowired
private UrlService urlService;

@RequestMapping("/")
public String index() {
return "index";
}

/**
* 创建短链接
*
* @param longUrl 原地址
* @param viewPwd 访问密码
* @param request 请求
* @return json
*/
@RequestMapping("/create")
@ResponseBody
public String creatShortUrl(String longUrl, String viewPwd, HttpServletRequest request) {
JSONObject json = new JSONObject();
String[] split = longUrl.split("\n|\r");
StringBuffer msg = new StringBuffer();

for (int i = 0; i < split.length; i++) {
UrlEntity urlEntity = new UrlEntity();

if (!split[i].contains("https://") && !split[i].contains("http://")) {
split[i] = "http://" + split[i];
}

String shortUrlId = getStringRandom(6);
urlEntity.setShortUrlId(shortUrlId);
urlEntity.setUuid(UUID.randomUUID().toString());
urlEntity.setLongUrl(split[i]);
urlEntity.setCreateTime(DateUtils.format(new Date(), "yyyy-MM-dd HH-mm-ss", Locale.SIMPLIFIED_CHINESE));
urlEntity.setViewPwd(viewPwd);

int flag = urlService.createShortUrl(urlEntity);

String toUrl = "/";
int serverPort = request.getServerPort();
if (serverPort == 80 || serverPort == 443) {
toUrl = request.getScheme() + "://" + request.getServerName();
} else {
toUrl = request.getScheme() + "://" + request.getServerName() + ":" + serverPort;
}

if (flag > 0) {
msg.append(toUrl + "/" + shortUrlId + "<br>");
}
}

json.put("shortUrl", msg);
return json.toJSONString();
}

/**
* 访问短链接
*
* @param shortUrlId 短网址id
* @param response 响应
* @param request 请求
* @throws ServletException 异常捕获
* @throws IOException 异常捕获
*/
@RequestMapping(value = "/{shortUrlId}")
public void view(@PathVariable("shortUrlId") String shortUrlId, HttpServletResponse response, HttpServletRequest request) throws ServletException, IOException {

UrlEntity urlEntity = urlService.findByShortUrlId(shortUrlId);
if (urlEntity != null) {
if (urlEntity.getViewPwd() != null && !"".equals(urlEntity.getViewPwd())) {
request.setAttribute("shortUrlId", shortUrlId);
request.getRequestDispatcher("/viewPwd").forward(request, response);
} else {
urlService.updateShortUrl(shortUrlId);
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
response.setHeader("Location", urlEntity.getLongUrl());
}
} else {
request.getRequestDispatcher("/noPage").forward(request, response);
}
}

/**
* 没有该请求跳转到指定页面
*
* @return page
*/
@RequestMapping("/noPage")
public String noPage() {

return "noPage";
}

/**
* 有密码打开输入密码页面
*
* @return html
*/
@RequestMapping("/viewPwd")
public String viewPwd(HttpServletRequest request, Model model) {
String shortUrlId = request.getAttribute("shortUrlId").toString();
model.addAttribute("shortUrlId", shortUrlId);
return "viewPwd";
}

/**
* 验证密码是否正确
*
* @param viewPwd 密码
* @param shortUrlId 短址id
*/
@RequestMapping("/VerifyPwd")
@ResponseBody
public String VerifyPwd(String viewPwd, String shortUrlId) {
UrlEntity urlEntity = urlService.findByPwd(viewPwd, shortUrlId);

JSONObject jsonObject = new JSONObject();
if (urlEntity != null) {
urlService.updateShortUrl(shortUrlId);
jsonObject.put("longUrl", urlEntity.getLongUrl());
jsonObject.put("flag", true);
} else {
jsonObject.put("flag", false);
}
return jsonObject.toJSONString();
}


/**
* 生成随机数字和字母
*
* @param length 生成长度
* @return shortUrlId
*/
private String getStringRandom(int length) {

String val = "";
Random random = new Random();

//参数length,表示生成几位随机数
for (int i = 0; i < length; i++) {

String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";
//输出字母还是数字
if ("char".equalsIgnoreCase(charOrNum)) {
//输出是大写字母还是小写字母
int temp = random.nextInt(2) % 2 == 0 ? 65 : 97;
val += (char) (random.nextInt(26) + temp);
} else if ("num".equalsIgnoreCase(charOrNum)) {
val += String.valueOf(random.nextInt(10));
}
}
return val;
}

}

-------------本文结束感谢您的阅读-------------
感觉文章不错,就赏个吧!
0%