SpringBoot實現短鏈跳轉

目錄

1.背景介紹

2.短鏈跳轉的意義? ??

3.SpringBoot中的代碼實現

1.建議短鏈-長鏈的數據庫表:t_url_map:

2.映射實體

3.Dao層實現

4.Service層實現

5.Controller層實現?

3.結果測試

4.問題


1.背景介紹

????????短鏈跳轉是一種通過將長鏈接轉換為短鏈接的方式,以便在互聯網上進行鏈接共享和傳播的技術。通常情況下,長鏈接可能由于包含大量參數或者較長的路徑而顯得復雜且不易記憶,而短鏈則是將原始長鏈接通過特定算法轉換為較短的鏈接,使得它更容易分享、傳播和展示

????????短鏈跳轉服務通常由第三方提供,用戶可以將需要縮短的長鏈接提交到該服務,服務會返回一個短鏈接,當用戶訪問這個短鏈接時,會被重定向到原始的長鏈接地址。這種服務通常還提供了統計功能,可以跟蹤短鏈接被點擊的次數訪問來源等信息,幫助用戶了解鏈接的傳播效果。

????????短鏈跳轉服務有助于美化鏈接、節省空間、方便分享和統計鏈接訪問情況,因此被廣泛應用于社交媒體、微博客、推廣活動等各種互聯網應用場景中。

? ? ? ? 比如在b站中,一個視頻的網址原來是這樣的:

? ? ? ? 在移動端中,點擊分享按鈕,復制其鏈接:

? ? ? ?

????????它會變成如下鏈接形式:

? ? ? 【Cookie、Session、Token、JWT一次性講完-嗶哩嗶哩】 https://b23.tv/0SMtYq6

? ? ? ? 點擊該鏈接后,你會發現瀏覽器的網址URL為原來的長鏈接形式,也就是說這其中發生了重定向?,而這個過程就是這篇博客要提到的短鏈跳轉了。

2.短鏈跳轉的意義? ??

  1. 節省空間:長鏈接可能會很長,不方便分享或展示,通過短鏈跳轉可以將長鏈接轉換為短鏈接,節省字符空間。

  2. 美化鏈接:短鏈看起來更簡潔、美觀,對于需要展示給用戶或發布到社交媒體等場景更具吸引力。

  3. 防止鏈接失效:某些長鏈接可能會因為過期、失效或變動而無法訪問,通過短鏈跳轉可以在后臺進行管理和更新,保證鏈接的可訪問性。

  4. 統計和跟蹤:通過短鏈跳轉服務可以對鏈接的點擊量、來源、地域等信息進行統計和分析,幫助用戶了解鏈接的受眾和效果。

  5. 方便分享:短鏈更容易復制、粘貼和分享,適用于短信、微博、郵件等分享場景,提高分享效率。

  6. 隱藏原始鏈接:有時候希望隱藏原始鏈接的信息,通過短鏈跳轉可以起到一定的保護作用,防止泄露敏感信息。

3.SpringBoot中的代碼實現

? ? ? ? 這里我們以快速入門為主,即主要實現長鏈到短鏈的映射邏輯。

1.建議短鏈-長鏈的數據庫表:t_url_map:

2.映射實體
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.time.Instant;@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UrlMap {private Long id;private String longUrl;private String shortUrl;private String username;private Instant expireTime;private Instant creationTime;}

????????這里要添加lombok依賴:

        <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
3.Dao層實現

? ? ? ? 這里簡單寫三個關鍵的接口方法:根據長鏈找短鏈(若無則生成短鏈)、根據短鏈找長鏈(若無則跳轉失敗頁面)、插入實體

import com.zhan.zhan215.Entity.UrlMap;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.time.Instant;
import java.util.List;@Mapper
public interface UrlMapMapper {UrlMap findFirstByLongUrl(@Param("longUrl") String longUrl, @Param("username") String username);void saveUrlMap(UrlMap urlMap);UrlMap findByShortUrl(String shortUrl);}

? ? ? ? 對應的xml映射:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhan.zhan215.Dao.UrlMapMapper"><select id="findFirstByLongUrl" parameterType="string" resultType="com.zhan.zhan215.Entity.UrlMap">select *from t_url_mapwhere longUrl =#{longUrl} and username = #{username}limit 1</select><!-- 在Mapper XML文件中定義保存urlMap對象的方法 --><insert id="saveUrlMap" parameterType="com.zhan.zhan215.Entity.UrlMap">INSERT INTO t_url_map (shortUrl, longUrl,username)VALUES (#{shortUrl}, #{longUrl},#{username})</insert><select id="findByShortUrl"  parameterType="string" resultType="com.zhan.zhan215.Entity.UrlMap">select *from t_url_mapwhere shortUrl = #{shortUrl} limit 1</select>
4.Service層實現
import com.zhan.zhan215.Dao.UrlMapMapper;
import com.zhan.zhan215.Entity.UrlMap;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.time.Instant;@Service
public class UrlMapService {@Resourceprivate UrlMapMapper urlMapMapper;// 編碼public String encode(String longUrl,String username) {UrlMap urlMap = urlMapMapper.findFirstByLongUrl(longUrl,username);// 看看該長鏈接是否存在// 如果存在并且其對應用戶名等于已有用戶名,則直接給出短鏈接if (urlMap != null&&username.equals(urlMap.getUsername())) {return urlMap.getShortUrl();} else {// 如果不存在,則生成短鏈接UrlMap urlMap1 = new UrlMap();// 生成短鏈接String shortLink = generateShortLink(longUrl,username);// 保存短鏈接urlMap1.setLongUrl(longUrl);urlMap1.setShortUrl(shortLink);urlMap1.setUsername(username);urlMap1.setCreationTime(Instant.now());urlMapMapper.saveUrlMap(urlMap1);return shortLink;}}// 解碼public String decode(String shortUrl){// 根據短鏈接獲取長鏈接UrlMap byShortUrl = urlMapMapper.findByShortUrl(shortUrl);// 如果存在,返回長鏈接if(byShortUrl!=null){return byShortUrl.getLongUrl();}// 如果沒有,返回首頁(正常是返回一個失敗頁面)return "https://bilibili.com";}// 生成短鏈接public static String generateShortLink(String originalUrl,String username) {try {MessageDigest md = MessageDigest.getInstance("MD5");byte[] hashBytes = md.digest(originalUrl.getBytes());// 對原始URL進行MD5哈希計算StringBuilder sb = new StringBuilder();for (byte b : hashBytes) {sb.append(String.format("%02x", b));// 將字節數組轉換為十六進制字符串}return sb.toString().substring(0, 8)+username;// 截取前8位,加上用戶名(這里先簡單默認用戶名是4位數)} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}}}
5.Controller層實現?
import com.zhan.zhan215.Common.ResponseBean;
import com.zhan.zhan215.Service.UrlMapService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.view.RedirectView;import javax.annotation.Resource;@RestController
public class UrlMapController {@Resourceprivate UrlMapService urlMapService;@PostMapping("/shorten")// 長鏈接轉短連接,相當于實際項目中的點擊“分享”,形成一條短連接public ResponseBean shorten(@RequestParam String longUrl,@RequestParam String username){String encode =  urlMapService.encode(longUrl,username);// 形成短鏈return ResponseBean.success(encode);}@GetMapping("redirect")//重定向public RedirectView redirectView(@RequestParam String shortUrl){String longUrl = urlMapService.decode(shortUrl);return new RedirectView(longUrl);}}

相關的ResponseBean的返回結果集代碼:

public class ResponseBean<T> {/** 200:操作成功  -1:操作失敗**/// http 狀態碼private boolean success;// 返回的數據private T data;public boolean isSuccess() {return success;}public void setSuccess(boolean success) {this.success = success;}public T getData() {return data;}public void setData(T data) {this.data = data;}public static <T> ResponseBean<T> success(T data) {ResponseBean<T> responseBean = new ResponseBean<>();responseBean.setSuccess(true);responseBean.setData(data);return responseBean;}public static <T> ResponseBean<T> error(T errorData) {ResponseBean<T> responseBean = new ResponseBean<>();responseBean.setSuccess(false);responseBean.setData(errorData);return responseBean;}public static <T> ResponseBean<T> success() {ResponseBean<T> responseBean = new ResponseBean<>();responseBean.setSuccess(true);return responseBean;}}

3.結果測試

? ? ? ? 我們就拿剛剛那個b站的長鏈接作測試,即https://www.bilibili.com/video/BV18u4m1K7D4/?spm_id_from=333.1007.tianma.10-4-38.click&vd_source=1c7e32cfbc70017a24ee2c337620ff51

????????

? ? ? ? 可以看到短鏈接生成為1b9590bezhan,

????????然后我們再用這條鏈接去測試能否跳轉到原始鏈接:

????????

? ? ? ? 成功根據短鏈接定向到原始鏈接的網站了。

4.問題

? ? ? ? 1.為什么生成短鏈接需要帶上username參數?

? ? ? ? ?答:這里其實模仿的是不同用戶對應同一個原始鏈接(或長鏈接)時,確保他們生成的短鏈接各不相同,這樣可以方便后臺追蹤是由哪個用戶分享的短鏈接,進而統計分享數。在表中LongUrl和shortUrl的對應關系為一對多

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712654.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712654.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712654.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

南方電網的能源棋局上,蔚來換電扮演什么角色?

2 月 26 日&#xff0c;南網儲能科技與蔚來能源簽署協議&#xff0c;將充換電站、儲能站、可調負載等聚合資源連接到虛擬電廠平臺&#xff0c;推動換電站作為分布式儲能在虛擬電廠項目上的應用。 蔚來換電站是國內首個智慧微電網型分布式換電設施&#xff0c;可透過換電訂單預…

軟考-系統集成項目管理中級-信息系統建設與設計

本章重點考點 1.信息系統的生命周期 信息系統建設的內容主要包括設備采購、系統集成、軟件開發和運維服務等。信息系統的生命周期可以分為四個階段:立項、開發、運維和消亡。 2.信息系統開發方法 信息系統常用的開發方法有結構化方法、原型法、面向對象方法等 1)結構化方法 …

AI智能分析網關V4:抽煙/打電話/玩手機行為AI算法及場景應用

抽煙、打電話、玩手機是人們在日常生活中常見的行為&#xff0c;但這些行為在某些場合下可能會帶來安全風險。因此&#xff0c;對于這些行為的檢測技術及應用就變得尤為重要。今天來給大家介紹一下TSINGSEE青犀AI智能分析網關V4抽煙/打電話/玩手機檢測算法及其應用場景。 將監控…

java項目打包運行報異常:xxxxx-1.0-SNAPSHOT.jar中沒有主清單屬性

pom.xml中加入這段話即可 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.4.4</version><executions><execution><…

安泰ATA-7050高壓放大器在微流控細胞分選中的應用

微流控細胞分選是一種用于分離和鑒定生物樣本中特定類型細胞的技術&#xff0c;其原理基于將生物細胞通過微通道進行操縱和區分。微流控細胞分選的原理主要基于流體力學、電氣學、光學和熱力學等多學科的交叉應用。通過設計具有特定尺寸和性質的微通道網絡&#xff0c;可實現對…

RV1126芯片概述

RV1126芯片概述 前言1 主要特性2 詳細參數 前言 1 主要特性 四核 ARM Cortex-A7 and RISC-V MCU250ms快速開機2.0Tops NPU14M ISP with 3幀 HDR支持3個攝像頭同時輸入4K H.264/H.265 視頻編碼和解碼 2 詳細參數

萬人在線直播:構建高效穩定的音視頻架構

萬人在線大型直播音視頻架構解析 隨著網絡技術的發展,大型直播已成為人們生活中不可或缺的一部分。萬人在線直播音視頻架構是實現高清、流暢直播的關鍵。本文將深入探討這一架構的核心組成部分及其運作機制。 直播客戶端作為架構的基石,負責音視頻數據的采集、編碼、推流、…

永磁同步電機無感FOC(龍伯格觀測器)算法技術總結-仿真篇

文章目錄 1、觀測器的引入2、β軸向下的電機觀測器數學模型3、β軸向下的轉子點角度及速度觀測4、Simulink仿真模型搭建4.1模型總覽4.2 Luenberger觀測器模塊4.2.1 I_alpha觀測4.2.2 I_beta觀測4.2.3 e_alpha、e_beta觀測4.2.4 鎖相環 4.3 速度設定4.4 速度觀測結果4.5 電角度觀…

express+mysql+vue,從零搭建一個商城管理系統6--數據校驗和登錄

提示&#xff1a;學習express&#xff0c;搭建管理系統 文章目錄 前言一、修改models/user.js二、修改routes下的user.js三、Api新建user/login接口四、刪除數據庫原有數據&#xff0c;添加新驗證規則的用戶四、用戶登錄總結 前言 需求&#xff1a;主要學習express&#xff0c;…

SQL數學函數--pow(),abs() 函數 全面且詳細

一、冪運算函數: pow 語法: pow(double a, double p) 返回值: double 說明:返回a的p次冪 舉例&#xff1a; hive> select pow(2,4) ; 16.0 ???????二、絕對值函數: abs 語法: abs(double a) abs(int a) 返回值: double int 說明:返回數值a的絕對值 …

MacBook將iPad和iPhone備份到移動硬盤

#創作靈感# 一個是ICloud不夠用&#xff0c;想備份到本地&#xff1b;然而本地存儲不夠用&#xff0c;增加容量巨貴&#xff0c;舍不得這個錢&#xff0c;所以就想著能不能備份到移動硬盤。剛好有個移動固態&#xff0c;所以就試了一下&#xff0c;還真可以。 #正文# 說一下邏…

《PyTorch深度學習實踐》第八講加載數據集

一、 1、DataSet 是抽象類&#xff0c;不能實例化對象&#xff0c;主要是用于構造我們的數據集 2、DataLoader 需要獲取DataSet提供的索引[i]和len;用來幫助我們加載數據&#xff0c;比如說做shuffle(提高數據集的隨機性)&#xff0c;batch_size,能拿出Mini-Batch進行訓練。它…

Windows10環境下MongoDB安裝配置

1. 下載對應MongoDB安裝包 進入官網&#xff1a;MongoDB官網 如果不連接外網則在官網下載較慢&#xff0c;這里給出下載好的安裝包&#xff0c;版本為4.2.25&#xff1a;百度網盤 選擇你需要的版本&#xff0c;推薦選擇Package的格式為zip&#xff08;解壓即可&#xff09; Pa…

[VNCTF2024]-PWN:preinit解析(逆向花指令,繞過strcmp,函數修改,機器碼)

查看保護&#xff1a; 查看ida&#xff1a; 這邊其實看反匯編沒啥大作用&#xff0c;需要自己動調。 但是前面的繞過strcmp還是要看一下的。 解題&#xff1a; 這里是用linux自帶的產生隨機數的文件urandom來產生一個隨機密碼&#xff0c;然后讓我們輸入密碼&#xff0c;用st…

k8s 存儲卷詳解與動靜部署詳解

目錄 一、Volume 卷 1.1 卷類型 emptyDir &#xff1a; hostPath&#xff1a; persistentVolumeClaim (PVC)&#xff1a; configMap 和 secret&#xff1a; 二、 emptyDir存儲卷 2.1 特點 2.2 用途&#xff1a; 2.3 示例 三、 hostPath存儲卷 3.1 特點 3.2 用途 …

前端mock數據 —— 使用Apifox mock頁面所需數據

前端mock數據 —— 使用Apifox 一、使用教程二、本地請求Apifox所mock的接口 一、使用教程 在首頁進行新建項目&#xff1a; 新建項目名稱&#xff1a; 新建接口&#xff1a; 創建json&#xff1a; 請求方法&#xff1a; GET。URL&#xff1a; api/basis。響應類型&#xff1…

可以用numpy為for加速

Numpy除了用于科學計算&#xff0c;還有一個功能是可以代替某些for循環&#xff0c;進行同樣的功能實現&#xff0c;有于是向量矩陣運算&#xff0c;碰到復雜的for時&#xff0c;計算速度可以提高&#xff0c;從而提高程序性能。以下是一些常用的NumPy函數和操作&#xff0c;可…

Socket網絡編程(六)——簡易聊天室案例

目錄 聊天室數據傳輸設計客戶端、服務器數據交互數據傳輸協議服務器、多客戶端模型客戶端如何發送消息到另外一個客戶端2個以上設備如何交互數據&#xff1f; 聊天室消息接收實現代碼結構client客戶端重構server服務端重構自身描述信息的構建重構TCPServer.java基于synchronize…

Nginx多次代理后獲取真實的用戶IP訪問地址

需求&#xff1a;記錄用戶操作記錄&#xff0c;類似如下表格的這樣 PS: 注意無論你的服務是Http訪問還是Https 訪問的都是可以的&#xff0c;我們服務之前是客戶只給開放了一個端口&#xff0c;但是既要支持https又要支持http協議&#xff0c;nginx 是可以通過stream 模塊配置雙…

2023中國PostgreSQL數據庫生態大會:洞察前沿趨勢,探索無限可能(附核心PPT資料下載)

隨著數字化浪潮的推進&#xff0c;數據庫技術已成為支撐各行各業數字化轉型的核心力量。2023中國PostgreSQL數據庫生態大會的召開&#xff0c;無疑為業界提供了一個深入交流、共同探索PostgreSQL數據庫技術未來發展趨勢的平臺。本文將帶您走進這場盛會&#xff0c;解析大會的亮…