SpringBoot項目中Druid自動登錄功能實現(xiàn)
Druid是什么
Druid是Java語言中最好的數(shù)據(jù)庫連接池。Druid能夠提供強大的監(jiān)控和擴展功能。
集成Druid(第一步)
除了SpringBoot、Thymeleaf 、Mysql驅動、通用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自動識別,建議配置
driver-class-name: com.mysql.jdbc.Driver
###################以下為druid增加的配置###########################
type: com.alibaba.druid.pool.DruidDataSource
# 初始化連接池個數(shù)
initialSize: 5
# 最小連接池個數(shù)——》已經不再使用,配置了也沒效果
minIdle: 2
# 最大連接池個數(shù)
maxActive: 20
# 配置獲取連接等待超時的時間,單位毫秒,缺省啟用公平鎖,并發(fā)效率會有所下降
maxWait: 60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一個連接在池中最小生存的時間,單位是毫秒
minEvictableIdleTimeMillis: 300000
# 用來檢測連接是否有效的sql,要求是一個查詢語句。
# 如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會起作用
validationQuery: SELECT 1 FROM DUAL
# 建議配置為true,不影響性能,并且保證安全性。
# 申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執(zhí)行validationQuery檢測連接是否有效。
testWhileIdle: true
# 申請連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能
testOnBorrow: false
# 歸還連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能
testOnReturn: false
# 打開PSCache,并且指定每個連接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 通過別名的方式配置擴展插件,多個英文逗號分隔,常用的插件有:
# 監(jiān)控統(tǒng)計用的filter:stat
# 日志用的filter:log4j
# 防御sql注入的filter:wall
filters: stat,wall,log4j #log4j
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多個DruidDataSource的監(jiān)控數(shù)據(jù)
useGlobalDataSourceStat: true將application.properties里面Druid屬性注入到配置中(第三步)
新建一個 Class
@Configuration
public class DruidConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DruidDataSource druidDataSource(){
return new DruidDataSource();
}
}配置Druid過濾(第四步)
新建一個 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 {
}一些設置(第五步) 修改成自己的賬號密碼,后面還要用
賬號: loginUsername=root
密碼: loginPassword=root
新建一個 Class
@WebServlet(urlPatterns = "/druid/*",
initParams={
@WebInitParam(name="allow",value="127.0.0.1"),// IP白名單 (沒有配置或者為空,則允許所有訪問)
@WebInitParam(name="deny",value=""),// IP黑名單 (存在共同時,deny優(yōu)先于allow)
@WebInitParam(name="loginUsername",value="root"),// 用戶名
@WebInitParam(name="loginPassword",value="root"),// 密碼
@WebInitParam(name="resetEnable",value="false")// 禁用HTML頁面上的“Reset All”功能
})
public class DruidStatViewServlet extends StatViewServlet {
}下面再說下 HTML頁面代碼
自動登錄原理
分析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);
});可以的到信息
| 內容 | 使用 |
|---|---|
| 請求函數(shù) | $.ajax() |
| 請求方式 | POST |
| 提交到url | submitLogin |
| 提交的數(shù)據(jù) | loginUsername=? , loginPassword=? |
| 提交的數(shù)據(jù)類型 | text |
| 請求成功返回值如果等于success | location.href = “index.html” |
自帶登錄的請求過程:
- 訪問登錄頁面
http://localhost:8080/druid/login.html - ajax進行post請求,提交
loginUsername和loginPassword - 如果登錄成功,則返回值為
success,就會跳轉http://localhost:8080/druid/index.html
使用Filter 過濾 替換掉Url(第六步)
這個需要一波三折
點擊頁面菜單 請求 Controller 的 /toDruidLogin ,隨意命名
在你的controller控制類里面加入該方法
@RequestMapping("/toDruidLogin")
public String toDruidLogin(){
return "druidlogin";
}使用Thymeleaf 返回到頁面 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就開始請求/doDruidLogin
通過該頁面繼續(xù)請求 Controller 的 /doDruidLogin,隨意命名
在你的controller控制類里面加入該方法
@RequestMapping("/doDruidLogin")
public String doDruidLogin(){
//不會執(zhí)行,但要攔截/doDruidLogin,不然會報錯
return "/";
}關鍵的上場了 Filter
新建一個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);
// 針對druid做自動登錄
if(requestUrl.contains("/doDruidLogin")){
String queryString = "loginUsername=root&loginPassword=root";
// 獲取完整路徑
// log.info("====="+requestUrl);
StringBuffer url = new StringBuffer(requestUrl);
// 獲取路徑加上項目名稱
String tempContextUrl = url.delete(url.length() - request.getRequestURI().length(), url.length()).append(request.getServletContext().getContextPath()).append("/").toString();
// log.info(tempContextUrl);
/** 構造新地址,其實就是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");
//允許所有跨域請求
response.addHeader("Access-Control-Allow-Origin", "*");
}else {
chain.doFilter(request,response);
}
}
@Override
public void destroy() {
log.info("DruidLoginFilter銷毀");
}
}- 實質上將原來的Url過濾掉,通過dofilter() 替換為一個拼接的Url
- 利用狀態(tài)碼和響應頭 使瀏覽器繼續(xù)進行POST請求
response.setStatus(307);
response.setHeader("Location", newUrl.toString());
response.setHeader("Connection", "close");

最終結果
運行效果

到此這篇關于SpringBoot項目中Druid自動登錄功能實現(xiàn)的文章就介紹到這了,更多相關SpringBoot Druid自動登錄內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JavaWeb response完成重定向實現(xiàn)過程詳解
這篇文章主要介紹了JavaWeb response完成重定向實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-02-02
springboot整合Quartz實現(xiàn)動態(tài)配置定時任務的方法
本篇文章主要介紹了springboot整合Quartz實現(xiàn)動態(tài)配置定時任務的方法,非常具有實用價值,需要的朋友可以參考下2017-10-10
玩轉spring boot 結合AngularJs和JDBC(4)
玩轉spring boot,這篇文章主要介紹了結合AngularJs和JDBC,玩轉spring boot,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01
Springboot應用中過濾器如何修改response的header和body內容
這篇文章主要介紹了Springboot應用中過濾器如何修改response的header和body內容問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
java多線程編程必備volatile與synchronized深入理解
這篇文章主要介紹了java多線程編程必備volatile與synchronized的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04
淺談java中String StringBuffer StringBuilder的區(qū)別
下面小編就為大家?guī)硪黄獪\談java中String StringBuffer StringBuilder的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06

