SpringBoot基本原理,轻松应对面试官 - 第522篇
最近看到一个利用AI生成照片唱歌的视频,点赞1450,评论389,收藏843,如果多几个这样的不错的视频,那么账号不火都难。如果是传统的方式,要制作这样的视频,难度会比较大,现在如果利用AI来实现的话,分分钟的事情:
导读
知道与不知道只隔着一次勇敢的尝试。在技术的领域里,那看似难以跨越的从不知到知的沟壑,或许就藏在一次代码的编写中。当你鼓起勇气,在键盘上敲下那一行行神秘的字符,去尝试实现一个新的功能,去探索一种未曾用过的算法,也许就在那瞬间,你捅破了那层阻隔你与新技术认知的薄纱。
技巧一:Spring Boot 应用 5 种保护绝佳方法
(1)在生产中使用HTTPS
传输层安全性(TLS)是HTTPS的官方名称,你可能听说过它称为SSL(安全套接字层),SSL是已弃用的名称,TLS是一种加密协议,可通过计算机网络提供安全通信。其主要目标是确保计算机应用程序之间的隐私和数据完整性。
过去,TLS / SSL证书很昂贵,而且HTTPS被认为很慢,现在机器变得更快,已经解决了性能问题,Let's Encrypt提供免费的TLS证书,这两项发展改变了游戏,并使TLS成为主流。
(2)使用Snyk检查你的依赖关系
你很可能不知道应用程序使用了多少直接依赖项,这通常是正确的,尽管依赖性构成了整个应用程序的大部分。攻击者越来越多地针对开源依赖项,因为它们的重用为恶意黑客提供了许多受害者,确保应用程序的整个依赖关系树中没有已知的漏洞非常重要。
Snyk测试你的应用程序构建包,标记那些已知漏洞的依赖项。它在仪表板在应用程序中使用的软件包中存在的漏洞列表。
此外,它还将建议升级的版本或提供补丁,并提供针对源代码存储库的拉取请求来修复您的安全问题。Snyk还确保在你的存储库上提交的任何拉取请求(通过webhooks)时都是通过自动测试的,以确保它们不会引入新的已知漏洞。
(3)升级到最新版本
基础架构升级通常不如依赖项升级具有破坏性,因为库作者对向后兼容性和版本之间的行为更改的敏感性各不相同。话虽如此,当你在配置中发现安全漏洞时,您有三种选择:升级,修补程序或忽略。
在对应用程序进行必要的更改以使用较新版本之后,就应用程序的整体运行状况而言,升级是最安全的。
(4)启用CSRF保护
跨站点请求伪造(Cross-Site Request Forgery )是一种攻击,强制用户在他们当前登录的应用程序中执行不需要的操作。如果用户是普通用户,一个成功攻击可能涉及请求的状态更改,如转移资金或更改其电子邮件地址,如果用户具有提升管理员的权限,则CSRF攻击可能会危及整个应用程序。
Spring Security具有出色的CSRF支持,如果您正在使用Spring MVC的form:form标签或Thymeleaf @EnableWebSecurity,默认情况下处于启用状态,CSRF令牌将自动添加为隐藏输入字段。
(5)使用内容安全策略防止XSS攻击
内容安全策略(CSP)是一个增加的安全层,可帮助缓解XSS(跨站点脚本)和数据注入攻击。要启用它,你需要配置应用程序以返回Content-Security-Policy标题。你还可以在HTML页面中使用标记。
技巧二:Spring Boot配置随机数技巧以及应用场景
Spring Boot支持在系统加载的时候配置随机数。
添加config/random.properties文件,添加以下内容:
#随机32位MD5字符串
user.random.secret=${random.value}
#随机int数字
user.random.intNumber=${random.int}
#随机long数字
user.random.longNumber=${random.long}
#随便uuid
user.random.uuid=${random.uuid}
#随机10以内的数字
user.random.lessTen=${random.int(10)}
#随机1024~65536之内的数字
user.random.range=${random.int[1024,65536]}
具体的生成细节可以参考Spring Boot的配置类:
org.springframework.boot.env.RandomValuePropertySource
其实就是使用了 Java 自带的 java.util.Random 和 java.util.UUID 等工具类,实现很简单,这里就不再详细解析了,大家可以自己去看下这个类的实现。
具体的应用场景:
(1)动态端口号配置:在开发和测试中,可以用随机端口号来避免端口冲突。例如,在 application.properties 中使用 ${random.int[10000, 20000]} 来为应用分配一个随机端口,这样多个实例可以在不同的端口上运行。
(2)唯一 ID 生成:可以用于生成唯一的应用实例 ID,适用于需要分布式标识的场景,如分布式缓存的标识配置等。
(3)密码、密钥等敏感信息的生成:在开发和测试环境中,可以用随机数生成临时密码、密钥等。例如,配置一个随机密码用来保护应用的敏感接口。
(4)模拟测试数据:通过随机数为测试环境生成一些假数据,适用于自动化测试、性能测试等场景。
(5)服务实例的标识与负载均衡:可以用随机数给服务实例生成不同的标识,特别是微服务架构中,随机标识可以用于注册和发现服务,实现基本的负载均衡。
技巧三:Spring Boot 运行应用的 3 种方式
运行 Spring Boot 应用的 3 种方式:
(1)在 IDE 中运行
在 Eclipse、IDEA 中直接运行,又有以下两种方式。
方式一:jar 包方式
Spring Boot默认采用 jar 包内嵌 Tomcat、Jetty 等 Server 的方式,并需要提供一个含有 main方法的主类。这个时候,直接在 IDE 中运行这个 main 方法就能启动 Spring Boot 应用了。
方式二:war 包方式
如果你的应用改装成了 war 包方式部署,这个时候就需要在 IDE 中配置 Server,然后在 Server 中加入你的 Spring Boot 项目,最后运行这个 Server 即可。
如何改装成 war 包方式运行可以关注公众号《SpringBoot》,
回复关键词:[453],查看文章:
《SpringBoot引入外部jar包,项目打包成war包发布(亲测有效) - 第453篇》
回复关键词[452],查看文章:
《SpringBoot添加外部jar包及打包(亲测有效) - 第452篇》
(2)打包运行
当你的 Spring Boot 准备提测或者上线,都需要打成 jar 包或者 war 包运行,war 包方式这里不说直接丢到 Server 里面运行即可,这里介绍直接运行 jar 包的方式。
$ java -jar javastack-0.0.1-SNAPSHOT.jar
这种方式也支持开启远程调试,如:
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar javastack-0.0.1-SNAPSHOT.jar
(3)用插件运行
可以在 IDE 或者命令行中使用 Maven 和 Gradle 插件来运行 Spring Boot 应用。
方式一Maven Plugin:$ mvn spring-boot:run
方式二Gradle Plugin:$ gradle bootRun
技巧四:返回XML数据
如何返回 XML 格式数据呢?其实很简单!
使用依赖包:jackson-dataformat-xml
1)定义返回方式
在 Controller 类上面用 @RestController 定义或者在方法上面用 @ResponseBody 定义,表明是在 Body 区域输出数据。
2)定义返回类型
此时 Content-Type 默认为 application/xhtml+xml;charset=UTF-8 格式,可以手动改变下类型:application/xml;charset=UTF-8。
@RequestMapping(value = "/test" produces = MediaType.APPLICATION_XML_VALUE)
表明是用 application/xml 格式输出数据。
3)定义输出格式
控制层方法直接返回对象,对象会自动转换为 XML 格式,不过是默认的标签,可以通过以下标签进行自定义 XML 格式。
@JacksonXmlRootElement(localName = "response")
public class UserXmlVO {
@JacksonXmlProperty(localName = "user_name")
private String name;
@JacksonXmlElementWrapper(useWrapping = false)
@JacksonXmlProperty(localName = "order_info")
private List<OrderInfoVO> orderList;
// get set 略
}
技巧五:Spring Boot 配置加载顺序
如果加载的配置有重复的,它们的加载顺序是这样的,数字越小的优先级越高,即优先级高的覆盖优先级低的配置。
Devtools global settings properties on your home directory (~/.spring-boot-devtools.properties when devtools is active).
@TestPropertySource annotations on your tests.
@SpringBootTest#properties annotation attribute on your tests.
Command line arguments.
Properties from SPRING_APPLICATION_JSON (inline JSON embedded in an environment variable or system property)
ServletConfig init parameters.
ServletContext init parameters.
JNDI attributes from java:comp/env.
Java System properties (System.getProperties()).
OS environment variables.
A RandomValuePropertySource that only has properties in random.*.
Profile-specific application properties outside of your packaged jar (application-{profile}.properties and YAML variants)
Profile-specific application properties packaged inside your jar (application-{profile}.properties and YAML variants)
Application properties outside of your packaged jar (application.properties and YAML variants).
Application properties packaged inside your jar (application.properties and YAML variants).
@PropertySource annotations on your @Configuration classes.
Default properties (specified using SpringApplication.setDefaultProperties).
对应的中文说明:
1、开发者工具 `Devtools` 全局配置参数;
2、单元测试上的 `@TestPropertySource` 注解指定的参数;
3、单元测试上的 `@SpringBootTest` 注解指定的参数;
4、命令行指定的参数,如 `java -jar springboot.jar --name="Java技术栈"`;
5、命令行中的 `SPRING_APPLICATION_JSONJSON` 指定参数, 如 `java -Dspring.application.json='{"name":"Java技术栈"}' -jar springboot.jar`
6、`ServletConfig` 初始化参数;
7、`ServletContext` 初始化参数;
8、JNDI参数(如 `java:comp/env/spring.application.json`);
9、Java系统参数(来源:`System.getProperties()`);
10、操作系统环境变量参数;
11、`RandomValuePropertySource` 随机数,仅匹配:`ramdom.*`;
12、JAR包外面的配置文件参数(`application-{profile}.properties(YAML)`)
13、JAR包里面的配置文件参数(`application-{profile}.properties(YAML)`)
14、JAR包外面的配置文件参数(`application.properties(YAML)`)
15、JAR包里面的配置文件参数(`application.properties(YAML)`)
16、`@Configuration`配置文件上 `@PropertySource` 注解加载的参数;
17、默认参数(通过 `SpringApplication.setDefaultProperties` 指定);
知道了它们的加载顺序,我们就能知道从哪一步来替换配置。
一文讲清楚SpringBoot项目打包jar后运行报错template might not exist - 第514篇
idea springboot woff/woff2/eot/ttf/svg等小图标不显示的问题 - 第515篇
Noisee AI中文站网页版 AI 音乐生成视频全新登场,快来抢先体验——国内第一个登场的中文站来袭 - 516篇
Spring的SmartLifecycle可以没用过,但没听过就不好了!- 第517篇
SpringBoot异常处理机制之自定义404、500错误提示页面 - 518篇
SpringBoot 中多例模式的神秘世界:用法区别以及应用场景,最后的灵魂拷问会吗?- 第519篇
SpringBoot开发的AI导航站技术架构剖析 —— 技术如何选型 - 第520篇
SpringBoot多例模式,在同一个类中注入两次是否是同一个对象 – 一不小心就会写出一个重大BUG!!- 521篇
SpringBoot基本原理,轻松应对面试官 - 第522篇
万物皆能舞,AI让你秒变“舞”林高手 – Viggle AI“舞”所不能
法定年龄退休2024年新规,我要到63岁才能退休了,看看你几岁退休,附退休对照表
又一款AI对口型神器,让照片开口说话唱歌,1分钟教会(附保姆级教程)