带有Spring Security的OAuth 2.0快速指南

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。

在构建Web应用程序时,必须进行身份验证和授权。 然而,正确地做起来并不容易。 计算机安全是真正的专业。 众多开发人员昼夜不停地与众多国际黑客进行对抗,从而创建了一个持续的开发周期,以发现漏洞,进行攻击并加以修复。 跟上所有这些独奏会很痛苦(如果不是不可能的话)。

幸运的是,没有必要。 Spring Security和Spring Boot使使用OAuth 2.0实施Web应用程序变得非常简单。 Okta是一种软件即服务的身份访问提供商,它在Spring Boot的基础上构建,以使该过程更加容易。

在本教程中,您将首先使用Spring Boot和Spring Security构建OAuth 2.0 Web应用程序和身份验证服务器。 之后,您将使用Okta摆脱自我托管的身份验证服务器,并进一步简化Spring Boot应用程序。

让我们开始吧!

创建一个OAuth 2.0服务器

首先转到Spring Initializr并使用以下设置创建一个新项目:

  • 将项目类型从Maven更改为Gradle
  • 将组更改为com.okta.spring
  • 将工件更改为AuthorizationServerApplication
  • 添加一个依赖项: Web
Spring安全

下载项目并将其复制到硬盘上有意义的位置。 在本教程中,您将创建三个不同的项目,因此您可能需要创建一个父目录,例如SpringBootOAuth

您需要向build.gradle文件添加一个依赖build.gradle

implementation 'org.springframework.security.oauth:spring-security-oauth2:2.3.3.RELEASE'

这增加了Spring的OAuth优势。

更新src/main/resources/application.properties以使其匹配:

server.port=8081
server.servlet.context-path=/auth
user.oauth.clientId=R2dpxQ3vPrtfgF72
user.oauth.clientSecret=fDw7Mpkk5czHNuSRtmhGmAGL42CaxQB9
user.oauth.redirectUris=http://localhost:8082/login/oauth2/code/
user.oauth.user.username=Andrew
user.oauth.user.password=abcd

这将设置服务器端口,servlet上下文路径以及服务器将返回给客户端的内存中临时生成的令牌以及我们用户的用户名和密码的一些默认值。 在生产中,对于真正的身份验证服务器,您将需要更多的复杂后端,而没有硬编码的重定向URI,用户名和密码。

更新AuthorizationServerApplication类以添加@EnableResourceServer

package com.okta.spring.AuthorizationServerApplication;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;@SpringBootApplication
@EnableResourceServer
public class AuthorizationServerApplication {public static void main(String[] args) {SpringApplication.run(AuthorizationServerApplication.class, args);}
}

在与src/main/java下的应用程序类com.okta.spring.AuthorizationServerApplication相同的包中创建一个新的AuthServerConfig类(从现在开始,请在src/main/java/com/okta/spring/AuthorizationServerApplication创建Java类)。 此Spring配置类启用并配置OAuth授权服务器。

package com.okta.spring.AuthorizationServerApplication;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;@Configuration
@EnableAuthorizationServer
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {@Value("${user.oauth.clientId}")private String ClientID;@Value("${user.oauth.clientSecret}")private String ClientSecret;@Value("${user.oauth.redirectUris}")private String RedirectURLs;private final PasswordEncoder passwordEncoder;public AuthServerConfig(PasswordEncoder passwordEncoder) {this.passwordEncoder = passwordEncoder;}@Overridepublic void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");}@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {clients.inMemory().withClient(ClientID).secret(passwordEncoder.encode(ClientSecret)).authorizedGrantTypes("authorization_code").scopes("user_info").autoApprove(true).redirectUris(RedirectURLs);}
}

AuthServerConfig类是在客户端正确进行身份验证时将创建并返回JSON Web令牌的类。

创建一个SecurityConfiguration类:

package com.okta.spring.AuthorizationServerApplication;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;@Configuration
@Order(1)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Value("${user.oauth.user.username}")private String username;@Value("${user.oauth.user.password}")private String password;@Overrideprotected void configure(HttpSecurity http) throws Exception {http.requestMatchers().antMatchers("/login", "/oauth/authorize").and().authorizeRequests().anyRequest().authenticated().and().formLogin().permitAll();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser(username).password(passwordEncoder().encode(password)).roles("USER");}@Beanpublic BCryptPasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}

SecurityConfiguration类是实际验证对授权服务器的请求的类。 注意顶部附近是从application.properties文件中提取用户名和密码的地方。

最后,创建一个名为UserController的Java类:

package com.okta.spring.AuthorizationServerApplication;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.security.Principal;@RestController
public class UserController {@GetMapping("/user/me")public Principal user(Principal principal) {return principal;}
}

此文件允许客户端应用程序查找有关通过服务器进行身份验证的用户的更多信息。

那就是你的资源服务器! 还不错 Spring Boot使其非常容易。 四个文件和一些属性。 稍后,您将使用Okta使其变得更加简单,但是目前,继续创建可用于测试身份验证服务器的客户端应用程序。

启动授权服务器:

./gradlew bootRun

等待它完成运行。 终端应该以这样的结尾:

...
2019-02-23 19:06:49.122  INFO 54333 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8081 (http) with context path '/auth  '
2019-02-23 19:06:49.128  INFO 54333 --- [           main] c.o.s.A.AuthorizationServerApplication   : Started AuthorizationServerApplication in 3.502 seconds (JVM running for 3.945)

注意:如果收到有关JAXB的错误( java.lang.ClassNotFoundException: javax.xml.bind.JAXBException ),那是因为您正在使用build.gradle 。要解决此问题,请将JAXB添加到build.gradle

implementation 'org.glassfish.jaxb:jaxb-runtime'

构建您的客户端应用

回到Spring Initializr 。 使用以下设置创建一个新项目:

  • 项目类型应为Gradle (不是Maven)。
  • 组: com.okta.spring
  • 工件: SpringBootOAuthClient
  • 添加三个依赖项: WebThymeleafOAuth2 Client
Spring安全

下载项目,将其复制到最终的放置位置,然后解压缩它。

这次您需要将以下依赖项添加到build.gradle文件中:

implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.0.4.RELEASE'

src/main/resources/application.properties重命名为application.yml并更新它以匹配以下YAML:

server:port: 8082session:cookie:name: UISESSION
spring:thymeleaf:cache: falsesecurity:oauth2:client:registration:custom-client:client-id: R2dpxQ3vPrtfgF72client-secret: fDw7Mpkk5czHNuSRtmhGmAGL42CaxQB9client-name: Auth Serverscope: user_infoprovider: custom-providerredirect-uri-template: http://localhost:8082/login/oauth2/code/client-authentication-method: basicauthorization-grant-type: authorization_codeprovider:custom-provider:token-uri: http://localhost:8081/auth/oauth/tokenauthorization-uri: http://localhost:8081/auth/oauth/authorizeuser-info-uri: http://localhost:8081/auth/user/meuser-name-attribute: name

请注意,这里您正在配置clientIdclientSecret以及身份验证服务器的各种URI。 这些需要匹配另一个项目中的值。

更新SpringBootOAuthClientApplication类以匹配:

package com.okta.spring.SpringBootOAuthClient;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringBootOAuthClientApplication {public static void main(String[] args) {SpringApplication.run(SpringBootOAuthClientApplication.class, args);}
}

创建一个名为WebController的新Java类:

package com.okta.spring.SpringBootOAuthClient;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;import java.security.Principal;@Controller
public class WebController {@RequestMapping("/securedPage")public String securedPage(Model model, Principal principal) {return "securedPage";}@RequestMapping("/")public String index(Model model, Principal principal) {return "index";}
}

这是将传入请求映射到Thymeleaf模板文件(您将在几秒钟内完成)的控制器。

创建另一个名为SecurityConfiguration Java类:

package com.okta.spring.SpringBootOAuthClient;import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.antMatcher("/**").authorizeRequests().antMatchers("/", "/login**").permitAll().anyRequest().authenticated().and().oauth2Login();}
}

此类为您的应用程序定义了Spring Security配置:允许本地路径上的所有请求并要求对所有其他路由进行身份验证。 它还设置了Spring Boot OAuth登录流程。

您需要添加的最后一个文件是两个Thymeleaf模板文件。 全面了解Thymeleaf模板超出了本教程的范围,但是您可以在其网站上查看更多信息。

模板位于src/main/resources/templates目录中。 您会在上面的控制器中注意到,它们只是返回路线的字符串。 当Thymeleaf依赖项包含在构建中时,Spring Boot会自动假定您正在从控制器中返回模板文件的名称,因此该应用程序将在src/main/resources/templates查找带有返回字符串加号的文件名。 .html

创建主页模板: src/main/resources/templates/index.html

<!DOCTYPE html>  
<html lang="en">  
<head>  <meta charset="UTF-8">  <title>Home</title>  
</head>  
<body>  <h1>Spring Security SSO</h1>  <a href="securedPage">Login</a>  
</body>  
</html>

以及受保护的模板: src/main/resources/templates/securedPage.html

<!DOCTYPE html>  
<html xmlns:th="http://www.thymeleaf.org">  
<head>  <meta charset="UTF-8">  <title>Secured Page</title>  
</head>  
<body>  <h1>Secured Page</h1>  <span th:text="${#authentication.name}"></span>  
</body>  
</html>

我只想指出这一行:

<span th:text="${#authentication.name}"></span>

这行将插入已验证用户的名称。 这行是为什么在build.gradle文件中需要org.thymeleaf.extras:thymeleaf-extras-springsecurity5依赖项的build.gradle

启动客户端应用程序:

./gradlew bootRun

等待它完成。 终端应该以这样的结尾:

...
2019-02-23 19:29:04.448  INFO 54893 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8082 (http) with context path ''
2019-02-23 19:29:04.453  INFO 54893 --- [           main] c.o.s.S.SpringBootOAuthClientApplication : Started SpringBootOAuthClientApplication in 3.911 seconds (JVM running for 4.403)

测试资源服务器

在您选择的浏览器中导航至http://localhost:8082/客户端应用程序。

单击登录链接。

您将被定向到登录页面:

Spring安全

输入用户名Andrew和密码abcd (来自身份验证服务器的application.properties文件)。

单击“ 登录” ,您将进入超级精美的securePage.html模板,其中应显示“ Secured Page”和“ Andrew”。

大! 有用。 现在,您将使其变得更加简单。

您可以停止服务器和客户端Spring Boot应用程序。

创建一个OpenID Connect应用程序

Okta是SaaS(软件即服务)身份验证和授权提供者。 我们为开发人员提供免费帐户,以便他们可以轻松开发OIDC应用程序。 前往developer.okta.com并注册一个帐户。 验证电子邮件后,登录并执行以下步骤:

  • 转到应用程序 > 添加应用程序
  • 选择应用程序类型Web ,然后单击下一步
  • 为应用命名。 我将其命名为“ Spring Boot OAuth”。
  • 登录重定向URI下, 值更改为http://localhost:8080/login/oauth2/code/okta 。 其余的默认值将起作用。
  • 单击完成

让页面保持打开状态,注意客户端ID客户端密钥 。 稍后您将需要它们。

创建一个新的Spring Boot App

再回到Spring Initializr 。 使用以下设置创建一个新项目:

  • 将项目类型从Maven更改为Gradle
  • 将组更改为com.okta.spring
  • 将工件更改为OktaOAuthClient
  • 添加三个依赖项: WebThymeleafOkta
  • 单击生成项目
Spring安全

复制项目并将其解压缩到某个地方。

build.gradle文件中,添加以下依赖项:

implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.0.4.RELEASE'

另外,在您到那里时,请注意com.okta.spring:okta-spring-boot-starter:1.1.0依赖com.okta.spring:okta-spring-boot-starter:1.1.0 。 这是Okta Spring Boot Starter。 这是一个方便的项目,可以轻松轻松地将Okta与Spring Boot集成。 有关更多信息,请查看项目的GitHub 。

src/main/resources/application.properties更改为application.yml并添加以下内容:

server:port: 8080
okta:oauth2:issuer: https://{yourOktaDomain}/oauth2/defaultclient-id: {yourClientId}client-secret: {yourClientSecret}
spring:thymeleaf:cache: false

请记住,当我说您需要上面的ClientIDClient Secret时 。 好,时间到了。 您需要将它们以及Okta发行者URL填充到文件中。 它看起来像这样: dev-123456.okta.com 。 您可以在API > 授权服务器下找到它。

src/main/resources/templates目录中,您还需要两个类似的模板文件。 index.html模板文件完全相同,并且可以根据需要复制。 由于您从Okta返回身份验证信息的方式与您之前构建的简单身份验证服务器相比, securedPage.html模板文件略有不同。

创建主页模板: src/main/resources/templates/index.html

<!DOCTYPE html>  
<html lang="en">  
<head>  <meta charset="UTF-8">  <title>Home</title>  
</head>  
<body>  <h1>Spring Security SSO</h1>  <a href="securedPage">Login</a>  
</body>  
</html>

以及受保护的模板: src/main/resources/templates/securedPage.html

<!DOCTYPE html>  
<html xmlns:th="http://www.thymeleaf.org">  
<head>  <meta charset="UTF-8">  <title>Secured Page</title>  
</head>  
<body>  <h1>Secured Page</h1>  <span th:text="${#authentication.principal.attributes.name}">Joe Coder</span>  
</body>  
</html>

com.okta.spring.SpringBootOAuth包中创建一个名为WebController的Java类:

package com.okta.spring.OktaOAuthClient;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;import java.security.Principal;@Controller
public class WebController {@RequestMapping("/securedPage")public String securedPage(Model model, Principal principal) {return "securedPage";}@RequestMapping("/")public String index(Model model, Principal principal) {return "index";}
}

该类仅创建两个路由,一个用于本地路由,一个用于安全路由。 同样,Spring Boot和Thymeleaf会将其自动修改为src/main/resources/templates的两个模板文件。

最后,创建另一个Java类,名称为SecurityConfiguration

package com.okta.spring.OktaOAuthClient;import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.antMatcher("/**").authorizeRequests().antMatchers("/").permitAll().anyRequest().authenticated().and().oauth2Login();}
}

而已! am!

运行由Okta-OAuth支持的客户端:

./gradlew bootRun

您应该看到一堆以结尾的输出:

...
2019-02-23 20:09:03.465  INFO 55890 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-02-23 20:09:03.470  INFO 55890 --- [           main] c.o.s.O.OktaOAuthClientApplication       : Started OktaOAuthClientApplication in 3.285 seconds (JVM running for 3.744)

导航到http:// localhost:8080 。

单击登录按钮。

这次,您将被带到Okta登录页面。 您可能需要使用隐身浏览器或在此处注销developer.okta.com仪表板,以免跳过登录页面并立即定向到安全端点。

Spring安全

登录,您将看到带有您的姓名的安全页面!

了解有关Spring Boot,Spring Security和OAuth 2.0的更多信息

就是这样。 超级容易。 在上一教程中,您研究了如何使用Spring Boot和Spring Security来实现非常基本的身份验证服务器和客户端应用程序。 接下来,您使用Okta使用功能齐全的SSO和OAuth身份验证制作一个更简单的客户端应用程序。

您可以在oktadeveloper / okta-spring-boot-authz-server-example上的GitHub上查看本教程的完整代码。

如果您想了解有关Spring Boot,OAuth 2.0和Spring Security的更多信息,请查看以下有用的教程:

  • Spring Boot,OAuth 2.0和Okta入门
  • OAuth到底是什么?
  • Spring Security 5.0和OIDC入门
  • 身份,声明和令牌– OpenID Connect入门,第1部分,共3部分
  • 使用Spring Boot和GraphQL构建安全的API

如果您对此帖子有任何疑问,请在下面添加评论。 有关更多精彩内容, 请在Twitter上关注@oktadev ,或订阅我们的YouTube频道 !

“具有Spring Security的OAuth 2.0快速指南”最初于2019年3月发布在Okta开发者博客上。

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。

翻译自: https://www.javacodegeeks.com/2019/03/quick-guide-oauth-spring-security.html

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

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

相关文章

工业以太网交换机在实际应用中的优势

相信大家对交换机应该都不陌生&#xff0c;交换机可以说应用于网络通信的各个方面&#xff0c;它极大的帮助我们提高了工作效率&#xff1b;但是一般我们会分为工业交换机和普通交换机&#xff0c;在实际应用当中&#xff0c;不同的环境和场合我们还是要有所区分的&#xff0c;…

带有Oracle Digital Assistant和Fn Project的会话式UI。 第三部分,迁移到云

在本文中&#xff0c;我将继续讲述在Oracle Digital Assistant和Oracle Digital Assistant的 基础上为FlexDeploy实现对话式UI的故事。 Fn项目 。 今天&#xff0c;我将围绕聊天机器人工作的无服务器API移到云中&#xff0c;因此整个解决方案都在云中工作&#xff1a; 该API是…

8口网管型工业以太网交换机产品性能介绍

8端口以太网交换机因其端口数量、价格都比较适中&#xff0c;所以是比较常见的一款产品。杭州飞畅科技为满足不同客户的需要&#xff0c;就8端口的工业交换机分别研发了网管型、非网管、8电口、2光6电、4光4电等多种规格。如果您这边有特殊规格的需求&#xff0c;飞畅科技也可以…

一号信令是什么?1号信令和7号信令的区别介绍!

1号信令又称为多频互控信令或随路信令。那么&#xff0c;什么是一号信令&#xff1f;一号信令是怎么分类的&#xff1f;1号信令常见问题有哪些&#xff1f;1号信令和7号信令之间有哪些区别呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来详细了解下吧&#xff01; 一、1号…

RS232、RS485和CAN协议总结与对比

RS232简单实用&#xff0c;缺陷是不支持多设备间的互连&#xff0c;缺少拓扑结构。由此诞生了RS485。RS485最重要的是采用两条差分线代替RS232的单线传输&#xff0c;支持拓扑结构。RS485属于电气层的协议&#xff0c;物理上的实现大都在RS232基础上完成。缺陷是主从轮询的方式…

php 回到顶部,jquery如何实现点击网页回到顶部效果?(图文+视频)

本篇文章主要给大家介绍如何用jquery代码实现网页回到顶部的效果。我们在浏览各大网站页面时&#xff0c;想必大家肯定都遇到过&#xff0c;当阅览一个长页面时&#xff0c;拉到下面部分会出现类似回到顶部的按钮特效吧。这种点击回到顶部的功能特效&#xff0c;可以很大程度上…

使用JDK 13查看TLS配置

JDK 13 Early Access Build 16现在可用&#xff0c;它带来的有趣的功能之一是能够使keytool命令行工具显示当前系统的TLS配置信息 。 这比尝试在单独的文档中查找受支持的TLS信息并使该信息与自己的JDK供应商和版本更容易。 要查看JDK 13 Early Access Build 16的TLS配置详细信…

串口服务器常见异常情况排除方法介绍

串口服务器就像一台带CPU、实时操作系统和TCP/IP协议的微型电脑&#xff0c;方便在串口和网络设备中传输数据。在使用串口服务器的过程中&#xff0c;一般按照操作手册进行操作基本上可以解决问题&#xff0c;但是&#xff0c;在实际操作中还是会出现一些异常故障&#xff0c;今…

ckfinder php 配置,php – 在Laravel 5中为CKEditor设置路径以使用CKFinder

您好我正在尝试将CKFinder与CKEditor集成到一个laravel项目中.我在CKEditor的config.js文件中进行了以下设置&#xff1a;CKEDITOR.editorConfig function( config ) {// Define changes to default configuration here. For example:// config.language fr;config.uiColor …

工业级光模块是什么?

可能很多人都不知道&#xff0c;光模块是所有网络连接部署中不可或缺的组成部分。一个产品的出现往往与市场需求相对应&#xff0c;我们平时所接触到的光模块大部分只能满足商业数据中心的网络部署&#xff0c;那么大型工业的网络部署该如何满足实现呢?在这种情况下&#xff0…

jvm开源_开源JVM Sampling Profiler

jvm开源众所周知 &#xff0c;大多数现有的采样Java Profiler都必须在安全的地方进行堆栈跟踪收集。 诸如采样探查器之类的探查器就是这种情况&#xff0c;它使用SUN / Oracle管理代理来收集其堆栈跟踪。 这种方法的问题在于&#xff0c;由于不是程序中的每个点都不是安全点&am…

discuz和php的区别,discuz和phpwind优劣比较

discuz!(简称dz)和phpwind(简称pw)是国内最著名的两个PHP论坛系统&#xff0c;随着它们相继宣布开源以后&#xff0c;在各方面&#xff0c;不管技术上&#xff0c;还是功能上&#xff0c;还是界面上&#xff0c;都有了长足的发展&#xff0c;声威大振&#xff0c;远非国外那些功…

串口服务器常见五大问题解决方案

串口服务器提供串口转网络功能&#xff0c;使得串口设备能够立即具备TCP/IP网络接口功能&#xff0c;连接网络进行数据通信&#xff0c;极大的扩展串口设备的通信距离。为了更方便我们操作和使用&#xff0c;今天飞畅科技的小编来为大家介绍下串口服务器常见五大问题解决方案&a…

weblogic工具_WebLogic Classloader分析工具

weblogic工具WebLogic Server具有一个名为Classloader Analysis Tool的内置Web应用程序&#xff0c;您可以通过http&#xff1a;// localhost&#xff1a;7001 / wls-cat访问它 您需要使用为/ console Webapp配置的同一用户登录。 使用CAT&#xff0c;您可以检查应用程序在服务…

必看!工业交换机必须满足这些标准才能称合格

我们都知道&#xff0c;工业交换机是专为工业环境而生产设计的&#xff0c;所以工业交换机的要求比一般商业交换机要严苛的多&#xff01;但现在市场上很多打着工业级交换机的幌子&#xff0c;卖的是商业级别的&#xff0c;因为很多客户其实分辨不出来&#xff0c;一旦出现了问…

php中的id怎么传值,uniapp如何跳转页面传值

uniapp跳转页面传值的方法&#xff1a;首先给点击事件传入id&#xff1b;然后Methods中写方法&#xff0c;代码为【uni.navigateTo({url:opportunity-form?idid})】&#xff1b;最后在详情页接收参数。本教程操作环境&#xff1a;windows7系统、uni-app2.5.1版本&#xff0c;该…

二层和三层工业交换机的主要参数说明

工业交换机是工业数据通信领域重要的设备&#xff0c;可以这样说&#xff0c;如果没有工业交换机&#xff0c;很多地方或者项目都联不上网&#xff0c;更不提进行远程网络管理了&#xff01;目前比较流行的工业交换机又分为二层和三层&#xff0c;之前我们也给大家介绍过什么是…

工业级PoE交换机是如何进行工作的?使用中要注意什么?

工业级PoE交换机应用非常广泛&#xff0c;许多供电不方便的项目基本都采用了工业级PoE交换机来进行数据传输通信&#xff0c;而且大都是非网管型的&#xff0c;即插即用&#xff0c;配置简单&#xff0c;非常方便&#xff01;但你知道它是如何进行工作的吗&#xff1f;我们在使…

具有Azure功能的无服务器API

在这篇文章中&#xff0c;我将研究一个非常简单的用例。 在执行部署管道时&#xff0c; FlexDeploy可能会产生一些应被批准或拒绝的人工任务。 例如&#xff0c;某人必须批准对生产环境的部署。 可以在FlexDeploy UI中或通过某些外部通信渠道来完成。 今天&#xff0c;我将重点…

工业以太网交换机的安全问题详解

以太网交换机技术发展趋势近几年来&#xff0c;随着企业数据通信业务以及相关的融合业务的迅猛发展&#xff0c;以太网交换机作为不可或缺的要害设备不仅在数量上获得了极大的提高&#xff0c;而且在质量、性能等方面不断完善。而伴随着以太网交换机的迅速普及&#xff0c;它的…