Spring Security系列教程27--Spring Security实现CAS单点登录--搭建CAS服务端

简介: 前言在上一章节中,一一哥 给各位介绍了单点登录的概念、执行流程原理,并且给大家介绍了CAS单点登录解决方案,在CAS解决方案中,我们需要搭建CAS服务端和CAS客户端,本文就开始给大家介绍如何实现CAS服务端。在这里,我给大家介绍一个开源的CAS服务端模板cas-overlay-template,接下来请跟我一起看看怎么实现吧。一. 搭建CAS服务器1. 概述为了测试我前面讲解的CAS请求执行流程,我们需要搭建一个CAS测试环境,本篇内容主要是带领大家搭建一个CAS Server服务端环境。搭建CAS Server环境,需要依赖如下环境:● JDK1.8+● Maven3.6+

前言

在上一章节中,一一哥 给各位介绍了单点登录的概念、执行流程原理,并且给大家介绍了CAS单点登录解决方案,在CAS解决方案中,我们需要搭建CAS服务端和CAS客户端,本文就开始给大家介绍如何实现CAS服务端。在这里,我给大家介绍一个开源的CAS服务端模板cas-overlay-template,接下来请跟我一起看看怎么实现吧。

一. 搭建CAS服务器

1. 概述

为了测试我前面讲解的CAS请求执行流程,我们需要搭建一个CAS测试环境,本篇内容主要是带领大家搭建一个CAS Server服务端环境。搭建CAS Server环境,需要依赖如下环境:

  • JDK1.8+
  • Maven3.6+

如果你还没有搭建以上这些开发环境,请参考其他文章进行搭建。

2. 下载CAS Server项目

对于CAS Server服务端,我们可以自己编写,但是自己编写服务端,需要进行大量的代码实现。在本案例中,我采用网上的一个开源CAS系统进行认证中心的搭建,这个开源项目在Github上找到。

CAS开源项目地址:

https://github.com/apereo/cas-overlay-template

3. 导入CAS Server项目

我们从Github上把CAS Server端模板项目下载下来之后,导入到IDEA开发工具中。当我们把CAS项目导入到IDEA后,Maven会自动下载所有相关依赖及插件,最主要的是cas-overlay模块,但是下载过程中,可能会有部分插件无法导入,忽略这些即可,影响不大。

4. cas-overlay项目的pom.xml文件

<?xmlversion="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd "><modelVersion>4.0.0</modelVersion><groupId>org.apereo.cas</groupId><artifactId>cas-overlay</artifactId><packaging>war</packaging><version>1.0</version><properties><cas.version>5.3.16</cas.version><springboot.version>1.5.18.RELEASE</springboot.version><!-- app.server could be -jetty, -undertow, -tomcat, or blank if you plan to provide appserver --><app.server>-tomcat</app.server><mainClassName>org.springframework.boot.loader.WarLauncher</mainClassName><isExecutable>false</isExecutable><manifestFileToUse>${project.build.directory}/war/work/org.apereo.cas/cas-server-webapp${app.server}/META-INF/MANIFEST.MF</manifestFileToUse><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!--<dependencies>--><!--<dependency>--><!--<groupId>org.apereo.cas</groupId>--><!--<artifactId>cas-server-support-jpa-service-registry</artifactId>--><!--<version>${cas.version}</version>--><!--</dependency>--><!--<dependency>--><!--<groupId>com.fasterxml.jackson.core</groupId>--><!--<artifactId>jackson-databind</artifactId>--><!--<version>2.9.9</version>--><!--</dependency>--><!--</dependencies>--><build><plugins><plugin><groupId>com.rimerosolutions.maven.plugins</groupId><artifactId>wrapper-maven-plugin</artifactId><version>0.0.5</version><configuration><verifyDownload>true</verifyDownload><checksumAlgorithm>MD5</checksumAlgorithm></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${springboot.version}</version><configuration><mainClass>${mainClassName}</mainClass><addResources>true</addResources><executable>${isExecutable}</executable><layout>WAR</layout></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>2.6</version><configuration><warName>cas</warName><failOnMissingWebXml>false</failOnMissingWebXml><recompressZippedFiles>false</recompressZippedFiles><archive><compress>false</compress><manifestFile>${manifestFileToUse}</manifestFile></archive><overlays><overlay><groupId>org.apereo.cas</groupId><artifactId>cas-server-webapp${app.server}</artifactId></overlay></overlays><dependentWarExcludes><!--让war包下的json不进行初始化-->                        **/services/*.json
</dependentWarExcludes></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.3</version></plugin></plugins><finalName>cas</finalName></build><repositories><repository><id>sonatype-releases</id><url>http://oss.sonatype.org/content/repositories/releases/</url><snapshots><enabled>false</enabled></snapshots><releases><enabled>true</enabled></releases></repository><repository><id>sonatype-snapshots</id><url>https://oss.sonatype.org/content/repositories/snapshots/</url><snapshots><enabled>true</enabled></snapshots><releases><enabled>false</enabled></releases></repository><repository><id>shibboleth-releases</id><url>https://build.shibboleth.net/nexus/content/repositories/releases</url></repository></repositories><profiles><profile><activation><activeByDefault>true</activeByDefault></activation><id>default</id><dependencies><dependency><groupId>org.apereo.cas</groupId><artifactId>cas-server-webapp${app.server}</artifactId><version>${cas.version}</version><type>war</type><scope>runtime</scope></dependency><!--...Additional dependencies may be placed here...--></dependencies></profile><profile><activation><activeByDefault>false</activeByDefault></activation><id>exec</id><properties><mainClassName>org.apereo.cas.web.CasWebApplication</mainClassName><isExecutable>true</isExecutable><manifestFileToUse/></properties><build><plugins><!--<plugin>--><!--<groupId>com.soebes.maven.plugins</groupId>--><!--<artifactId>echo-maven-plugin</artifactId>--><!--<version>0.3.0</version>--><!--<executions>--><!--<execution>--><!--<phase>prepare-package</phase>--><!--<goals>--><!--<goal>echo</goal>--><!--</goals>--><!--</execution>--><!--</executions>--><!--<configuration>--><!--<echos>--><!--<echo>Executable profile to make the generated CAS web application executable.</echo>--><!--</echos>--><!--</configuration>--><!--</plugin>--></plugins></build></profile><profile><activation><activeByDefault>false</activeByDefault></activation><id>bootiful</id><properties><app.server>-tomcat</app.server><isExecutable>false</isExecutable></properties><dependencies><dependency><groupId>org.apereo.cas</groupId><artifactId>cas-server-webapp${app.server}</artifactId><version>${cas.version}</version><type>war</type><scope>runtime</scope></dependency></dependencies></profile><profile><activation><activeByDefault>false</activeByDefault></activation><id>pgp</id><build><plugins><!--<plugin>--><!--<groupId>com.github.s4u.plugins</groupId>--><!--<artifactId>pgpverify-maven-plugin</artifactId>--><!--<version>1.1.0</version>--><!--<executions>--><!--<execution>--><!--<goals>--><!--<goal>check</goal>--><!--</goals>--><!--</execution>--><!--</executions>--><!--<configuration>--><!--<pgpKeyServer>hkp://pool.sks-keyservers.net</pgpKeyServer>--><!--<pgpKeysCachePath>${settings.localRepository}/pgpkeys-cache</pgpKeysCachePath>--><!--<scope>test</scope>--><!--<verifyPomFiles>true</verifyPomFiles>--><!--<failNoSignature>false</failNoSignature>--><!--</configuration>--><!--</plugin>--></plugins></build></profile></profiles></project>

你可以参考我的pom文件内容,因为每个人的网速不同,所以有可能你会在下载依赖时导致一些问题,别担心,下载失败时多次重试下载即可。

二. keytool密钥库工具

1. 概述

因为在CAS Server中默认使用的是HTTPS网络协议,对安全性要求较高,所以需要我们生成一个本地的密钥库,而这个密钥库,我们使用JDK中自带的Keytool证书管理工具就可以生成。

2. 证书及作用

在上一小节中,一一哥 就给大家提到了证书这个概念,所以我们先了解一下证书的概念及其作用。

在网络中,我们对数据进行签名(加密)是一种很常见的安全操作,一般签名有2种作用

  • 保证数据的完整性,证明数据在传输过程中没有被篡改;
  • 防止数据的发布者否认自己发布了数据。

在签名的时候,会用到非对称性加密算法和消息摘要算法。当我们对数据进行签名时,会先对这个数据进行消息摘要,通过摘要运算生成一个摘要信息,然后再对该摘要使用发布者的私钥进行加密。 比如支付宝支付时,需要先对订单数据进行签名,一般会将各支付参数和参数值拼接成一个字符串,这个组合的字符串也就相当于我们这里说的摘要,然后将摘要信息使用商户的私钥进行加密。

接收者(客户端)接受到加密数据后,会先使用发布者的公钥进行解密,得到原数据的摘要信息,再对接收到的数据计算摘要。如果两个摘要相同,则说明数据没有被篡改。同时,因为发布者的私钥是不公开的,只要接收者通过发布者的公钥能成功对数据进行解密,就说明该数据一定来源于该发布者。

那么怎么确定某公钥一定是属于某发布者呢?这就需要证书了。证书是由权威认证机构颁发的,其内容包含证书拥有者的标识和它的公钥,并由权威认证机构使用它的私钥进行签名。该证书由权威认证机构进行签名,认证机构也是通过发布它的证书来公开该机构的公钥,认证机构的证书由更权威的认证机构进行签名,这样就形成了证书链。证书链最顶端的证书称为根证书,根证书只有自签名。总之,要对网络上传播的内容进行签名和认证,就一定会用到证书。关于证书遵循的标准,最流行的是 X.509 标准规范。

3. Keytool简介

Keytool是JDK中自带的数据证书管理工具,这个工具一般存放在JDK的\jre\bin\目录下,利用Keytool可以生成我们需要的密钥和证书信息。这些生成的所有数字证书都是以一条一条(采用别名来区别)的形式存入证书库中,证书库中的每个证书都包含该条证书的私钥,公钥和对应的数字证书的信息。证书库中的每条证书都可以导出为数字证书文件,数字证书文件只包括主体信息和对应的公钥信息。

Keytool 会把 密钥(key) 和 证书(certificates) 存在于一个称为 keystore 的文件中,在keystore文件里,包含两种数据:

  • 密钥实体(Key entity)——私钥(secret key);
  • 可信任的证书实体(trusted certificate entries)——公钥。

4. Keytool常用命令

4.1 生成证书的命令

#命令实例keytool -genkey-alias yyg -keyalg RSA -keystore D:/yyg.keystore -keypass123456-storepass123456-dname"CN=xingming,OU=danwei,O=zuzhi,L=shi,ST=sheng,C=CN"keytool -genkey-alias yyg -keyalg RSA -keysize1024-validity365-keystore D:/yyg.keystore -keypass123456-storepass123456-dname"CN=xingming,OU=danwei,O=zuzhi,L=shi,ST=sheng,C=CN"

-genkey 生成秘钥库,默认会在用户的主目录中创建一个".keystore"文件,还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书信息;

-alias 别名,每个keystore都关联一个独一无二的alias,alias通常不区分大小写,自己随便定义即可;

-keyalg 密钥算法,可选值为RSA和DSA(如果不指定默认采用DSA);

-keysize 设置秘钥长度;

-validity 设置密钥的有效期是多少天,默认为90天

-keystore 设置生成的秘钥库文件存储路径和名称;

-keypass 设置秘钥口令;

-storepass 秘钥库口令;

-dname 拥有者信息,CN: 姓名;OU: 组织单位名称;O: 组织名称;L: 省/市/自治区名称;C: 国家/地区代码;

-delete  删除密钥库中某条目;

-import  将已签名数字证书导入密钥库。

4.2 查看genkey命令的参数说明

keytool -genkey-?

4.3 查看证书命令

keytool -list-keystore d:/yyg.keystore -storepass123456keytool -list-v-keystore d:/yyg.keystore -storepass123456 keytool -list-rfc-keystore d:/yyg.keystore -storepass123456

-list 列出秘钥库中的条目,显示密钥库中的证书信息;

-v 显示密钥库中证书的详细信息;

-rfc 以RFC样式输出。

4.4 查看list命令的参数说明

keytool -list-?

4.5 导出证书到文件的命令

#该命令由客户端执行keytool -export-alias yyg -keystore d:\yyg.keystore -file d:\mycerts.cer -storepass123456

4.6 导入证书到密钥库的命令

keytool -import-trustcacerts-alias yyg -keystore"%JAVA_HOME%/jre/lib/security/cacerts "-file d:\mycerts.cer -storepass123456

4.7 列出可用证书的命令

我们通过上面的命令,生成的证书可以交付客户端用户使用,用以进行SSL通讯,或者伴随电子签名的jar包进行发布者的身份认证。如果在使用证书时出现了异常:“未找到可信任的证书”,这个主要原因为在客户端未将服务器下发的证书导入到JVM中,可以用如下命令查看:

keytool -list-alias yyg -keystore"%JAVA_HOME%/jre/lib/security/cacerts"-storepass123456

注意:

如果keytool生成根证书时出现如下错误:

java.io.IOException:keystore was tampered with,or password was incorrect

产生该问题的原因,可能是因为我们用户的home目录下已经有.keystore存在,如果存在的话,我们就把该文件先删除掉,然后再执行生成命令或者删除"%JAVA_HOME%/jre/lib/security/cacerts后再执行。

4.8 删除证书的命令

要删除证书库里面的某个证书,可以使用如下命令:

keytool -delete-alias yyg -keystore cacerts -storepass123456

4.9 修改证书密码

keytool -keypasswd-alias yyg -keypass123456-new654321-keystore yyg.keystore -storepass123456

4.10 修改密钥库存储密码

keytool -storepasswd-new654321-keystore yyg.keystore -storepass123456

4.11 修改密钥库别名

keytool -changealias-keystore mykeystore.keystore -alias 当前别名 -destalias 新别名

三. 生成CAS Server密钥库

1. 生成casserver密钥库

在上一章节中,我给大家介绍了Keytool工具的使用,接下来我们利用这个Keytool工具,来生成针对CAS Server项目的密钥库文件。

我们可以先在E盘里创建一个keystore文件夹,用于存放我们接下来要生成的密钥库文件,然后执行如下命令。

keytool -genkey-alias casserver -keyalg RSA -keystore E:\keystore\yyg.keystore

命令执行过程效果如下图:

注意:

在“您的名字与姓氏是什么?”选项里,我们应当填写为CAS Server的域名,否则在后面进行单点登录的过程中会遇到问题。当然如果是仅在本地进行开发测试,则域名可以随便填写,并通过配置hosts文件的方式使其生效。剩余的参数则直接回车一路默认跳过即可。

然后我们去E盘下可以看到,产生了一个名为yyg.keystore的密钥库文件。

2. 导出证书

在真实开发时,CAS Server是支持HTTPS协议的,但在进行本地开发时,我们自制的证书会影响开发测试。因为HTTPS通信协议需要考虑SSL证书的问题,本地开发时可能会产生ssl.SSLHandshakeException异常,所以我们在本地开发时需要解决这个问题。

这里我们需要把自己生成的证书导入到JDK中,而在JDK中自带了一个证书库,JDK8及以前的版本中,该证书库位于"%JAVAHOME%/jre/lib/security/cacerts"中;JDK9以后,取消了jre目录,证书位于"%JAVAHOME%/lib/security/cacerts"中。

接下来我们先将前面制作的密钥库导出证书,并将其导入到cacerts中即可。

keytool -export-trustcacerts-alias casserver -file E:\keystore\cas.cer -keystore E:\keystore\yyg.keystore

执行上面命令时,可以看到如下效果:

接着我们在E盘的keystore目录下,看到产生了一个cas.cer证书。

3. 导入证书

我们接下来执行如下命令,将自己产生的证书导入到JDK的密钥库中,注意修改成自己的路径。

keytool -import-trustcacerts-alias casserver -file E:\keystore\cas.cer -keystore"C:\Program Files\Java\jre1.8.0_211\lib\security\cacerts"

注意:

命令行需要以管理员身份执行,否则可能会没有权限。

至此,我们已经把证书添加到JDK的证书库中了。

四. 修改CAS Server配置文件

1. 概述

我们从github上下载的CAS Server项目模板,是基于overlays方式构建的,而overlays是一种对抗重复代码和资源的策略,它允许我们在多个Web工程中共享通用资源。如果仅仅搭建一个本地测试的CAS Server项目,我们只需要覆盖一些基本配置即可。

2. 配置根路径及端口号

默认情况下,CAS Server服务端的访问根路径是/cas,默认的访问端口是8443,这些信息我们都可以自己修改,本案例中我就采用默认配置了。

#项目访问时的根路径server.context-path=/cas
#项目访问端口号server.port=8443

3. 配置密钥库

我们先新建一个src/main/resources目录,将overlays/{cas-server}/WEB-INF/classes/application.properties配置文件复制到resources目录下,后面我们修改该配置文件即可。然后我们把前面我们生成的cas.cer和yyg.keystore密钥文件,复制到resouces目录下。

在application.properties配置文件中,主要是修改server.ssl.key-xxx相关的配置项。

#配置秘钥库keystore文件的位置server.ssl.key-store=classpath:yyg.keystore
#指定密钥库的口令server.ssl.key-store-password=syc000
#指定密钥口令server.ssl.key-password=syc000

4. 配置用户名和密码

默认情况下,CAS Server使用casuser作为用户名,使用Mellon作为密码,如果我们要修改这个用户信息,可以修改cas.authn.accept.users这已配置项。

## 认证的用户名和密码# CAS Authentication Credentials# 默认的用户名,casuser;默认的密码:Melloncas.authn.accept.users=yyg::123

五. 启动运行CAS Server

1. 启动项目

我们配置好上面的application.properties文件之后,就可以考虑启动CAS Server项目了。

CAS Server官方为windows和mac系统都提供了运行脚本,但是兼容性一般,所以可能在启动运行时,不同的平台会有问题,本案例是在windows环境下进行启动运行。

CAS Server有2种启动方式,即可以采用war包和SpringBoot方式来启动,本案例我就采用SpringBoot方式来进行运行了,我们在IDEA开发工具的Terminal窗口中,执行如下命令即可:

mvn spring-boot:run

注意:

在CAS Server项目启动过程中可能会报错,但不影响正常使用,只要在控制台出现READY图案即可!

2. 配置hosts文件

我们在前面制作密钥库时,使用了cas.yyg.cn作为域名,为了让该配置生效,需要将该域名配置到我们系统的hosts文件中,并指向127.0.0.1。配置完成之后,我们可以利用https://cas.yyg.cn:8443/cas来访问CAS Server项目。

#配置cas服务端域名127.0.0.1 cas.yyg.cn
#配置cas客户端域名127.0.0.1 client.cas.yyg.cn

3. 访问CAS服务端

因为浏览器的安全限制,访问时可能会出现如下提示,选择继续前往即可。

继续前往后,就会跳转到/cas/login页面,我们输入前面设置的用户名和密码即可。

在用户名和密码正确的情况下,出现认证成功的页面。

如果出现登录成功的页面,就说明我们的CAS Server服务端已经配置成功,后面就可以把该项目作为认证中心,来接收CAS Client项目发来的认证请求了。

六. 配置客户端services信息

1. 注册服务的JSON文件

在上面我们已经把CAS Server服务端搭建好了,接下来需要把CAS Client客户端项目接入到CAS Server服务端,如果我们没有定义服务记录,客户端在访问时会提示“未验证授权的服务”。在CAS Server中,支持多种注册服务的方式,本案例中我们采用JSON声明的方式来把客户端注册到CAS Server中。

在CAS Server服务注册时,把每个JSON文件对应一个客户端服务,这个JSON文件可以命名为如下格式:

JSON filename=servicename +"-"+ serviceNumericId +".json"

代表客户端服务的JSON文件内容如下:

{
"@class":"org.apereo.cas.services.RegexRegisteredService",
"serviceId":"^https://client.cas.yyg.cn",
"name":"casclient",
"id":10000,
"description": "cas client based on spring security",
"evaluationOrder":1}
  • @class: 必须配置为org.apereo.cas.services.RegexRegisteredService;
  • serviceId: 可以通过正则表达式来匹配每一个CAS Client;
  • name: 指定CAS Client的名称,随便写;
  • id: 全局唯一的编号,也就是filename中的serviceNumericId字段;
  • description:对client的描述;
  • evaluationOrder:指明client服务的执行顺序。

2. 配置services信息

在本案例中,我们把JSON文件命名为casclient-10000.json,并存放在/src/main/resources/services目录下,如下图:

然后我们修改application.properties文件,修改内容如下:

#加载json资源cas.serviceRegistry.json.location=classpath:/services#是否开启json识别功能,默认为falsecas.serviceRegistry.initFromJson=true#忽略https安全协议,使用 HTTP 协议cas.tgc.secure=false#是否自动扫描服务配置,默认开启#cas.serviceRegistry.watcherEnabled=true#默认每隔120秒扫描一次服务配置#cas.serviceRegistry.repeatInterval=120000#默认在CAS Server启动后延迟15s开启自动扫描#cas.serviceRegistry.startDelay=15000

在我们修改完application.properties配置文件后,需要把CAS Server端项目停止,并重新执行启动命令,使得当前配置生效。在配置生效后,Terminal控制台会出现下图提示,代表已经成功的加载了一个service信息:

这样我们接下来就可以搭建一个对应的CAS Client项目,来访问这个CAS Server端了。

至此,我就搭建了一个CAS Server端环境,然后就可以搭建CAS Client项目,实现客户端项目与作为认证中心的服务端之间进行交互了。

相关文章
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
2475 5
|
9月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1354 3
|
8月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1506 5
|
10月前
|
Java Linux 网络安全
Linux云端服务器上部署Spring Boot应用的教程。
此流程涉及Linux命令行操作、系统服务管理及网络安全知识,需要管理员权限以进行配置和服务管理。务必在一个测试环境中验证所有步骤,确保一切配置正确无误后,再将应用部署到生产环境中。也可以使用如Ansible、Chef等配置管理工具来自动化部署过程,提升效率和可靠性。
955 13
|
11月前
|
安全 Java 数据库
Spring Boot 框架深入学习示例教程详解
本教程深入讲解Spring Boot框架,先介绍其基础概念与优势,如自动配置、独立运行等。通过搭建项目、配置数据库等步骤展示技术方案,并结合RESTful API开发实例帮助学习。内容涵盖环境搭建、核心组件应用(Spring MVC、Spring Data JPA、Spring Security)及示例项目——在线书店系统,助你掌握Spring Boot开发全流程。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
1916 3
|
人工智能 缓存 自然语言处理
保姆级Spring AI 注解式开发教程,你肯定想不到还能这么玩!
这是一份详尽的 Spring AI 注解式开发教程,涵盖从环境配置到高级功能的全流程。Spring AI 是 Spring 框架中的一个模块,支持 NLP、CV 等 AI 任务。通过注解(如自定义 `@AiPrompt`)与 AOP 切面技术,简化了 AI 服务集成,实现业务逻辑与 AI 基础设施解耦。教程包含创建项目、配置文件、流式响应处理、缓存优化及多任务并行执行等内容,助你快速构建高效、可维护的 AI 应用。
|
XML JavaScript Java
Spring Retry 教程
Spring Retry 是 Spring 提供的用于处理方法重试的库,通过 AOP 提供声明式重试机制,不侵入业务逻辑代码。主要步骤包括:添加依赖、启用重试机制、设置重试策略(如异常类型、重试次数、延迟策略等),并可定义重试失败后的回调方法。适用于因瞬时故障导致的操作失败场景。
712 1
Spring Retry 教程
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
1064 2