SpringBoot中實現(xiàn)Druid前端監(jiān)控界面自動登錄功能
SpringBoot中實現(xiàn)Druid前端監(jiān)控界面自動登錄
改進版看這里 :SpringBoot中實現(xiàn)Druid前端監(jiān)控界面自動登錄 改進版
1、背景
最近在系統(tǒng)中集成Druid數(shù)據(jù)庫連接池,Druid自帶一個可視化監(jiān)控界面,可以查看數(shù)據(jù)源、SQL執(zhí)行詳情、慢SQL記錄等等…,但是在前端中嵌入監(jiān)控界面時,還需要手動輸入后臺配置的賬號密碼,比較不方便,在研究了幾個現(xiàn)有的方案后,都不太能較好的實現(xiàn)。
網(wǎng)上方案一:自定義HTML頁面將登錄請求方式改為GET
,在自定義的過濾器中將賬號密碼填入,返回307臨時重定向,將攜帶的賬號密碼填入到HTML頁面,請求實際的Druid登錄地址,完成自動登錄。
方案一缺點: 使用GET請求明文攜帶賬號密碼存在安全隱患;而且需要自定義HTML頁面,如果是前后端分離的,比較麻煩。
2、實現(xiàn)方法
(1)項目中使用到的依賴版本
Druid版本1.2.23
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.23</version> </dependency>
Spring Boot版本為2.7.18
,此文章適用于Spring Boot為2的版本,適用于Spring Security。
(2)實現(xiàn)原理
本文的方法受到方案一的啟發(fā),通過請求自定義的路徑,使用WebFilter過濾器,將賬號密碼填充到請求參數(shù)中,并轉發(fā)到Druid的登錄路徑中,實現(xiàn)自動登錄。
這一過程完全在后端處理,不會將任何參數(shù)轉發(fā)到前端,不會產(chǎn)生賬號密碼泄露,所以在配置文件中,你可以完全使用隨機字符串作為賬號密碼。
(3)具體代碼
添加一個代理登錄路徑,必須允許POST
方法,這里允許了全部的方法。
/** * Druid自動登錄,這里不需要處理,主要邏輯在過濾器中 */ @RequestMapping("/loginDruid") public void loginDruid() {}
添加自定義的過濾器
import java.io.IOException; import java.lang.reflect.Field; import java.util.Map; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties; import lombok.extern.slf4j.Slf4j; import org.apache.catalina.util.ParameterMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * Druid前端自動登錄過濾器 * * @author jiusiz * @since 2024-06-28 */ @Component @WebFilter(filterName = "DruidAutoLoginFilter", urlPatterns = "/loginDruid") public class DruidAutoLoginFilter implements Filter { @Autowired DruidStatProperties druidStatProperties; @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; // 只攔截自動登錄的代理方法 if (!request.getRequestURL().toString().contains("loginDruid")) { chain.doFilter(request, response); return; } // 獲取到參數(shù),并通過反射去添加在配置文件中的Druid賬號密碼 Map<String, String[]> parameterMap = request.getParameterMap(); if (parameterMap instanceof org.apache.catalina.util.ParameterMap) { try { Field field = ParameterMap.class.getDeclaredField("locked"); field.setAccessible(true); field.setBoolean(parameterMap, false); parameterMap.put("loginUsername", new String[]{druidStatProperties.getStatViewServlet().getLoginUsername()}); parameterMap.put("loginPassword", new String[]{druidStatProperties.getStatViewServlet().getLoginPassword()}); field.setBoolean(parameterMap, true); } catch (NoSuchFieldException | IllegalAccessException e) { throw new RuntimeException(e); } // 轉發(fā)到實際的Druid登錄路徑上 request.getRequestDispatcher("/druid/submitLogin").forward(request, response); } chain.doFilter(request, response); } }
配置文件,部分配置,請按需使用
spring: datasource: druid: webStatFilter: enabled: true statViewServlet: enabled: true allow: # 訪問路徑,按下面的填 url-pattern: /druid/* # 控制臺管理用戶名和密碼,無所謂,因為從后端取,隨機字符串即可 login-username: BvcLixhs login-password: dcqMZCWhnGZrnPhiKRYp
前端代碼
僅展示Vue3的版本,其他版本一致,需要先請求代理方法后,再來到Druid首頁。
<script setup> import request from '@/utils/request' const url = ref('') // 必須使用POST方法,因為要轉發(fā)給Druid,Druid的登錄方法為POST request.post('/loginDruid', { // 參數(shù)無所謂,但必須要有,沒有參數(shù)后端會找不到parameterMap ignore: 1 }).then(() => { url.value = import.meta.env.VITE_API_BASE_SERVER + '/druid/index.html' }) </script> <template> <div style="width: 100%;height: 100%;"> <iframe :src="url" frameborder="no" style="width: 100%; height: 100%" scrolling="auto" /> </div> </template>
3、效果展示
到此這篇關于SpringBoot中實現(xiàn)Druid前端監(jiān)控界面自動登錄的文章就介紹到這了,更多相關SpringBoot自動登錄內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java基本教程之常用的實現(xiàn)多線程的兩種方式 java多線程教程
下面開始學習“常用的實現(xiàn)多線程的2種方式”:Thread 和 Runnable。之所以說是常用的,是因為通過還可以通過java.util.concurrent包中的線程池來實現(xiàn)多線程2014-01-01解決idea爆紅 cant resolve symbol String的問題解析
連著出差幾個禮拜沒有使用idea開發(fā)工具,突然一天打開電腦發(fā)現(xiàn)idea里的代碼全部爆紅,懵逼不如所措,很多朋友建議我按住Alt+回車設置jdk就能解決,但是仍然報錯,經(jīng)過幾個小時的倒騰最終解決,遇到此問題的朋友參考下本文吧2021-06-06java?SpringBoot?分布式事務的解決方案(JTA+Atomic+多數(shù)據(jù)源)
這篇文章主要介紹了java?SpringBoot?分布式事務的解決方案(JTA+Atomic+多數(shù)據(jù)源),文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-08-08Java之SpringCloud Eurka注冊錯誤解決方案
這篇文章主要介紹了Java之SpringCloud Eurka注冊錯誤解決方案,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-07-07MyBatis3傳遞多個參數(shù)(Multiple Parameters)
這篇文章主要介紹了MyBatis3傳遞多個參數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07