🍅 作者简介:哪吒,CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪
🍅 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师
🍅 技术交流:定期更新Java硬核干货,不定期送书活动
🍅 点击文末名片,关注公众号【哪吒编程】,回复 1024 ,获取《10万字208道Java经典面试题总结(附答案)》2024修订版pdf,背题更方便,一文在手,面试我有
嗨,你好呀,我是哪吒。
面试的时候,被问到 “Spring Boot 中的监视器是什么?有哪些功能和作用?”
我的第一反应就是,不应该是监听器和拦截器吗?
监听器是基于观察者模式的实现,其工作原理是通过注册监听器来订阅特定的事件。当这些事件发生时,Spring框架会通知所有注册了对应事件的监听器,然后监听器会执行相应的操作。
比如初始化数据、读取配置文件、记录日志等。
具体的操作步骤:
面试官:我说的是监视器。
很多小伙伴开发多年,确实是没注意过监视器这个概念。
Spring Boot中的监视器是Actuator,我一般用来监控响应时间、CPU使用率、内存使用情况。
还可以通过分析日志信息,快速定位问题原因,还可以提供预警机制,以便在出现故障或异常时及时采取措施进行修复。
监视器可以与自动化运维工具集成,实现自动化部署、监控、报警和恢复等功能,提高运维效率。
可以通过一些端点进行监控和管理,比如:
再分享几道,彻底掌握监视器常见问题。
在开始使用监视器之前,需要明确监控的目标和范围。确定需要监控的关键指标,如响应时间、错误率、资源利用率等,并设定合理的阈值。
根据监控目标,配置合适的监控策略。这可能包括监控频率、数据聚合方式、报警触发条件等。确保监控策略能够有效地捕捉到潜在问题,并及时发出警报。
监视器本身也会占用一定的系统资源,并可能对应用程序的性能产生一定影响。因此,在选择和使用监视器时,需要权衡其功能和性能开销,确保不会对应用程序造成过大的负担。
监视器可能会收集到一些敏感信息,如用户数据、系统配置等。因此,在使用监视器时,需要确保敏感信息得到妥善保护,避免泄露给未经授权的人员。
(1)在pom.xml文件中添加Actuator的依赖
org.springframework.boot spring-boot-starter-actuator
(2)在application.properties或application.yml中配置Actuator的相关属性,例如开启所有的端点:
management: endpoints: web: exposure: include: "*"
(3)使用浏览器或者命令行工具(如curl)访问不同的端点
# 获取应用的健康状态信息 curl http://localhost:8080/actuator/health # 获取应用的基本信息 curl http://localhost:8080/actuator/info # 获取应用的性能指标 curl http://localhost:8080/actuator/metrics # 追踪HTTP请求的处理过程 curl http://localhost:8080/actuator/httptrace # 关闭应用 curl -X POST http://localhost:8080/actuator/shutdown
(1)创建一个安全配置类,继承WebSecurityConfigurerAdapter,并重写configure(AuthenticationManagerBuilder auth)方法。在该方法中,可以配置自定义的用户名和密码。
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() // 使用内存中的用户信息进行认证 .withUser("myuser") // 自定义用户名 .password("{noop}mypassword") // 自定义密码(使用明文) .roles("USER"); // 设置用户角色 } }
(2)在application.properties或application.yml中配置端点的安全路径和访问权限
management: endpoints: web: base-path: /actuator # 设置Actuator端点的根路径 exposure: include: "*" # 暴露所有端点 security: enabled: true # 启用Actuator的安全认证
(3)启动应用后,访问Actuator端点时,会提示输入自定义的用户名和密码进行身份验证。例如,访问/actuator/health端点时,浏览器会弹出一个登录窗口,要求输入自定义的用户名和密码。
在Spring Boot Actuator中,可以通过配置端点的访问权限来限制特定端点的访问。
(1)创建一个安全配置类,继承WebSecurityConfigurerAdapter,并重写configure(HttpSecurity http)方法。在该方法中,可以配置特定端点的访问权限。
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/actuator/health").hasRole("ADMIN") // 仅允许具有ADMIN角色的用户访问/actuator/health端点 .and() .httpBasic(); // 使用基本认证方式 } }
(2)在application.properties或application.yml中配置用户名和密码以及用户的角色:
spring: security: user: name: admin # 用户名 password: secret # 密码 roles: ADMIN # 用户角色
(3)启动应用后,访问Actuator端点时,会提示输入用户名和密码进行身份验证。例如,访问/actuator/health端点时,浏览器会弹出一个登录窗口,要求输入用户名和密码。只有具有ADMIN角色的用户才能成功访问该端点。
(1)添加spring-boot-starter-oauth2-client依赖到pom.xml文件中
org.springframework.boot spring-boot-starter-oauth2-client
(2)创建一个安全配置类,继承WebSecurityConfigurerAdapter,并重写configure(HttpSecurity http)方法。在该方法中,可以配置端点的访问权限和OAuth2认证。
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/actuator/**").authenticated() // 需要认证才能访问Actuator端点 .and() .oauth2Login(); // 使用OAuth2认证方式 } }
(3)在application.properties或application.yml中配置OAuth2相关的属性,例如客户端ID、客户端密钥和授权服务器的URL等。
spring: security: oauth2: client: registration: myprovider: # OAuth2提供商名称 client-id: your-client-id # 客户端ID client-secret: your-client-secret # 客户端密钥 authorization-grant-type: authorization_code # 授权类型 redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}" # 回调URL scope: openid,profile,email # 请求的权限范围 provider: myprovider: # OAuth2提供商名称 authorization-uri: https://your-authorization-server.com/oauth/authorize # 授权服务器的授权URL token-uri: https://your-authorization-server.com/oauth/token # 授权服务器的令牌URL user-info-uri: https://your-authorization-server.com/userinfo # 用户信息URL jwk-set-uri: https://your-authorization-server.com/jwks # JSON Web Key Set URL
(4)启动应用后,访问Actuator端点时,会跳转到OAuth2认证服务器的授权页面,要求输入用户名和密码进行身份验证。成功认证后,会返回一个授权码,然后应用会使用该授权码获取访问令牌,并进行后续的认证操作。
(1)导入依赖
首先,需要在项目的pom.xml文件中添加Spring Security和JWT相关的依赖。
org.springframework.boot spring-boot-starter-security io.jsonwebtoken jjwt 0.9.1
(2)配置JWT工具类
创建一个JWT工具类,用于生成和解析JWT令牌。这个工具类应该包含方法来生成令牌(通常在用户登录时),以及验证和解析令牌(在需要用户身份信息的端点)。
public class JwtUtil { private static final String SECRET_KEY = "yourSecretKey"; // 替换为你的密钥 public static String generateToken(String subject) { return Jwts.builder() .setSubject(subject) .setIssuedAt(new Date()) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); } public static Claims parseToken(String token) { return Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token) .getBody(); } }
(3)创建拦截器
可以创建一个拦截器来处理带有JWT的请求。拦截器会检查每个请求的HTTP头部是否包含JWT,如果存在,则解析JWT并验证其有效性。如果验证成功,请求将被允许继续;如果验证失败,将返回未经授权的响应。
public class JwtInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); if (token != null && !token.isEmpty()) { try { JwtUtil.parseToken(token); // 验证令牌 return true; // 令牌有效,允许请求继续 } catch (Exception e) { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 令牌无效,返回未授权响应 return false; } } else { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 缺少令牌,返回未授权响应 return false; } } }
(4)安全存储密钥
确保JWT的密钥安全存储,并定期更换以防止潜在的安全风险。密钥的安全性对于维护整个认证系统的安全至关重要。
(5)使用Actuator端点
Spring Boot Actuator提供了多种监控和管理生产环境的端点。在使用JWT进行认证时,可以通过配置Actuator的端点来限制访问,只有持有有效JWT的用户才能访问这些端点。
(6)测试验证
完成以上配置后,应该进行全面的测试,以确保JWT认证机制按预期工作。这包括测试令牌的生成、验证过程,以及确保未授权的请求被正确拒绝。
JWT,全称为JSON Web Token,就是我们经常提到的token,它以JSON对象的形式安全地在各个实体间传输信息。这些信息是经过数字签名的,因此可以被验证和信任。
JWT由三部分组成,它们用点(.)分隔,分别是:
JWT的主要用途包括:
JWT可以在用户初次登录后发放,之后的每次请求都会携带这个令牌,无需再次进行身份验证,这简化了认证流程。
JWT自身包含了所有必要的身份验证信息,这意味着服务器不需要存储会话信息,这增加了系统的可用性和伸缩性,减轻了服务端的负担。
JWT基于标准JSON格式,可以轻松在不同的平台和框架之间传递和使用,这在微服务架构和分布式系统中尤为重要。
JWT通常使用HS256等加密算法进行签名,确保了令牌的完整性和真实性。
(1)导入依赖
org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-starter-data-jpa com.hierynomus sshj 0.31.0
(2)在application.properties或application.yml配置文件中,可以设置SSH的认证信息。
management: endpoints: web: exposure: include: '*' # 暴露所有端点 endpoint: health: show-details: always # 显示健康检查详细信息 security: enabled: true # 启用安全认证 roles: admin # 设置访问权限为admin角色 ssh: username: your_username # SSH用户名 password: your_password # SSH密码 host: your_host # SSH主机名
(3)在数据库中创建一个具有管理员角色的用户,用于访问Actuator端点。这可以通过使用Spring Data JPA和Hibernate来实现。例如,可以创建一个名为User的实体类和一个名为UserRepository的接口:
@Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; // 省略getter和setter方法 } @Repository public interface UserRepository extends JpaRepository{ Optional findByUsername(String username); }
(4)在Spring Security的配置类中,可以配置SSH的安全认证。例如,可以创建一个名为SecurityConfig的配置类:
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserRepository userRepository; @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/actuator/**").hasRole("ADMIN") // 只允许ADMIN角色访问Actuator端点 .and() .formLogin().permitAll() // 允许所有用户访问登录页面 .and() .logout().permitAll(); // 允许所有用户访问注销页面 } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService()).passwordEncoder(new BCryptPasswordEncoder()); } @Bean public UserDetailsService userDetailsService() { return username -> userRepository.findByUsername(username) .map(user -> User.withUsername(user.getUsername()).password(user.getPassword()).roles("ADMIN").build()) .orElseThrow(() -> new UsernameNotFoundException("User not found")); } }
完成以上配置后,应该进行全面的测试,以确保SSH认证机制按预期工作。这包括测试SSH连接、登录和注销功能等。
SSH最初设计用于替代不安全的Telnet和FTP,现在它广泛应用于安全地连接和管理远程系统。
SSH的主要用途包括:
SSH和Telnet都是远程登录协议,但它们在安全性、加密方式和端口号等方面存在显著差异。
3万字80道Java经典面试题总结(2024修订版)- Java基础篇
2 万字 42 道Java经典面试题总结(2024修订版)- Java集合篇
4 万字 102 道Java经典面试题总结(2024修订版)- 多线程篇
10万字208道Java经典面试题总结(2024修订版)- SSM篇
5 万字 124 道MySQL经典面试题总结(2024修订版)
🏆文章收录于:100天精通Java从入门到就业
全网最细Java零基础手把手入门教程,系列课程包括:Java基础、Java8新特性、Java集合、高并发、性能优化等,适合零基础和进阶提升的同学。
🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。