一个具有Spring Boot,Spring Security和Stormpath的简单Web应用程序-15分钟

建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现。 注册 ,再也不会建立auth了!

更新 :我们最近发布了对Stormpath Spring Security集成的修订。 您不再需要从特殊的Stormpath安全配置器适配器继承。 而是使用Stormpath DSL(特定于域的语言)。 看下面看这有多容易。

♥在Stormpath,我们♥Spring Boot。 构建丰富的Java Web应用程序变得如此轻松有趣。

我们对最新的Java SDK版本感到非常兴奋,其中包括对我们的Spring Security和Spring Boot支持的重大改进。

如果您以前曾经构建过Web应用程序,那么您将知道所有“用户资料”都是您的头疼。 Stormpath为开发人员提供了开箱即用的所有“用户资料”,因此您可以继续真正关心的是您的应用程序! 到本教程完成时(我保证不到15分钟),您将拥有一个可以正常运行的Spring Boot Web应用程序,该应用程序可以通过Spring Security保护用户对受限路径的访问,并得到Stormpath的支持。

我们将专注于我们的Spring Boot集成,以推出一个简单的Spring Boot Web应用程序,该应用程序具有完整的用户注册和登录系统,并具有以下功能:

  • 登录和注册页面
  • 密码重置工作流程
  • 根据组成员身份限制访问
  • 能够轻松启用Java库中的其他Stormpath功能(API身份验证,SSO,社交登录等)的功能

在本演示中,我们将使用stormpath-default-spring-boot-starter 。 它的模块化设计在Spring Boot 1.3.0和Spring Security 4.0.3以及Spring Boot WebMVC和Thymeleaf模板引擎中得到了体现。 我将使用Mac,终端应用程序和IntelliJ IDE。

本教程的所有代码都可以在这里找到。

在整个文章中,您可以通过单击Deploy to Heroku按钮来查看示例代码。 您需要做的就是注册一个免费的Heroku帐户。

什么是暴风雨?

Stormpath是一项API服务,允许开发人员创建,编辑和安全地存储
用户帐户和用户帐户数据,并将它们与一个或多个应用程序连接。 我们的API使您能够:

  • 验证和授权用户
  • 存储有关您的用户的数据
  • 执行密码和基于社交的登录
  • 发送密码重置消息
  • 发行基于API的Web应用程序的API密钥
  • 以及更多! 查看我们的产品文档

简而言之:我们使用户帐户管理变得更加轻松,安全和更多
可扩展性比您可能习惯的高。

准备开始了吗? 在此处注册免费的开​​发者帐户。

启动您的Spring Boot项目

有您的Stormpath开发者帐户? 大! 让我们开始吧…

无论你是一个Maven 的Maven或摇篮克里特 ,让您的项目设置是一个单元。

这是一个以pom.xml开头的文件:

<project xmlns="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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.stormpath.sample</groupId><artifactId>stormpath-spring-boot-spring-security-tutorial</artifactId><version>0.1.0</version><name>Spring Boot Spring Security Stormpath Tutorial</name><description>A simple Spring Boot Web MVC application with Spring Security and out-of-the-box login and self-service screens!</description><dependencies><dependency><groupId>com.stormpath.spring</groupId><artifactId>stormpath-default-spring-boot-starter</artifactId><version>1.0.RC6</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>1.3.0.RELEASE</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

而且,这是一个以以下内容开头的build.gradle文件:

buildscript {repositories {mavenCentral()}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.0.RELEASE")}
}apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'spring-boot'group = 'com.stormpath'
version = '0.1.0'repositories {mavenCentral()
}dependencies {compile group: 'com.stormpath.spring', name: 'stormpath-default-spring-boot-starter', version:'1.0.RC6'
}

您可能会注意到,对于Maven和Gradle来说,都存在一个依赖关系: stormpath-default-spring-boot-starter 。 对。 而已。 正如您将在下面看到的那样,一个依赖项立即为您提供了所有的Spring Boot,Spring Security和Stormpath魔术。

收集您的API凭证和应用程序参考

应用程序和Stormpath之间的连接通过“ API密钥对”进行保护。 您将提供这些密钥
到您的Web应用程序,并且在与Stormpath通信时将使用它们。 您可以从管理控制台下载API密钥对。 登录后,您可以从主页下载API密钥对,它将下载apiKey.properties文件-我们稍后将使用它。

在管理控制台中时,您要获取默认Stormpath应用程序的href。 在Stormpath中,Application对象用于将Web应用程序链接到Stormpath中的用户存储。 所有新的开发人员帐户都有一个名为“我的应用程序”的应用程序。 在管理控制台中单击“应用程序”,然后单击“我的应用程序”。 在该页面上,您将看到应用程序的Href。 复制它-我们稍后将需要它。

编写Spring Boot应用程序

该部分的代码可以在代码库的LockedDown标记中找到。

纽扣

我们需要三个小的Java类和一个html模板来启动Webapp的第一个版本。 它们足够小,我会把它们放在这里。 让我们开始吧!

Spring Boot应用程序入口点

所有的Spring Boot应用程序都有一个入口点,其作用与普通的Java程序相同。 它具有main方法和所有内容。

这是Application.java

@SpringBootApplication
public class Application  {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

6行代码(包括@SpringBootApplication批注)拉开了序幕。

Spring安全配置

默认情况下(以及最佳安全实践),Spring Security会锁定整个应用程序。 它将其锁定到甚至无法访问的地步! 尽管这符合最佳安全性实践,但并不是很有用。 另外,我们需要将Spring Security和Stormpath挂钩。 这将我们带到我们的SpringSecurityWebAppConfig.java

@Configuration
public class SpringSecurityWebAppConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.apply(stormpath());}
}

@Configuration注释使Spring Boot将该类实例化为配置。 .apply(stormpath())将所有Stormpath优点(身份验证和授权工作流程)挂接到Spring Security中。

因为configure方法中没有进一步的配置,所以我们仍然会看到将所有内容锁定的默认行为。 但是,我们将看到默认的Stormpath流程,而不是默认的Spring Security身份验证流程。 也就是说,尝试浏览到应用程序中的任何路径将导致重定向到Stormpath login页面。

因此,一个1行的方法调用就可以保证安全!

Spring WebMVC紧密联系在一起

我们上面的安全性配置可确保保护应用程序中的所有路径。

控制器确定请求的路径如何定向以显示哪些模板。

这是我们的HelloController.java

@Controller
public class HelloController {@RequestMapping("/")String home() {return "home";}
}

@Controller注释@Controller Spring Boot这是一个控制器。 我们在第3行/上定义了一个路径。 第5行返回Thymeleaf模板,命名为home

7行代码,我们有模型-视图-控制器(MVC)路由。

带我们

默认情况下,Thymeleaf模板引擎将在类路径中名为templates的文件夹中查找从控制器返回的templates 。 它还将寻找.html的默认扩展名。

因此,当上述控制器返回"home" ,Thymeleaf将在resources/templates/home.html找到模板。

让我们看一下home.html文件:

<html xmlns:th="http://www.thymeleaf.org"><head><!--/*/ <th:block th:include="fragments/head :: head"/> /*/--></head><body><div class="container-fluid"><div class="row"><div class="box col-md-6 col-md-offset-3"><div class="stormpath-header"><img src="http://stormpath.com/images/template/logo-nav.png"/></div><h1 th:inline="text">Hello, [[${account.fullName}]]!</h1><a th:href="@{/logout}" class="btn btn-danger">Logout</a></div></div></div></body>
</html>

第1行为Thymeleaf设置了th名称空间。

第3行看起来像html / xml注释。 但是,这是Thymeleaf接受的指令,以在此模板中包含片段。 该片段位于: resources/templates/fragments/head.html 。 该片段包含所有要挂接到Bootstrap样式中的视图的设置。

第13和14行是操作所在的位置。 由于应用程序中的每条路径均已锁定,因此我们知道进入此页面的唯一方法是登录后。Stormpath的神奇之处在于,一旦登录, account对象就始终在您的视图范围内。 第13行显示已登录用户的全名。 第14行提供了单击后注销的链接。

有关使用Thymeleaf模板的更多信息,请单击此处 。

让我们火起来!

创建一个Stormpath帐户,15行Java代码和19行HTML模板代码(其中3行非常重要),使我们到达了受Spring Security保护并受Stormpath支持的功能齐全的Spring Boot WebMVC应用程序的地步。

如果您以前将apiKey.properties文件存储在标准位置: ~/.stormpath/apiKey.properties并且只有为您创建的默认Stormpath应用程序,则无需其他配置即可启动该应用程序。

这是Maven的方式:

mvn clean package
mvn spring-boot:run

注意:由于存在repackage执行, spring-boot-maven-plugin还会创建一个uber-jar。 您可以通过运行java来行使相同的代码:

mvn clean package
java -jar target/*.jar

这是Gradle的方式:

gradle clean build
java -jar build/libs/*.jar

真? 是吗 对!

您可以浏览到http:// localhost:8080 /并查看其运行情况。

Spring启动弹簧安全基本

如果您将apiKey.properties文件存储在其他位置,或者定义了其他Stormpath应用程序怎么办? 没问题!

还记得您之前保存的Application Href吗? 我们现在将使用它。

这是Maven的方式:

mvn clean package
STORMPATH_API_KEY_FILE=~/.stormpath/apiKey.properties \
STORMPATH_APPLICATION_HREF=https://api.stormpath.com/v1/applications/4YHCurbtcaFC4TKKsd3AYQ \
mvn spring-boot:run

这是Gradle的方式:

gradle clean build
STORMPATH_API_KEY_FILE=~/.stormpath/apiKey.properties \
STORMPATH_APPLICATION_HREF=https://api.stormpath.com/v1/applications/4YHCurbtcaFC4TKKsd3AYQ \
java -jar build/libs/*.jar

通过将STORMPATH_API_KEY_FILESTORMPATH_APPLICATION_HREF环境变量添加到命令行,我们可以轻松地告诉我们的应用程序在哪里可以找到api键以及要使用哪个Stormpath应用程序。

Stormpath Java SDK具有极其灵活的配置机制。 当我们开始限制Stormpath Group成员对您的应用程序的访问时,我们将在下面看到更多内容。

使用Spring Security完善的访问控制

该部分的代码可以在代码库的BasicAccessControl标记中找到。

纽扣

在上一节中,我们创建了一个紧密锁定的应用程序。 每个路径(包括/ )都要求您首先登录。

也许您想要一个可公开访问的主页。 也许您希望网站的某些部分可以被任何经过身份验证的用户访问,而站点的另一部分则只能包含属于特定组的成员。

我们将在本节中探索那些细粒度的控件。

我们将从允许公众访问主页开始。 用户仍然必须进行身份验证才能访问任何其他页面。

Spring安全:门口的保镖

还记得以前的空SpringSecurityWebAppConfig.java吗? 我们现在将添加一些东西:

@Configuration
public class SpringSecurityWebAppConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.apply(stormpath()).and().authorizeRequests().antMatchers("/").permitAll();}
}

Spring Security提供了一个流畅的界面来提供访问规则。

在上面的5-8行中,我们正在建立一个规则集,该规则集关于Spring Security如何允许访问我们的应用程序。

您可以用简单的英语来表示:

Permit anyone to go to the front door
Ensure that they've authenticated for anything else

我们指定的规则优先于锁定所有内容的默认行为。

让我们也更新我们的home.html模板:

<html xmlns:th="http://www.thymeleaf.org"><head><!--/*/ <th:block th:include="fragments/head :: head"/> /*/--></head><body><div class="container-fluid"><div class="row"><div class="box col-md-6 col-md-offset-3"><div class="stormpath-header"><img src="http://stormpath.com/images/template/logo-nav.png"/></div><!--/* displayed if account IS NOT null, indicating that the user IS logged in */--><div th:if="${account}"><h1 th:inline="text">Hello, [[${account.fullName}]]!</h1><a href="/restricted" class="btn btn-primary">Restricted</a><a th:href="@{/logout}" class="btn btn-danger">Logout</a></div><!--/* displayed if account IS null, indicating that the user IS NOT logged in */--><div th:unless="${account}"><h1>Who are you?</h1><a href="/restricted" class="btn btn-primary">Restricted</a></div></div></div></div></body>
</html>

请注意,我们现在有两个不同的部分。 第一个从第13行开始,如果用户已登录,则显示第一个。

如果用户未登录,则显示从第20行开始的第二部分。

这是正在运行的Thymeleaf模板。 它提供了非常强大的控件,可有条件地显示模板的各个部分。

在进行任何其他更改之前,让我们在这里暂停并像以前一样启动应用程序。

当浏览到http:// localhost:8080时 ,您将看到home模板的未经身份验证的版本。

受限制的

单击“ Restricted按钮,您将按预期重定向到login表单。 验证之后,您将进入404页面,因为我们尚未定义受限页面。

让我们对其进行设置以完成本节。

定义受限页面就像在我们的控制器中添加路线并创建要显示的模板一样容易。 这是更新的HelloController.java

@Controller
public class HelloController {@RequestMapping("/")String home() {return "home";}@RequestMapping("/restricted")String restricted() {return "restricted";}
}

并且,这是一个新的restricted.html模板:

<html xmlns:th="http://www.thymeleaf.org"><head><!--/*/ <th:block th:include="fragments/head :: head"/> /*/--></head><body><div class="container-fluid"><div class="row"><div class="box col-md-6 col-md-offset-3"><div class="stormpath-header"><img src="http://stormpath.com/images/template/logo-nav.png"/></div><h1 th:inline="text">[[${account.fullName}]], You are allowed here.</h1><a href="/" class="btn btn-primary">Go Home</a></div></div></div></body>
</html>

注意我们如何重新使用head片段为该模板提供Bootstrap样式。

再次重新启动该应用程序,您将获得完整的体验。 记下主页如何更改,具体取决于您是否登录。

半限制

通过组成员身份进行Spring Security访问控制

该部分的代码可以在代码存储库的GroupAccessControl标记中找到。

纽扣

Spring Security提供了一组注释和一种丰富的表达语言,用于控制对应用程序中方法的访问。 @PreAuthorize是最常用的Spring Security批注。 并且,最常用的SpringEL表达式包括hasRole

Stormpath集成了将Stormpath组连接到Spring Security角色的机制。

让我们看一下代码,然后将其分解。 我们将添加一项新服务,以限制组成员身份的访问。 这是AdminService

@Service
public class AdminService {@PreAuthorize("hasRole(@roles.ADMIN)")public boolean ensureAdmin() {return true;}
}

上面的第3行是关键。 注释和SpringEL表达式可以用简单的英语表示为:

Before this method is even entered,
check to see that user is authenticated and
is a member of the ADMIN group

check to see that user is authenticatedcheck to see that user is authenticated可能并不明显。 发生的是, @PreAuthorize检查只能在经过身份验证的用户上执行。 Spring Security非常聪明,可以在检查用户是否是指定组的成员之前检查用户是否已登录。

让我们深入探讨上面的Spring Expression Language。 Spring Security在哪里寻找@roles.ADMIN@符号是特殊的–它标识Java Bean。 在这种情况下,一个名为roles的bean。 我们希望在该bean内定义一个名为ADMIN的常量。

最终, hasRole需要检查代表Stormpath Group的唯一Href。 因此,我们的ADMIN常数必须是一个Java String ,该String将Href保留到用于管理员的Stormpath组中。

为了完成此配置并使它具有Roles.java动态性,我们需要一个名为Roles.java的新类:

@Component
public class Roles {public final String ADMIN;@Autowiredpublic Roles(Environment env) {ADMIN = env.getProperty("stormpath.authorized.group.admin");}
}

这9条线是如此强大,我在这里一览无余! 让我们深入。

通过在第1行用@Component注释此类,Spring将实例化它并将其公开为bean。 猜猜豆子的名字是什么? Spring将采用该类的名称,并以驼峰式大小写以默认情况下派生Bean名称。 因此,bean的名称是roles 。 甜!

第5行的@Autowired注释使Spring Environment对象传递到构造函数中。 在构造函数内部,由于ADMIN已被声明为final ,因此我们唯一的机会是对其进行设置-要求能够在hasRoles子句中使用它。

难题的最后一部分利用了一些Stormpath配置魔术。 请注意,我们正在将ADMIN的值设置为名为stormpath.authorized.group.admin的环境属性。 这是标准的Spring。 如果您的application.properties文件中有一个具有该名称的属性,那么它将在Spring Environment中可用。

Stormpath增加了将其设置为系统环境变量的能力,从而无需在应用程序中的任何位置硬编码该值(在这种情况下为Stormpath Group Href)。

通常,系统环境变量全部为大写字母,单词之间用下划线分隔。 Stormpath Java SDK自动将这些系统变量转换为小写的点分表示法。

挖这个:

STORMPATH_AUTHORIZED_GROUP_ADMIN=https://api.stormpath.com/v1/groups/1wcsYMUZhzytUH5GmdaFXC \
java -jar build/libs/spring-boot-spring-security-tutorial-0.1.0.jar

在后台,Stormpath会将STORMPATH_AUTHORIZED_GROUP_ADMIN系统环境变量转换为stormpath.authorized.group.admin环境变量。 这将被我们上面的代码处理。

! 谁想到只需几行代码就能实现这种魔力!

现在,我们需要将AdminService到我们的控制器。 这是我们更新的HelloController.java的相关部分:

@Controller
public class HelloController {@AutowiredAdminService adminService;...@RequestMapping("/admin")String admin() {adminService.ensureAdmin();return "admin";}
}

在第4行和第5行自动连接AdminService 。请注意,在第11行,我们正在调用adminService.ensureAdmin方法。 如果已登录的用户ADMIN组中,则将生成403 (禁止)响应。

最后的代码整理工作是创建一个admin.html模板。 在与该帖子相关的代码中,有一个简单的admin.html模板,该模板显示了格式正确的消息,确认您确实是管理员。

现在,要查看实际效果,您需要在管理控制台中进行一些Stormpath内务处理。

步骤如下:

  • 创建一个新的应用程序

创建应用

  • 为应用程序创建一个名为“ admin”的新组

创建组

创建组2

    • 在管理组中创建一个新帐户

在组中创建帐户

在组2中创建帐户

在第3组中创建帐户

  • 不在管理员组中创建一个新帐户

创建帐号

创建帐户2

在与此帖子相关的代码中,我还包括了一个方便的错误页面,因此,如果您不在admin组中,那么您将获得格式正确的页面,而不是默认的403页面。

让我们来看看它的作用。 我们将像以前一样启动该应用程序,只是这一次我们将对在上一步中创建的新应用程序和组使用在管理控制台中找到的Href。

这是Maven的方式:

mvn clean package
STORMPATH_API_KEY_FILE=~/.stormpath/apiKey.properties \
STORMPATH_APPLICATION_HREF=https://api.stormpath.com/v1/applications/4YHCurbtcaFC4TKKsd3AYQ \
STORMPATH_AUTHORIZED_GROUP_ADMIN=https://api.stormpath.com/v1/groups/1wcsYMUZhzytUH5GmdaFXC \
mvn spring-boot:run

这是Gradle的方式:

gradle clean build
STORMPATH_API_KEY_FILE=~/.stormpath/apiKey.properties \
STORMPATH_APPLICATION_HREF=https://api.stormpath.com/v1/applications/4YHCurbtcaFC4TKKsd3AYQ \
STORMPATH_AUTHORIZED_GROUP_ADMIN=https://api.stormpath.com/v1/groups/1wcsYMUZhzytUH5GmdaFXC \
java -jar build/libs/spring-boot-spring-security-tutorial-0.1.0.jar

浏览到/admin页面。

如果您以在Stormpath admin组(在我的情况下为micah+admin@stormpath.com)中创建的用户身份登录,则可以访问管理页面。 如果您以创建的用户身份登录,而该用户不在Stormpath admin组中(在我的情况下为micah+user@stormpath.com),则将显示禁止页面。

无论您以谁身份登录,都可以像我们之前设置的那样访问/restricted页面。

半限制

包起来

好吧,我们在这里涵盖了很多领域,不是吗!

我们看到了如何保护单个页面以及如何基于组中的成员资格来保护方法。

我们看到了如何在你的类,它扩展应用 Stormpath WebSecurityConfigurerAdapter定义不同的路径访问控制,以及利用Spring安全的@PreAuthorize注释控制的更细的晶粒。

我们看到了Stormpath Java SDK管理环境配置属性以为您的应用程序提供高度灵活性而无需进行任何硬编码的几乎神奇的方式。

Java SDK和Spring Boot集成中还有许多功能。 在此处查看深入的教程。

随时随地提供支持或亲自给我 。

建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现。 注册 ,再也不会建立auth了!

翻译自: https://www.javacodegeeks.com/2016/06/simple-web-app-spring-boot-spring-security-stormpath-15-minutes.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javafx2_JavaFX 2 GameTutorial第5部分

javafx2介绍 这是与JavaFX 2 Game Tutorial相关的六部分系列的第五部分。 我知道自从我写关于游戏的博客以来已经有很长时间了&#xff0c;但希望您仍然与我在一起。 如果您想回顾一下&#xff0c;请阅读第1部分 &#xff0c; 第2 部分 &#xff0c; 第3 部分和第4 部分 &#…

史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)(Finchley版本)

转载请标明出处&#xff1a; 原文首发于&#xff1a;https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f2-ribbon/ 本文出自方志朋的博客 在上一篇文章&#xff0c;讲了服务的注册和发现。在微服务架构中&#xff0c;业务都会被拆分成一个独立的服务&#xff0c;服务与服…

忽略已检查的异常,所有出色的开发人员都在这样做–基于600,000个Java项目

Github和Sourceforge上超过600,000个Java项目中的异常处理概述 Java是使用检查异常的少数语言之一。 它们在编译时强制执行&#xff0c;并且需要某种处理。 但是……实践中会发生什么&#xff1f; 大多数开发人员实际上处理任何事情吗&#xff1f; 以及他们如何做到的&#xf…

使用Boxfuse轻松在云中运行Spring Boot应用程序

几天前&#xff0c;我开始构建一个将使用REST API检索和存储数据的iOS应用。 该REST API将是我也必须构建的服务器应用程序。 由于我熟悉Java和Spring &#xff0c;因此决定使用Spring Boot作为框架。 为了能够在我的iPhone上使用它&#xff0c;如果我可以在服务器而不是我自己…

numpy的使用数组的创建2

随机创建了长度为十的数组 获得十以类的随机整数 快速获取数组2乘3维的数组 生成20个1到10之间的数组 通过reshape 将这些数变成二位数组 shape这个方法可以查看数组中的元素是几行几列的 转载于:https://www.cnblogs.com/chenligeng/p/9315339.html

Tabs vs Spaces:如何在Google,Twitter,Mozilla和Pied Piper上编写Java

流行的Java代码样式中最有趣的亮点是什么&#xff1f; 尽管上面有暗示性的形象&#xff0c;我们也不想发动任何不必要的圣战。 当归结为编码样式时&#xff0c;大多数选择都是相当随意的&#xff0c;并取决于个人喜好。 是的&#xff0c;即使在编辑器之间制表符宽度改变了&…

ES group分组聚合的坑

参考链接&#xff1a;https://blog.csdn.net/u010454030/article/details/71762838 ES group分组聚合的坑 原来知道Elasticsearch在分组聚合时有一些坑但没有细究&#xff0c;今天又看了遍顺便做个笔记和大家分享一下。 我们都知道Elasticsearch是一个分布式的搜索引擎&#xf…

字典树 ZOJ1109 HDU1251 PKU1204 HDU1075

又称单词查找树&#xff0c;Trie树&#xff0c;是一种树形结构&#xff0c;是一种哈希树的变种。典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串&#xff09;&#xff0c;所以经常被搜索引擎系统用于文本词频统计。它的优点是&#xff1a;…

Codeforces Round #498 (Div. 3) F. Xor-Paths

题目链接&#xff1a;F. Xor-Paths 题解&#xff1a;从起点和终点双向搜索在中间相遇时更新答案 1 #include<bits/stdc.h>2 #include<set>3 #include<cstdio>4 #include<iomanip>5 #include<iostream>6 #include<string>7 #include<cst…

创建健壮的微服务架构所涉及的组件

在本文中&#xff0c;我们将简要学习构建强大的微服务应用程序所需的各种软件组件。 在简要了解每个架构组件之前&#xff0c;我们将陈述设计微服务架构时出现的一般查询。 1.微服务架构组件 每当我们创建微服务应用程序时&#xff0c;我们都会想到以下问题 我们将如何注册微…

MATLAB画图命令zz

一、散点图 1&#xff0e;1&#xff0e;命令 plot 功能 线性二维图。在线条多于一条时&#xff0c;若用户没有指定使用颜色&#xff0c;则plot循环使用由当前坐标轴颜色顺序属性&#xff08;current axes ColorOrder property&#xff09;定义的颜色&#xff0c;以区别不同的…

jax-rs jax-ws_JAX-WS入门

jax-rs jax-wsJAX-WS代表XML Web Services的Java API。 它是一种Java编程语言API&#xff0c;用于创建Web服务和使用XML进行通信的客户端。 这篇文章是JAX-WS的快速入门。 先决条件 GlassFish与Eclipse集成在一起 。 创建JAX-WS Web服务 1.在Eclipse中创建一个名为“ com.e…

lingo解题报告内容解释

1.2菜单介绍 1.2.1 File 1 New 新建一个窗口,当你执行这个命令时,会出现如下对话框: 你可以在对话框中选择你想要建立的类型.类型如下: 1)扩展名为(*.lg4) LG4格式是LINGO4.0的版本,是在Windows下最主要的储存文件格式,这种格式支持字体格式,自定义格式以及动态连接, LG4以二进…

OpenShift上的无痛集装箱化JBoss通用贷款处理

我们从头到尾讨论了各个层次&#xff0c;但尚未为您提供除Red Hat之外的任何应用程序开发工具。我们一直在讨论为什么应用程序开发人员在App Dev Cloud Stack系列中不能再忽略其堆栈了。 容器开发套件&#xff08;CDK&#xff09; 。 到目前为止&#xff0c;您所拥有的只是一个…

多任务编程—多进程

什么是多任务编程&#xff1f; 多任务编程其实和计算机系统内核有关&#xff0c;通过程利用多个计算机内核同时执行程序&#xff0c;以此来提升程序执行的效率。 多任务编程其中包括&#xff0c;多进程、多线程和多协程&#xff0c;这三种多任务编程各有各的优点和缺点&#xf…

java锁实现_Java锁实现

java锁实现我们都将第三方库用作开发的正常部分。 通常&#xff0c;我们无法控制其内部。 JDK随附的库是一个典型示例。 这些库中的许多库都使用锁来管理争用。 JDK锁具有两种实现。 一个使用原子CAS样式指令来管理索赔过程。 CAS指令往往是最昂贵的CPU指令类型&#xff0c;并且…

洛谷 P1027 Car的旅行路线

P1027 Car的旅行路线 题目描述 又到暑假了&#xff0c;住在城市 AA 的 CarCar 想和朋友一起去城市 BB 旅游。她知道每个城市都有 44 个飞机场&#xff0c;分别位于一个矩形的 44 个顶点上&#xff0c;同一个城市中 22 个机场之间有 11 条笔直的高速铁路&#xff0c;第 II 个城市…

API

api 百科名片 API&#xff08;Application Programming Interface,应用程序编程接口&#xff09;是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。目…

jsf标签p:ajax_JSF简单Ajax示例

jsf标签<p:ajax>今天&#xff0c;我们将看到一些使用JSF的Ajax简单样本。 如果要查看有关JSF / Web应用程序的其他文章&#xff0c;请单击以下链接&#xff1a; 重定向后的JSF持久化对象和消息 &#xff0c; 使用JAAS和JSF进行用户登录验证 &#xff0c; JSF&#xff1a;…

BIOS维修技术

BIOS是电脑中最基础且最重要的程序&#xff0c;为电脑提供最低级且最直接的硬件控制&#xff0c;电脑的原始操作都是依照固化在BIOS里的程序来完成的。因此如果BIOS出现故障将会导致影响电脑的正常工作。BIOS故障有很多&#xff0c;根据常见的BIOS故障现象及其产生的原因&#…