![spring](https://i-blog.csdnimg.cn/blog_migrate/91307bb52b8e366a994641171cd85dc5.png)
spring
“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。
部署应用程序很困难。 通常,您需要控制台访问服务器,从服务器中获取最新代码,然后手动实例化到您的容器中。 在本教程中,您将看到使用Tomcat的更简单方法:创建经过身份验证的Web应用程序,并使用最新版本的Tomcat,Spring Boot和Java通过浏览器进行部署。
从版本9开始,Oracle将Java发行周期降低到六个月,因此主要版本号的增长速度比以前快得多。 最新版本是Java SE 11 (标准版),于2018年9月发布。此新版本中最大的许可更改导致一个明显的收获:从现在开始使用OpenJDK。 Open JDK是Java的免费版本,您现在也可以从Oracle获得它。 另外,Java 11具有长期支持,因此,这是您以后将要用于新项目的版本。
启动您的Java 11应用
打开控制台并运行java -version
以查看所使用的Java版本。
[karl@localhost demo]$ java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-b16)
OpenJDK 64-Bit Server VM (build 25.111-b16, mixed mode)
[karl@localhost demo]$
Java 8显示为1.8.0
。
SDKMAN是使您的开发库保持最新状态的出色工具。 要安装它运行
$ curl -s "https://get.sdkman.io" | bash
请注意,SDKMAN仅适用于Linux和类似Unix的系统。 Windows用户将需要手动安装最新的Java 。
如果SDKMAN安装正确,您将看到有关使命令在当前终端中运行的说明。
All done!
Please open a new terminal, or run the following in the existing one:
source "/home/karl/.sdkman/bin/sdkman-init.sh"
Then issue the following command:
sdk help
Enjoy!!!
[karl@localhost demo]
运行显示的source
命令,并且sdk
命令应该处于活动状态。
现在,只需使用sdk install java
即可安装最新的Java。
[karl@localhost demo]$ sdk install java
Downloading: java 11.0.2-open
In progress...
完成后, java -version
应该显示11.0.2
。
Done installing!
Setting java 11.0.2-open as default.
[karl@localhost demo]$ java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
[karl@localhost demo]$
注意:如果您已经有了SDKMAN! 并且安装了Java 11,则可以使用sdk default java 11.0.2-open
将其设置为默认sdk default java 11.0.2-open
。
为Tomcat创建一个Spring Boot项目
启动Spring项目的最流行方法是使用Spring Initializr
在您喜欢的Web浏览器中导航到start.spring.io,然后选择项目选项:
- 保留为Maven,Java和最新的稳定Spring Boot(2.1.4)
- 如果需要,请更改组和工件
- 单击更多选项,然后选择
Java 11
- 在“依赖关系”框中,键入并选择
Web
,Security
和Devtools
。 它们应显示为在右侧选择的依赖项
现在,单击Generate Project ,一个zip文件将随项目一起下载。 只需解压缩并从命令行输入目录。 如果ls
你会看到五个文件和一个目录( src
)。
[karl@m14x demo]$ ls
HELP.md mvnw mvnw.cmd pom.xml src
mvnw
是一个脚本,它使您无需全局安装即可使用Maven。 mvnw.cmd
是此脚本的Windows版本。 pom.xml
描述了您的项目,而src
包含您的Java代码。 (请注意,嵌入式Maven文件所在的目录还有一个.mvn
隐藏目录!)
让我们看看该项目做什么。 输入./mvnw spring-boot:run
并按Enter键。 可能需要一段时间才能安装所有内容,但是最终,您应该看到类似以下内容:
Tomcat started on port(s): 8080 (http) with context path ''
2019-03-17 19:56:49.342 INFO 10744 --- [ restartedMain] com.karl.demo.DemoApplication : Started DemoApplication in 3.022 seconds (JVM running for 3.56)
请注意消息Tomcat started on port(s): 8080
。 打开浏览器窗口到http://localhost:8080
,您应该看到一个登录页面。
您可以使用“ user”来验证用户名和已打印到终端的密码。 登录后,您会看到一个404错误页面,因为您尚未创建任何代码来显示/
的登录页面。
向您的Spring Boot应用添加安全身份验证
让我们添加Okta身份验证。 为什么选择Okta? 因为您不想担心管理用户和哈希密码的麻烦,对吗? 朋友不让朋友写认证–让Okta的专家代您为您做吧! 毕竟,Okta的API也是用Java和Spring Boot构建的!
注册免费帐户后,请转到信息中心上的“应用程序”。 单击“添加应用程序” ,选择“ Web” ,然后单击“下一步” 。
您现在应该在“应用程序设置”页面中。 将“登录重定向URI”字段替换为以下内容:
http://localhost:8080/login/oauth2/code/okta
点击底部的完成。 从“客户端凭据”部分复制您的客户端ID和客户端机密,并将其保存在安全的地方。 现在,右键单击顶部的API标签(在Applications旁边),然后单击Authorization Servers 。 记下看起来如下的Issuer URI :
https://{yourOktaDomain}/oauth2/default
在项目中的src/main/resources/application.yml
创建一个文件,并将这些值放入其中:
okta:
oauth2:
issuer: https://{yourOktaDomain}/oauth2/default
client-id: {clientId}
client-secret: {clientSecret}
现在,在您的pom.xml
添加Okta Spring Boot Starter库作为依赖项。
<dependency>
<groupId>com.okta.spring</groupId>
<artifactId>okta-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
现在,编辑您的主Java入口文件(可能类似于src/main/java/com/example/demo/DemoApplication.java
),并将@RestController
批注以及主页入口点添加到该类中:
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.security.core.Authentication;
import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@GetMapping
@ResponseBody
public String currentUserName(Authentication authentication) {
DefaultOidcUser userDetails = (DefaultOidcUser) authentication.getPrincipal();
return "Hello, " + userDetails.getFullName();
}
}
使用./mvnw spring-boot:run
重新启动您的应用程序,或使用您的IDE来运行它。
现在,当您访问http://localhost:8080
您应该会看到Okta登录屏幕。
输入附加的Okta用户的详细信息(您可以在此处使用与Okta开发人员帐户相同的登录名)后,您应该会看到一条欢迎消息,其中包含您注册时输入的全名:
热门提示:注销OAuth2会话比人们最初想象的要细微得多。 为了继续测试登录过程,我建议您使用专用浏览窗口以确保登录屏幕返回。 完成后将其关闭。
停止您的Spring Boot应用程序,以便您可以在其默认端口8080上运行Tomcat。
为您的Spring Boot App设置Tomcat 9
安装和运行Tomcat并非易事。 首先下载与您的平台兼容的二进制文件。 确保使用.zip
或.tar.gz
文件,而不要使用安装程序。 解压缩到一个位置,里面的bin
目录中运行启动脚本- startup.sh
用于Linux / Mac和startup.bat
为Windows。
[karl@m14x bin]$ ./startup.sh
Using CATALINA_BASE: /home/karl/Downloads/apache-tomcat-9.0.19
Using CATALINA_HOME: /home/karl/Downloads/apache-tomcat-9.0.19
Using CATALINA_TMPDIR: /home/karl/Downloads/apache-tomcat-9.0.19/temp
Using JRE_HOME: /home/karl/.sdkman/candidates/java/current
Using CLASSPATH: /home/karl/Downloads/apache-tomcat-9.0.19/bin/bootstrap.jar:/home/karl/Downloads/apache-tomcat-9.0.19/bin/tomcat-juli.jar
Tomcat started.
[karl@m14x bin]$
热门提示:您也可以使用./catalina.sh run
启动您的应用程序。 此命令会将日志打印到您的终端,因此您无需拖尾日志即可查看正在发生的情况。
浏览到http://localhost:8080
,您应该看到Tomcat安装页面。
从您的Spring Boot项目创建WAR文件
现在,您需要从Spring Boot应用程序中创建一个WAR文件。 在pom.xml
的<description>
节点之后添加以下内容。
<packaging>war</packaging>
通过将以下内容添加到依赖项列表中来删除嵌入式Tomcat服务器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
最后,通过使用SpringBootServletInitializer
扩展主类,将您的应用程序作为servlet启用:
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {
...
}
现在,使用以下命令清理并打包您的应用程序:
./mvnw clean package
您应该看到类似以下的消息:
[INFO] Building war: /home/karl/tst/demo/target/demo-0.0.1-SNAPSHOT.war
记下您的新.war
。
从浏览器将WAR部署到Tomcat
您可能已经注意到,在Tomcat欢迎屏幕的右侧是三个按钮: Server Status , Manager App和Host Manager 。 您可以从Manager App部署WAR,但是它需要身份验证(默认情况下没有定义用户)。
将以下内容添加到Tomcat目录中的conf/tomcat-users.xml
中:
<user username="karl" password="secret" roles="manager-gui" />
您需要重新启动Tomcat才能使此更改生效。 因为直接启动它,所以您需要自己停止该过程。 使用ps aux | grep tomcat
查找进程ID ps aux | grep tomcat
ps aux | grep tomcat
。
[karl@m14x bin]$ ps aux | grep tomcat
karl 11813 180 1.9 7389172 159596 pts/0 Sl 09:44 0:07 /home/karl/.sdkman/candidates/java/current/bin/java -Djava.util.logging.config.file=/home/karl/Downloads/apache-tomcat-9.0.19/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/karl/Downloads/apache-tomcat-9.0.19/bin/bootstrap.jar:/home/karl/Downloads/apache-tomcat-9.0.19/bin/tomcat-juli.jar -Dcatalina.base=/home/karl/Downloads/apache-tomcat-9.0.19 -Dcatalina.home=/home/karl/Downloads/apache-tomcat-9.0.19 -Djava.io.tmpdir=/home/karl/Downloads/apache-tomcat-9.0.19/temp org.apache.catalina.startup.Bootstrap start
karl 11881 0.0 0.0 6268 2280 pts/0 S+ 09:44 0:00 grep tomcat
[karl@m14x bin]$
在这里,我的进程ID是11813。使用kill命令将其杀死。
kill 11813
像以前一样使用startup.sh
重新启动服务器。 当您单击Manager App按钮时,您在上方输入的用户详细信息将带您进入Manager屏幕。
滚动到底部的“要部署的WAR文件”部分。 单击浏览…,然后从之前选择WAR文件。 点击部署。
如果向上滚动,应该会在“应用程序”部分中看到类似/demo-0.0.1-SNAPSHOT
的内容。 单击此按钮将带我们到http://localhost:8080/demo-0.0.1-SNAPSHOT
,这是Tomcat从中为我们的应用程序提供服务的位置。 您会看到错误的请求错误。
这是因为在我们的Okta应用程序配置中,重定向URL现在是错误的-一切都应以demo-0.0.1-SNAPSHOT
开头。 这个名字有点麻烦。 要对其进行更改,请将您的WAR文件重命名为demo.war
(您可以通过将<finalName>demo</finalName>
到pom.xml
的build部分来永久地执行此操作)。 现在,在管理器窗口中单击您的应用程序名称旁边的“取消部署” ,然后重新部署WAR。 现在,该应用程序应位于/demo
。
现在,在Okta应用程序配置中,所有URL都以/demo
,例如http://localhost:8080/demo/login/oauth2/code/okta
(您可以通过单击Edit ,然后单击Save来执行此操作)。 现在,在管理器中单击/demo
应用程序(或浏览至http://localhost:8080/demo
),应该会像以前一样显示欢迎屏幕。
热门提示:为确保本地开发设置与要部署到的计算机匹配,请在pom.xml
添加以下内容,以确保嵌入式Tomcat版本与外部服务器相同:
<properties>
<tomcat.version>9.0.19</tomcat.version>
</properties>
了解有关Tomcat,Spring Boot和Java 11的更多信息
做得好–您已将Spring Boot 2.1应用程序远程部署到Tomcat 9,全部由Java 11支持!
希望本教程对您有所帮助。 您可以在oktadeveloper / okta-spring-boot-tomcat-example上找到此示例的GitHub存储库。
请查看以下一些链接以获取更多信息:
- Java 11,Spring Boot和JavaScript中的i18n
- Spring Boot 2.1:出色的OIDC,OAuth 2.0和React式API支持
- 将您的Spring Boot应用程序迁移到最新和最新的Spring Security和OAuth 2.0
- 使用Spring WebFlux构建React性API
- 使用Spring Boot和MongoDB构建一个React式应用程序
- Baeldung的如何将WAR文件部署到Tomcat
喜欢你今天学到的东西吗? 在Twitter上关注我们,并订阅我们的YouTube频道。
“将Spring Boot应用程序部署到Tomcat中”最初于2019年4月16日发布在Okta开发人员博客上。
“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。
翻译自: https://www.javacodegeeks.com/2019/04/deploy-spring-boot-application-tomcat.html
spring