当前位置: 代码网 > it编程>编程语言>Java > SpringBoot项目中Druid自动登录功能实现

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

2024年08月22日 Java 我要评论
druid是什么druid是java语言中最好的数据库连接池。druid能够提供强大的监控和扩展功能。集成druid(第一步)除了springboot、thymeleaf 、mysql驱动、通用map

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自动登录内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com