“我喜欢编写身份验证和授权代码。” 〜从来没有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 helpEnjoy!!!
[karl@localhost demo]
运行显示的source
命令,并且sdk
命令应该处于活动状态。
现在,只需使用sdk install java
即可安装最新的Java。
[karl@localhost demo]$ sdk install javaDownloading: java 11.0.2-openIn 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”选项卡上(“ 应用程序”旁边),然后单击“ 授权服务器” 。 记下颁发者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@ResponseBodypublic 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
(可以通过在pom.xml
的build部分中添加<finalName>demo</finalName>
来永久执行此操作)。 现在,在管理器窗口中单击您的应用程序名称旁边的“ 取消部署” ,然后重新部署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和反应式API支持
- 将您的Spring Boot应用程序迁移到最新和最新的Spring Security和OAuth 2.0
- 使用Spring WebFlux构建反应性API
- 使用Spring Boot和MongoDB构建一个反应式应用程序
- 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