SpringBoot关闭druid的页面和添加密码验证方式
作者:捞起月亮的渔民小豪
这篇文章主要介绍了SpringBoot关闭druid的页面和添加密码验证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
SpringBoot关闭druid的页面和添加密码验证
在生产环境中,需要关闭druid的页面,以免被攻击。
application.properties配置文件中添加参数
# Druid 数据源监控配置 # 是否启用StatViewServlet(监控页面)false为不启动 spring.datasource.druid.stat-view-servlet.enabled=true spring.datasource.druid.stat-view-servlet.url-pattern=/druid/* # IP白名单(没有配置或者为空,则允许所有访问) spring.datasource.druid.stat-view-servlet.allow=127.0.0.1,192.168.0.1 # IP黑名单 (存在共同时,deny优先于allow) spring.datasource.druid.stat-view-servlet.deny=192.168.0.0 # 禁用HTML页面上的“Reset All”功能 spring.datasource.druid.stat-view-servlet.reset-enable=false # 登录名 spring.datasource.druid.stat-view-servlet.login-username=admin # 登录密码 spring.datasource.druid.stat-view-servlet.login-password=admin
SpringBoot集成druid监控
1.引入pom依赖
<!-- druid数据库连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.8</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.8</version> </dependency>
2.配置文件配置监控的属性
注意:如果不想要登录页面,配置文件中可注释掉用户名和密码
########## 配置StatViewServlet(监控页面),用于展示Druid的统计信息 ########## # 启用StatViewServlet spring.datasource.druid.stat-view-servlet.enabled=true # 访问内置监控页面的路径,内置监控页面的首页是/druid/index.html spring.datasource.druid.stat-view-servlet.url-pattern=/druid\/* # 不允许清空统计数据,重新计算 spring.datasource.druid.stat-view-servlet.reset-enable=false # 配置监控页面访问用户名 #spring.datasource.druid.stat-view-servlet.login-username=admin # 配置监控页面访问密码 #spring.datasource.druid.stat-view-servlet.login-password=admin # 允许访问的地址,如果allow没有配置或者为空,则允许所有访问 #spring.datasource.druid.stat-view-servlet.allow=127.0.0.1 # 拒绝访问的地址,deny优先于allow,如果在deny列表中,就算在allow列表中,也会被拒绝 #spring.datasource.druid.stat-view-servlet.deny= ########## 配置WebStatFilter,用于采集web关联监控的数据 ########## # 启动 StatFilter spring.datasource.druid.web-stat-filter.enabled=true # 过滤所有url spring.datasource.druid.web-stat-filter.url-pattern=\/* # 排除一些不必要的url spring.datasource.druid.web-stat-filter.exclusions=/druid\/*,*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico # 开启session统计功能 spring.datasource.druid.web-stat-filter.session-stat-enable=true # session的最大个数,默认1000 spring.datasource.druid.web-stat-filter.session-stat-max-count=1000 spring.datasource.druid.initial-size=5 spring.datasource.druid.min-idle=5 spring.datasource.druid.max-active=20 # 配置获取连接等待超时的时间 spring.datasource.druid.max-wait=60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 spring.datasource.druid.time-between-eviction-runs-millis=60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 spring.datasource.druid.min-evictable-idle-time-millis=30000 spring.datasource.druid.validation-query=SELECT 1 FROM DUAL spring.datasource.druid.test-while-idle=true spring.datasource.druid.test-on-borrow=false spring.datasource.druid.test-on-return=false # 打开PSCache,并且指定每个连接上PSCache的大小 spring.datasource.druid.pool-prepared-statements=true spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20 spring.datasource.druid.filters=stat,wall # Spring 监控,利用aop 对指定接口的执行时间,jdbc数进行记录 spring.datasource.druid.aop-patterns= com.admin.controller.*,com.front.controller.*
注意:每个/*
符号,走做了转译,复制过去的话需要取消转译符号
3. 运行后,访问方法
(1)可单独访问整个链接
(2) 需要将页面内嵌在项目中:可在后台写一个方法,返回单独访问的路径
- 后台
@RestController @RequestMapping("/druid") public class DataSource { @Value("${druid.index}") private String druidIndex; @GetMapping("/druid") public ResponseInfo druid(HttpServletRequest request) { // 127.0.0.1 String remoteAddr = RequestUtils.getRemoteAddr(request); // 访问域名 192.168.1.105 String serverName = request.getServerName(); // 访问端口号 int port = request.getServerPort(); String url = "http://" + serverName + ":" + port + druidIndex; return new ResponseInfo(url); } }
- 配置文件druid.index
druid.index=/druid/index.html
- 工具类
/** * 获得真实IP地址。在使用了反向代理时,直接用HttpServletRequest.getRemoteAddr()无法获取客户真实的IP地址。 * * @param request * ServletRequest * @return */ public static String getRemoteAddr(ServletRequest request) { String addr = null; if (request instanceof HttpServletRequest) { HttpServletRequest hsr = (HttpServletRequest) request; for (String header : ADDR_HEADER) { if (StringUtils.isBlank(addr) || NUKNOWN.equalsIgnoreCase(addr)) { addr = hsr.getHeader(header); } else { break; } } } if (StringUtils.isBlank(addr) || NUKNOWN.equalsIgnoreCase(addr)) { addr = request.getRemoteAddr(); } else { // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按','分割 if (addr != null) { int i = addr.indexOf(","); if (i > 0) { addr = addr.substring(0, i); } } } return addr; }
- 前端
<template> <iframe :src="this.txtUrl" frameborder="0" width="100%" :style="{height:calHeight}" scrolling="auto"></iframe> </template> <script> export default { name: 'datasource', data () { return { txtUrl: '' } }, computed: { //计算属性 , 设置iframe高度为窗口高度少100px calHeight() { return (window.innerHeight - 100) + 'px'; } }, methods: { fetchSysteminfo () { // 调用的后台的druid方法 this.$request.fetchDatasource().then(res => { if (res.code === 200) { this.txtUrl = res.data } }).then(this.hideTableLoading).catch(this.hideTableLoading) } }, created () { this.fetchSysteminfo() } } </script>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。