一个具有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,一经查实,立即删除!

相关文章

Matlab各种分布的函数

正态分布&#xff1a;norm二项分布&#xff1a;bino卡方分布&#xff1a;chi2指数分布&#xff1a;exp柏松分布&#xff1a;poiss随机数&#xff1a;rnd密度函数&#xff1a;pdf累积概率&#xff1a;cdf逆累积分布&#xff1a;icdf&#xff0c;inv参数估计&#xff1a;fit对应组…

Python的配置文件模块yaml的使用

转自&#xff1a;君惜丶 简述 和GNU一样&#xff0c;YAML是一个递归着说“不”的名字。不同的是&#xff0c;GNU对UNIX说不&#xff0c;YAML说不的对象是XML。 YAML不是XML。 为什么不是XML呢&#xff1f;因为&#xff1a; YAML的可读性好。YAML和脚本语言的交互性好。YAML使用…

Matlab各种排序函数

sortsortrows 把整行的数据看作一个整体&#xff0c;对数据进行排序issorted, 判断是否已经排序了

位运算实例(一):判断奇偶性

同样一个问题&#xff0c;位运算可以提高程序的运行效率。 下面讲一下关于奇偶性的判断。 常规方法 public static boolean isOdd(int i){ return i % 2 ! 0; } 位运算方法 public static boolean isOdd(int i){ return (i & 1) ! 0; } 说明&#xff1a; 我们知道计算机中的…

Spring Security原理与应用

Spring Security是什么 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean&#xff08;注&#xff1a;包括认证与权限获取、配置、处理相关实例&#xff09;&#xff0c;充分利…

javafx2_JavaFX 2 GameTutorial第5部分

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

Matlab各种最值问题

最大最小maxmin求多个最小值,并返回其位置[B,ind] sort(A);B(1:n);前n个最小值ind(1:n);前n个最小值的位置

最长递增子序列问题的求解

最长递增子序列问题是一个很基本、较常见的小问题&#xff0c;但这个问题的求解方法却并不那么显而易见&#xff0c;需要较深入的思考和较好的算法素养才能得出良好的算法。由于这个问题能运用学过的基本的算法分析和设计的方法与思想&#xff0c;能够锻炼设计较复杂算法的思维…

史上最简单的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…

Matlab积分

yint(fx,x,a,b);%函数表达式&#xff0c;自变量&#xff0c;下限&#xff0c;上限注&#xff1a;求得到y为sym类型&#xff0c;不是数值&#xff0c;可以使用subs转换如&#xff1a;subs(y,1); subs(y,a,1);%第一个给y赋1&#xff0c;第二个给y中的a赋1

最长有序子序列—动态规划算法

动态规划使用范围&#xff1a;&#xff08;http://baike.baidu.com/view/28146.htm&#xff09; 任何思想方法都有一定的局限性&#xff0c;超出了特定条件&#xff0c;它就失去了作用。同样&#xff0c;动态规划也并不是万能的。适用动态规划的问题必须满足最优化原理和无后效…

Codeforces 666E. Forensic Examination

Description 给出串 \(S\) ,和 \(m\) 个串 \(T_i\) ,每次询问 \((l,r,pl,pr)\) 表示 \(S[pl...pr]\) 在 \(T[l...r]\) 中哪一个出现次数最多,求出现次数和编号题面 Solution 基础题... 对于 \(S,T[l...r]\) 放在一起建广义后缀自动机 然后每次倍增到 S[pl,pr] ,然后查询子树内出…

Matlab控制精度

控制精度matlab控制运算精度用的是digits和vpa这两个函数digits用于规定运算精度&#xff0c;比如&#xff1a;digits(20);这个语句就规定了运算精度是20位有效数字。但并不是规定了就可以使用&#xff0c;因为实际编程中&#xff0c;我们可能有些运算需要控制精度&#xff0c;…

虚拟机环境下DPDK运行时的一些错误解决

在绑定网卡到DPDK模块时 报错 &#xff1a;is active. Not modifyingRouting table indicates that interface 0000:02:01.0 is active. Not modifying 解决方法&#xff1a; ifconfig <网卡名称> down 运行testpmd时无法分配内存&#xff1a;EAL: Error - exiting with …

ACM 网址和一些建议

USACO http://ace.delos.com/usacogate 美国著名在线题库&#xff0c;专门为信息学竞赛选手准备 TJU http://acm.tongji.edu.cn/ 同济大学在线题库&#xff0c;唯一的中文题库&#xff0c;适合NOIP选手 ZJU http://acm.zju.edu.cn/ 浙江大学在线题库 JLU http://acm.jlu…

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

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

Matlab各种求和

%普通求和sum(x);sum(x,1);sum(x,2); %累加求和cumsum(x);cumsum(x,1);cumsun(x,2); %累加求和的结果可以用diff实现逆运算

JavaScript内置对象Date----格式化时间

格式化时间日期: function getDate(dt) { //获取年份 var year dt.getFullYear(); //获取月份 var month dt.getMonth(); //获取日 var day dt.getDate(); //获取小时 var hour dt.getHours(); //获取分钟 var minute dt.getMinutes(); …

Matlab求欧式距离

pdist(x,‘euclidean’)1. %该函数还可以求其他距离&#xff0c;详见help2. %该函数得到的是一个向量&#xff0c;可以用squareform(Y)函数转换为对称矩阵形式。