最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot項(xiàng)目中Druid自動登錄功能實(shí)現(xiàn)

 更新時(shí)間:2024年08月22日 14:41:19   作者:陳增林  
Druid是Java語言中最好的數(shù)據(jù)庫連接池,Druid能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能,這篇文章主要介紹了SpringBoot項(xiàng)目中Druid自動登錄功能實(shí)現(xiàn),需要的朋友可以參考下

Druid是什么

        Druid是Java語言中最好的數(shù)據(jù)庫連接池。Druid能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能。

集成Druid(第一步)

除了SpringBoot、Thymeleaf 、Mysql驅(qū)動、通用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
      # 初始化連接池個(gè)數(shù)
      initialSize: 5
      # 最小連接池個(gè)數(shù)——》已經(jīng)不再使用,配置了也沒效果
      minIdle: 2
      # 最大連接池個(gè)數(shù)
      maxActive: 20
      # 配置獲取連接等待超時(shí)的時(shí)間,單位毫秒,缺省啟用公平鎖,并發(fā)效率會有所下降
      maxWait: 60000
      # 配置間隔多久才進(jìn)行一次檢測,檢測需要關(guān)閉的空閑連接,單位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一個(gè)連接在池中最小生存的時(shí)間,單位是毫秒
      minEvictableIdleTimeMillis: 300000
      # 用來檢測連接是否有效的sql,要求是一個(gè)查詢語句。
      # 如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會起作用
      validationQuery: SELECT 1 FROM DUAL
      # 建議配置為true,不影響性能,并且保證安全性。
      # 申請連接的時(shí)候檢測,如果空閑時(shí)間大于timeBetweenEvictionRunsMillis,執(zhí)行validationQuery檢測連接是否有效。
      testWhileIdle: true
      # 申請連接時(shí)執(zhí)行validationQuery檢測連接是否有效,做了這個(gè)配置會降低性能
      testOnBorrow: false
      # 歸還連接時(shí)執(zhí)行validationQuery檢測連接是否有效,做了這個(gè)配置會降低性能
      testOnReturn: false
      # 打開PSCache,并且指定每個(gè)連接上PSCache的大小
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      # 通過別名的方式配置擴(kuò)展插件,多個(gè)英文逗號分隔,常用的插件有: 
      # 監(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è)置(第五步) 修改成自己的賬號密碼,后面還要用

賬號: 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頁面上的“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);
     });

可以的到信息

內(nèi)容使用
請求函數(shù)$.ajax()
請求方式POST
提交到urlsubmitLogin
提交的數(shù)據(jù)loginUsername=? , loginPassword=?
提交的數(shù)據(jù)類型text
請求成功返回值如果等于successlocation.href = “index.html”

自帶登錄的請求過程:

  • 訪問登錄頁面http://localhost:8080/druid/login.html
  • ajax進(jìn)行post請求,提交loginUsernameloginPassword
  • 如果登錄成功,則返回值為success,就會跳轉(zhuǎn) http://localhost:8080/druid/index.html

使用Filter 過濾 替換掉Url(第六步)

這個(gè)需要一波三折

點(diǎn)擊頁面菜單 請求 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,不然會報(bào)錯(cuò)
     return "/";
 }

關(guān)鍵的上場了 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);
        // 針對druid做自動登錄
        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");
            //允許所有跨域請求
            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請求
response.setStatus(307);
response.setHeader("Location", newUrl.toString());
response.setHeader("Connection", "close");

最終結(jié)果

運(yùn)行效果

到此這篇關(guān)于SpringBoot項(xiàng)目中Druid自動登錄功能實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot Druid自動登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring?Security權(quán)限控制的實(shí)現(xiàn)接口

    Spring?Security權(quán)限控制的實(shí)現(xiàn)接口

    這篇文章主要介紹了Spring?Security的很多功能,在這些眾多功能中,我們知道其核心功能其實(shí)就是認(rèn)證+授權(quán)。Spring教程之Spring?Security的四種權(quán)限控制方式
    2023-03-03
  • 詳解SpringBoot上傳圖片到阿里云的OSS對象存儲中

    詳解SpringBoot上傳圖片到阿里云的OSS對象存儲中

    這篇文章主要介紹了SpringBoot上傳圖片到阿里云的OSS對象存儲中,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java中優(yōu)先隊(duì)列PriorityQueue常用方法示例

    Java中優(yōu)先隊(duì)列PriorityQueue常用方法示例

    這篇文章主要介紹了Java中優(yōu)先隊(duì)列PriorityQueue常用方法示例,PriorityQueue是一種特殊的隊(duì)列,滿足隊(duì)列的“隊(duì)尾進(jìn)、隊(duì)頭出”條件,但是每次插入或刪除元素后,都對隊(duì)列進(jìn)行調(diào)整,使得隊(duì)列始終構(gòu)成最小堆(或最大堆),需要的朋友可以參考下
    2023-09-09
  • SpringBoot整合RabbitMQ實(shí)現(xiàn)延遲隊(duì)列的示例詳解

    SpringBoot整合RabbitMQ實(shí)現(xiàn)延遲隊(duì)列的示例詳解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何整合RabbitMQ實(shí)現(xiàn)延遲隊(duì)列,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2023-04-04
  • Java中synchronized關(guān)鍵字的使用和原理詳解

    Java中synchronized關(guān)鍵字的使用和原理詳解

    這篇文章主要介紹了Java中synchronized關(guān)鍵字的使用和原理詳解,JVM 是通過進(jìn)入、退出 對象監(jiān)視器(Monitor)來實(shí)現(xiàn)對方法、同步塊的同步的,而對象監(jiān)視器的本質(zhì)依賴于底層操作系統(tǒng)的互斥鎖實(shí)現(xiàn),需要的朋友可以參考下
    2023-09-09
  • Java文件目錄下載并打包成ZIP壓縮包

    Java文件目錄下載并打包成ZIP壓縮包

    這篇文章主要介紹了在Java中如何實(shí)現(xiàn)文件夾、文件目錄的遞歸下載并打包成ZIP壓縮包,文中的示例代碼講解詳細(xì),有需要的可以參考下
    2024-10-10
  • 詳解Java中多進(jìn)程編程的實(shí)現(xiàn)

    詳解Java中多進(jìn)程編程的實(shí)現(xiàn)

    這篇文章主要介紹了詳解Java中多進(jìn)程編程的實(shí)現(xiàn),和多線程一樣,多進(jìn)程同樣是實(shí)現(xiàn)并發(fā)的一種方式,需要的朋友可以參考下
    2015-11-11
  • MyBatis-Plus框架整合詳細(xì)方法

    MyBatis-Plus框架整合詳細(xì)方法

    MyBatis-Plus是一個(gè) MyBatis 的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生這篇文章主要介紹了MyBatis-Plus框架整合,需要的朋友可以參考下
    2022-04-04
  • Spring框架學(xué)習(xí)之Spring?@Autowired實(shí)現(xiàn)自動裝配的代碼

    Spring框架學(xué)習(xí)之Spring?@Autowired實(shí)現(xiàn)自動裝配的代碼

    自動裝配就是說,你不用手動實(shí)現(xiàn)bean之間的組合關(guān)系,只要使用了@Autowired注解,程序就會自動的注入這個(gè)需要的bean,前提是你的Spring容器有這個(gè)bean,這篇文章主要介紹了Spring?@Autowired實(shí)現(xiàn)自動裝配,需要的朋友可以參考下
    2021-12-12
  • Java連接六類數(shù)據(jù)庫技巧全攻略

    Java連接六類數(shù)據(jù)庫技巧全攻略

    本文主要為大家介紹了Java與Oracle、DB2、Sql Server、Sybase、MySQL、PostgreSQL等數(shù)據(jù)庫連接的方法。
    2015-09-09

最新評論

大宁县| 通城县| 马山县| 五指山市| 乌兰察布市| 高淳县| 克什克腾旗| 海林市| 安远县| 克什克腾旗| 维西| 光山县| 济源市| 望都县| 洛宁县| 中牟县| 前郭尔| 玉山县| 平果县| 宁城县| 周至县| 高邑县| 长泰县| 电白县| 惠州市| 凤阳县| 万年县| 镇宁| 任丘市| 霍林郭勒市| 武乡县| 历史| 开平市| 竹溪县| 鸡东县| 攀枝花市| 浦东新区| 微山县| 郁南县| 吉木萨尔县| 万州区|