SpringBoot项目中Druid自动登录功能实现

 更新时间:2024年08月22日 14:41:19   作者:陈增林  
Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能,这篇文章主要介绍了SpringBoot项目中Druid自动登录功能实现,需要的朋友可以参考下

Druid是什么

        Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。

集成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
      # 可以不配置,根据url自动识别,建议配置
      driver-class-name: com.mysql.jdbc.Driver
      ###################以下为druid增加的配置###########################
      type: com.alibaba.druid.pool.DruidDataSource
      # 初始化连接池个数
      initialSize: 5
      # 最小连接池个数——》已经不再使用,配置了也没效果
      minIdle: 2
      # 最大连接池个数
      maxActive: 20
      # 配置获取连接等待超时的时间,单位毫秒,缺省启用公平锁,并发效率会有所下降
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      # 用来检测连接是否有效的sql,要求是一个查询语句。
      # 如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用
      validationQuery: SELECT 1 FROM DUAL
      # 建议配置为true,不影响性能,并且保证安全性。
      # 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
      testWhileIdle: true
      # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
      testOnBorrow: false
      # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
      testOnReturn: false
      # 打开PSCache,并且指定每个连接上PSCache的大小
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      # 通过别名的方式配置扩展插件,多个英文逗号分隔,常用的插件有: 
      # 监控统计用的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的监控数据
      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优先于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);
     });

可以的到信息

内容使用
请求函数$.ajax()
请求方式POST
提交到urlsubmitLogin
提交的数据loginUsername=? , loginPassword=?
提交的数据类型text
请求成功返回值如果等于successlocation.href = “index.html”

自带登录的请求过程:

  • 访问登录页面http://localhost:8080/druid/login.html
  • ajax进行post请求,提交loginUsernameloginPassword
  • 如果登录成功,则返回值为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

通过该页面继续请求 Controller 的 /doDruidLogin,随意命名

在你的controller控制类里面加入该方法

 @RequestMapping("/doDruidLogin")
 public String doDruidLogin(){
 	 //不会执行,但要拦截/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
  • 利用状态码和响应头 使浏览器继续进行POST请求
response.setStatus(307);
response.setHeader("Location", newUrl.toString());
response.setHeader("Connection", "close");

最终结果

运行效果

到此这篇关于SpringBoot项目中Druid自动登录功能实现的文章就介绍到这了,更多相关SpringBoot Druid自动登录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Linux部署springboot项目彩色日志打印方式

    Linux部署springboot项目彩色日志打印方式

    这篇文章主要介绍了Linux部署springboot项目彩色日志打印方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Java 基础全面讲解StringBuffer类的使用

    Java 基础全面讲解StringBuffer类的使用

    当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder类,和String类不同的是,StringBuffer和 StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象
    2022-01-01
  • 深入浅析jcmd:JDK14中的调试神器

    深入浅析jcmd:JDK14中的调试神器

    这篇文章主要介绍了jcmd:JDK14中的调试神器,本文给大家提到了jcmd的语法,通过实例列举的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • servlet实现简单的权限管理和敏感词过滤功能

    servlet实现简单的权限管理和敏感词过滤功能

    JavaEE课要求用servlet和过滤器实现权限管理和敏感词过滤功能,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 使用JVMTI实现SpringBoot的jar加密,防止反编译

    使用JVMTI实现SpringBoot的jar加密,防止反编译

    这篇文章主要介绍了使用JVMTI实现SpringBoot的jar加密,防止反编译问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • spring boot使用properties定义短信模板的方法教程

    spring boot使用properties定义短信模板的方法教程

    这篇文章主要给大家介绍了关于spring boot使用properties定义短信模板的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • SpringMVC表单提交参数400错误解决方案

    SpringMVC表单提交参数400错误解决方案

    这篇文章主要介绍了SpringMVC表单提交参数400错误解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • java代理模式(静态代理、动态代理、cglib代理)

    java代理模式(静态代理、动态代理、cglib代理)

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;这篇文章主要介绍了Java 中的三种代理模式,需要的朋友可以参考下,希望能给你带来帮助
    2021-07-07
  • Java初学者了解

    Java初学者了解"=="与equals的区别

    这篇文章主要介绍了Java初学者了解"=="与equals的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java如何获取@TableField,@TableName注解的值

    Java如何获取@TableField,@TableName注解的值

    这篇文章主要介绍了Java如何获取@TableField,@TableName注解的值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01

最新评论