SpringBoot項(xiàng)目中Druid自動(dòng)登錄功能實(shí)現(xiàn)
Druid是什么
Druid是Java語(yǔ)言中最好的數(shù)據(jù)庫(kù)連接池。Druid能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能。
集成Druid(第一步)
除了SpringBoot、Thymeleaf 、Mysql驅(qū)動(dòng)、通用Mapper,主要用到的依賴
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.21</version> </dependency>
或者
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.21</version> </dependency>
不可避免的配置(第二步)
druid配置
spring: datasource: # 基本屬性 name: dev url: jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&useSSL=false username: root password: root # 可以不配置,根據(jù)url自動(dòng)識(shí)別,建議配置 driver-class-name: com.mysql.jdbc.Driver ###################以下為druid增加的配置########################### type: com.alibaba.druid.pool.DruidDataSource # 初始化連接池個(gè)數(shù) initialSize: 5 # 最小連接池個(gè)數(shù)——》已經(jīng)不再使用,配置了也沒效果 minIdle: 2 # 最大連接池個(gè)數(shù) maxActive: 20 # 配置獲取連接等待超時(shí)的時(shí)間,單位毫秒,缺省啟用公平鎖,并發(fā)效率會(huì)有所下降 maxWait: 60000 # 配置間隔多久才進(jìn)行一次檢測(cè),檢測(cè)需要關(guān)閉的空閑連接,單位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一個(gè)連接在池中最小生存的時(shí)間,單位是毫秒 minEvictableIdleTimeMillis: 300000 # 用來檢測(cè)連接是否有效的sql,要求是一個(gè)查詢語(yǔ)句。 # 如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會(huì)起作用 validationQuery: SELECT 1 FROM DUAL # 建議配置為true,不影響性能,并且保證安全性。 # 申請(qǐng)連接的時(shí)候檢測(cè),如果空閑時(shí)間大于timeBetweenEvictionRunsMillis,執(zhí)行validationQuery檢測(cè)連接是否有效。 testWhileIdle: true # 申請(qǐng)連接時(shí)執(zhí)行validationQuery檢測(cè)連接是否有效,做了這個(gè)配置會(huì)降低性能 testOnBorrow: false # 歸還連接時(shí)執(zhí)行validationQuery檢測(cè)連接是否有效,做了這個(gè)配置會(huì)降低性能 testOnReturn: false # 打開PSCache,并且指定每個(gè)連接上PSCache的大小 poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 通過別名的方式配置擴(kuò)展插件,多個(gè)英文逗號(hào)分隔,常用的插件有: # 監(jiān)控統(tǒng)計(jì)用的filter:stat # 日志用的filter:log4j # 防御sql注入的filter:wall filters: stat,wall,log4j #log4j # 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 合并多個(gè)DruidDataSource的監(jiān)控?cái)?shù)據(jù) useGlobalDataSourceStat: true
將application.properties里面Druid屬性注入到配置中(第三步)
新建一個(gè) Class
@Configuration public class DruidConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource") public DruidDataSource druidDataSource(){ return new DruidDataSource(); } }
配置Druid過濾(第四步)
新建一個(gè) Class
@WebFilter(filterName="druidWebStatFilter",urlPatterns="/*", initParams={ @WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*,/font-awesome/*")// 忽略資源 }) public class DruidStatFilter extends WebStatFilter { }
一些設(shè)置(第五步) 修改成自己的賬號(hào)密碼,后面還要用
賬號(hào): loginUsername=root
密碼: loginPassword=root
新建一個(gè) Class
@WebServlet(urlPatterns = "/druid/*", initParams={ @WebInitParam(name="allow",value="127.0.0.1"),// IP白名單 (沒有配置或者為空,則允許所有訪問) @WebInitParam(name="deny",value=""),// IP黑名單 (存在共同時(shí),deny優(yōu)先于allow) @WebInitParam(name="loginUsername",value="root"),// 用戶名 @WebInitParam(name="loginPassword",value="root"),// 密碼 @WebInitParam(name="resetEnable",value="false")// 禁用HTML頁(yè)面上的“Reset All”功能 }) public class DruidStatViewServlet extends StatViewServlet { }
下面再說下 HTML頁(yè)面代碼
自動(dòng)登錄原理
分析druid自帶的登錄源碼
源代碼
HTML
<form id="loginForm" > ...省略... <input type="text" name="loginUsername"> <input type="password" name="loginPassword"> <button>提交</button> ...省略... </form>
源代碼
JavaScript
$.namespace("druid.login"); druid.login = function () { return { login : function() { $.ajax({ type: 'POST', url: "submitLogin", data: $("#loginForm").serialize(), success: function(data) { if("success" == data) location.href = "index.html"; else { $("#alertInfo").show(); $("#loginForm")[0].reset(); } }, dataType: "text" }); } } }(); $(document).ready(function() { $("#loginBtn").click(druid.login.login); });
可以的到信息
內(nèi)容 | 使用 |
---|---|
請(qǐng)求函數(shù) | $.ajax() |
請(qǐng)求方式 | POST |
提交到url | submitLogin |
提交的數(shù)據(jù) | loginUsername=? , loginPassword=? |
提交的數(shù)據(jù)類型 | text |
請(qǐng)求成功返回值如果等于success | location.href = “index.html” |
自帶登錄的請(qǐng)求過程:
- 訪問登錄頁(yè)面
http://localhost:8080/druid/login.html
- ajax進(jìn)行post請(qǐng)求,提交
loginUsername
和loginPassword
- 如果登錄成功,則返回值為
success
,就會(huì)跳轉(zhuǎn)http://localhost:8080/druid/index.html
使用Filter 過濾 替換掉Url(第六步)
這個(gè)需要一波三折
點(diǎn)擊頁(yè)面菜單 請(qǐng)求 Controller 的 /toDruidLogin ,隨意命名
在你的controller控制類里面加入該方法
@RequestMapping("/toDruidLogin") public String toDruidLogin(){ return "druidlogin"; }
使用Thymeleaf 返回到頁(yè)面 druidlogin.html
新建 druidlogin.html
,里面寫入下面代碼
Javascript 代碼
<script th:src="@{https://code.jquery.com/jquery-3.4.1.min.js}" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function(){ $.ajax({ type: 'get', url: '/doDruidLogin', dataType: "text", data: {}, success: function (data) { if (data == "success") { location.href = "/druid"; } else //其他邏輯省略 } }, error: function () { //其他邏輯省略 } }); }); </script>
一跳到 druidlogin.html
就開始請(qǐng)求/doDruidLogin
通過該頁(yè)面繼續(xù)請(qǐng)求 Controller 的 /doDruidLogin
,隨意命名
在你的controller控制類里面加入該方法
@RequestMapping("/doDruidLogin") public String doDruidLogin(){ //不會(huì)執(zhí)行,但要攔截/doDruidLogin,不然會(huì)報(bào)錯(cuò) return "/"; }
關(guān)鍵的上場(chǎng)了 Filter
新建一個(gè)class
攔截 /doDruidLogin
@WebFilter(filterName = "Moni",urlPatterns = "/doDruidLogin") public class DruidLoginFilter implements Filter { private static final Logger log = LoggerFactory.getLogger(DruidLoginFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { log.info("DruidLoginFilter初始化"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = ((HttpServletResponse) servletResponse); String requestUrl = request.getRequestURL().toString(); //log.info(requestUrl); // 針對(duì)druid做自動(dòng)登錄 if(requestUrl.contains("/doDruidLogin")){ String queryString = "loginUsername=root&loginPassword=root"; // 獲取完整路徑 // log.info("====="+requestUrl); StringBuffer url = new StringBuffer(requestUrl); // 獲取路徑加上項(xiàng)目名稱 String tempContextUrl = url.delete(url.length() - request.getRequestURI().length(), url.length()).append(request.getServletContext().getContextPath()).append("/").toString(); // log.info(tempContextUrl); /** 構(gòu)造新地址,其實(shí)就是druid的登錄地址 */ URL newUrl = new URL(tempContextUrl + "druid/submitLogin?" + queryString); // log.info(newUrl.toString()); response.setStatus(307); response.setHeader("Location", newUrl.toString()); response.setHeader("Connection", "close"); //允許所有跨域請(qǐng)求 response.addHeader("Access-Control-Allow-Origin", "*"); }else { chain.doFilter(request,response); } } @Override public void destroy() { log.info("DruidLoginFilter銷毀"); } }
- 實(shí)質(zhì)上將原來的Url過濾掉,通過dofilter() 替換為一個(gè)拼接的Url
- 利用狀態(tài)碼和響應(yīng)頭 使瀏覽器繼續(xù)進(jìn)行POST請(qǐng)求
response.setStatus(307); response.setHeader("Location", newUrl.toString()); response.setHeader("Connection", "close");
最終結(jié)果
運(yùn)行效果
到此這篇關(guān)于SpringBoot項(xiàng)目中Druid自動(dòng)登錄功能實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot Druid自動(dòng)登錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaWeb response完成重定向?qū)崿F(xiàn)過程詳解
這篇文章主要介紹了JavaWeb response完成重定向?qū)崿F(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02springboot整合Quartz實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)的方法
本篇文章主要介紹了springboot整合Quartz實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-10-10玩轉(zhuǎn)spring boot 結(jié)合AngularJs和JDBC(4)
玩轉(zhuǎn)spring boot,這篇文章主要介紹了結(jié)合AngularJs和JDBC,玩轉(zhuǎn)spring boot,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01Springboot應(yīng)用中過濾器如何修改response的header和body內(nèi)容
這篇文章主要介紹了Springboot應(yīng)用中過濾器如何修改response的header和body內(nèi)容問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07java多線程編程必備volatile與synchronized深入理解
這篇文章主要介紹了java多線程編程必備volatile與synchronized的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04淺談java中String StringBuffer StringBuilder的區(qū)別
下面小編就為大家?guī)硪黄獪\談java中String StringBuffer StringBuilder的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06