SpringBoot - 集成Actuator(应用信息显示、修改系统日志、增加账号密码登录)

news2024/11/30 10:48:12

文章目录

    • Actuator
      • 概述
        • 官网入口
        • 支持的埋点信息查询、修改
      • 使用
        • 访问actuator埋点信息添加账号密码登录验证
        • 动态修改日志级别

Actuator

概述

官网入口

官网: https://docs.spring.io/spring-boot/docs/2.7.6/reference/html/actuator.html#actuator.endpoints

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

支持的埋点信息查询、修改

官网: https://docs.spring.io/spring-boot/docs/2.7.6/reference/html/actuator.html#actuator.endpoints

访问:

  1. 获取信息(Get):http://ip:端口号/actuator/埋点ID
  2. 修改信息(Post): http://ip:端口号/actuator/埋点ID/[[可能会有,比如修改日志时需要使用到]]

在这里插入图片描述

在这里插入图片描述

使用

访问actuator埋点信息添加账号密码登录验证

特别注意: 不要使用拦截器(HandlerInterceptor)进行拦截/actuator链接,因为拦不到,只能使用过滤器才能拦截到,我也不知道为什么

pom.xml - 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>


application.yml

management:
  endpoint:
    beans:
      enabled: true
    health:
      # 不开启仅有应用是否可用信息,开启了可以看到磁盘信息、数据库连接是否可用状态等其他组件信息
      show-details: always
    shutdown:
      enabled: true
  endpoints:
    # 所有端点功能设置成默认都可用 == 开启了这个上面的配置如果不是false,可以不用设置
    enabled-by-default: true
    web:
      cors:
        allow-credentials: true
        allowed-methods: '*'
        allowed-origin-patterns: '*'
      exposure:
        # 所有端点都对外暴露可访问到
        include: '*'



LrcUtilsWebApplication.java - 启动类-必须必须添加注解@ServletComponentScan,否则过滤器的路径匹配不生效

@ServletComponentScan
@SpringBootApplication
public class LrcUtilsWebApplication {

	public static void main(String[] args) {
		SpringApplication.run(LrcUtilsWebApplication.class, args);
	}

}



ActuatorEndpointFilter.java - 账号密码过滤器

/**
 * @author LinRuChang
 * @version 1.0
 * @date 2022/11/30
 * @since 1.8
 **/
@Slf4j
@WebFilter(filterName = "actuatorEndpointFilter", urlPatterns = {"/actuator/*"})
public class ActuatorEndpointFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        //无需登录,可直接访问、修改埋点信息
        if(!SpringUtil.getBean(SysDictService.class).getAuthActuatorSwitch()) {
            chain.doFilter(request, response);
            return;
        }

        boolean authStatusFlag = false;
        String authorization = EnhanceSpringUtil.getCurrentRequestHeader("Authorization");
        log.info("Actuator系统埋点认证信息【Authorization】:{}", authorization);

        String authType = null;
        String authInfoCredentials = null;
        String userName = null;
        List<String> authorizationInfos = StrUtil.splitTrim(authorization, StrUtil.SPACE);
        if (CollUtil.size(authorizationInfos) == 2) {
            authType = authorizationInfos.get(0);
            authInfoCredentials = authorizationInfos.get(1);
            if (StrUtil.isNotBlank(authInfoCredentials)) {
                if (StrUtil.equalsAnyIgnoreCase(authType, "BASIC")) {
                    String authInfo = Base64.decodeStr(authInfoCredentials);
                    List<String> authInfos = StrUtil.splitTrim(authInfo, StrUtil.COLON);
                    userName = CollUtil.size(authInfos) >= 2 ? authInfos.get(0) : null;
                    String password = CollUtil.size(authInfos) >= 2 ? authInfos.get(1) : null;

                    // 这里自行获取数据库中的用户、密码信息进行校验是否正确
                    Dict dbUserInfo = getActuatorUserInfo(userName);
                    if (dbUserInfo != null && StrUtil.equals(password, dbUserInfo.getStr("password"))) {
                        authStatusFlag = true;
                    }
                }
            }
        }

        // 认证失败
        if (!authStatusFlag) {
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;
            httpServletResponse.setHeader("WWW-Authenticate", StrUtil.format("{} realm=\"请填写正确的Actuator管理员账号、密码信息\"", StrUtil.blankToDefault(authType, "BASIC")));
            httpServletResponse.setStatus(401);
            httpServletResponse.setHeader("Content-Type", RequestEnum.RequestContentTypeEnum.JSON.getCode());
            ResponseResult<String> unauthorizedInfo = ResponseResult.unauthorized("请填写正确的Actuator管理员账号、密码信息");
            httpServletResponse.getWriter().write(JSONUtil.toJsonStr(unauthorizedInfo));
            return;
        }

        chain.doFilter(request, response);
    }


    public Dict getActuatorUserInfo(String loginName) {
        SysDictService sysDictService = SpringUtil.getBean(SysDictService.class);
        Dict actuatorConfig = sysDictService.getActuatorConfig();
        if (StrUtil.equals(loginName, actuatorConfig.getStr("loginName"))) {
            return actuatorConfig;
        }
        return null;
    }

}


在这里插入图片描述


动态修改日志级别

日志级别(某日志级别会把其上面级别的日志也会显示出来)
OFF
ERROR
INFO
INFO
DEBUG
TRACE
//post请求

//全局日志级别修改
http://127.0.0.1:9999/actuator/loggers/ROOT
//请求体
{
    "configuredLevel": "日志级别(忽略大小写)"
}


//局部日志级别修改
http://127.0.0.1:9999/actuator/loggers/类、包全限定名
//请求体
{
    "configuredLevel": "日志级别(忽略大小写)"
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

csdn中书写数学公式简单介绍

参考&#xff1a;https://www.zybuluo.com/codeep/note/163962#3%E5%9C%A8%E5%AD%97%E7%AC%A6%E9%97%B4%E5%8A%A0%E5%85%A5%E7%A9%BA%E6%A0%BC 常识、常用 一行公式使用$$开始和结尾&#xff0c;常用符号表示 符号功能$$多行公式的开始和结尾&#xff0c;一个$表示单行公式开…

Cisco ASA基础——安全算法与基本配置

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 本章重点 一.Cisco防火墙简介 1.什么是防火墙 2.防火墙的作用…

PHP表单处理的案例分析

目录 知识补充 实现过程 前端代码 后端代码 简单分析 知识补充 表单简介&#xff08;来自Mr._Dang&#xff09; action&#xff1a;提交的地址 method&#xff1a;提交的方式 get&#xff1a; 参数是在url中的&#xff0c;不安全&#xff0c;传输量比较少&#xff…

[附源码]Python计算机毕业设计Django的在线作业批改系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

[附源码]Python计算机毕业设计SSM力高灯饰线上交易平台(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

一言不合就重构

hello&#xff0c;大家好呀&#xff0c;我是小楼。 前段时间不是在忙么&#xff0c;忙的内容之一就是花了点时间重构了一个服务的健康检查组件&#xff0c;目前已经慢慢在灰度线上&#xff0c;本文就来分享下这次重构之旅&#xff0c;也算作个总结吧。 背景 服务健康检查简介…

短视频创作,变现的建议、变现方式和举例,建议收藏反复阅读-上

先说今天的纲要&#xff0c;有兴趣可以继续看下去&#xff0c;今天主要针对短视频变现这件事的讨论&#xff0c;有三个建议&#xff0c;①变现标准低、②变现天花板高、③可主动变现。 我们在选择变现形式的时候&#xff0c;尽可能满足这三个条件或其中两个。 中间我们再讨论下…

【LeetCode】895.最大频率栈

题目描述 设计一个类似堆栈的数据结构&#xff0c;将元素推入堆栈&#xff0c;并从堆栈中弹出出现频率最高的元素。 实现 FreqStack 类: FreqStack() 构造一个空的堆栈。void push(int val) 将一个整数 val 压入栈顶。int pop() 删除并返回堆栈中出现频率最高的元素。 如果出现…

【问题思考总结】NAT的公有地址怎么转换为私有地址?【MAC地址和IP地址的转换】

问题起源 在做一道题的时候&#xff0c;涉及到了由内网到外网再到内网时的IP地址转换。在外网的时候&#xff0c;答案说的是不能够用私有IP地址作为源IP地址&#xff0c;然后疑问产生了&#xff1a;如果不能用私有IP地址作为目的地址&#xff0c;他又怎么能够找到那个主机呢&a…

[附源码]Python计算机毕业设计SSM乐多多宠物店网站(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

2022年11月30日 Fuzzy C-Means学习笔记

​ Fuzzy C-Means 模糊c均值聚类&#xff0c;它的一大优势就是引入了一个隶属度的概念&#xff0c;没有对样本进行非黑即白的分类&#xff0c;而是分类的时候乘上隶属度&#xff0c;直白点说就是他和某个中心有多像&#xff0c;到底是40%像还是70%像。 ​ 参考&#xff1a;在众…

CF27E (2000) (反素数)

https://codeforces.com/contest/27/problem/E 反素数&#xff1a; 若N < 2 ^ 31 引理1&#xff1a; 1 ~ N 中的反素数&#xff0c;就是 1 ~ N中约数个数最多的数中 最小 的一个。 引理2&#xff1a; 1 ~ N 中任何数的不同质因子都不会超过 10 个且所有质因子的质数都不会超…

真题集P91---2018年计专真题

真题集P91---2018年计专真题三(2)自由树直径思路代码四思路代码五思路代码三(2)自由树直径 思路 1、吉大出的题目&#xff0c;没规定是否是有权图&#xff0c;以及是否是有向图&#xff0c;所以这里默认&#xff0c;权值是1的无向图。 1、如果权值都一样&#xff0c;用邻接表存…

[附源码]Python计算机毕业设计Django的疫苗接种管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

AI绘画怎么操作

ai绘画的4个途径 1.小程序意间ai绘画 需要排队可以多用一点积分换vip通道会快一点,还有就是凌晨两三点的时候快 我一般是图5那样的参数,横图4:3 竖图3:4 2.draft.art网站AI绘画 直接用手机浏览器搜就可以,搜出来就是图6那样的界面点下面蓝色按钮,我是用的🍎自带的浏览…

精品基于JAVA的医院挂号系统的设计与实现SSM

《基于JAVA的医院挂号系统的设计与实现》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;ssm 前端技术&#xff1a;JavaScript、VUE.js&#xff08;2.X&#xff09;、css3 JDK版…

66 - C++中的类型识别

---- 整理自狄泰软件唐佐林老师课程 1. 类型识别 在面向对象中可能出现下面的情况&#xff1a; 基类指针指向子类对象基类引用成为子类对象的别名 这个时候就会出现问题&#xff1a;&#xff08;由于 赋值兼容性原则 &#xff09;没法通过一个父类指针判断指向的是父类对象还…

ZMQ之多线程编程

使用ZMQ进行多线程编程&#xff08;MT编程&#xff09;将会是一种享受。在多线程中使用ZMQ套接字时&#xff0c;你不需要考虑额外的东西&#xff0c;让它们自如地运作就好。 使用ZMQ进行多线程编程时&#xff0c;不需要考虑互斥、锁、或其他并发程序中要考虑的因素&#xff0c;…

安卓手机配哪款蓝牙耳机?最适合安卓手机的蓝牙耳机

蓝牙耳机火了之后&#xff0c;各个品牌就开始涌现&#xff0c;就连手机厂家也开始涉足蓝牙耳机领域。安卓手机这几年也是受到很多人的喜爱&#xff0c;那么安卓手机应该怎么选择蓝牙耳机呢&#xff1f;下面我们一起来看看当前值得入手的蓝牙耳机吧&#xff01; 第一款&#xf…

文章向大家介绍安卓逆向,解决app抓包抓不到的问题,主要包括安卓逆向,解决app抓包抓不到的问题使用实例、应用技巧

本文章向大家介绍安卓逆向&#xff0c;解决app抓包抓不到的问题&#xff0c;主要包括安卓逆向&#xff0c;解决app抓包抓不到的问题使用实例、应用技巧、基本知识点总结和需要注意事项&#xff0c;具有一定的参考价值&#xff0c;需要的朋友可以参考一下。 有时候app抓不到包&…