【OAuth2】:赋予用户控制权的安全通行证--代码模拟篇

🥳🥳Welcome Huihui's Code World ! !🥳🥳

接下来看看由辉辉所写的关于OAuth2的相关操作吧 

 上篇已经讲了oauth2的相关知识,详解了oauth2的四种授权模式中的授权码模式,那么这一篇我们就来讲一下授权码模式的代码实现,但是为了更好的讲解其中的相关知识点,这里用的是模拟代码【没有连接数据库进行验证】

目录

🥳🥳Welcome Huihui's Code World ! !🥳🥳

一.代码准备

1.client

1.1pom

1.2controller

2.resource-owner

2.1pom

2.2controller

3.authorization-server

3.1pom

3.2controller

4.resource-server

4.1pom

4.2controller

5.整体项目的pom依赖

二.授权码模式的模拟代码流程讲解 

1.用户访问页面

2.访问的页面将请求重定向到认证服务器

​3.认证服务器向用户展示授权页面,等待用户授权

4.用户授权完成

5.获取令牌(Token)


一.代码准备

1.client

1.1pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>client</name>
    <description>client</description>

    <parent>
        <artifactId>Oauth</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.apache.oltu.oauth2</groupId>
            <artifactId>org.apache.oltu.oauth2.client</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.1</version>
                <configuration>
                    <mainClass>com.example.client.ClientApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

1.2controller

package com.example.client.controller;

import lombok.extern.slf4j.Slf4j;
import org.apache.oltu.oauth2.client.HttpClient;
import org.apache.oltu.oauth2.client.OAuthClient;
import org.apache.oltu.oauth2.client.URLConnectionClient;
import org.apache.oltu.oauth2.client.request.OAuthBearerClientRequest;
import org.apache.oltu.oauth2.client.request.OAuthClientRequest;
import org.apache.oltu.oauth2.client.response.OAuthJSONAccessTokenResponse;
import org.apache.oltu.oauth2.client.response.OAuthResourceResponse;
import org.apache.oltu.oauth2.common.OAuth;
import org.apache.oltu.oauth2.common.exception.OAuthProblemException;
import org.apache.oltu.oauth2.common.exception.OAuthSystemException;
import org.apache.oltu.oauth2.common.message.types.GrantType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;

/**
 * 获取授权的控制器
 */
@Controller
@RequestMapping("/client")
@SuppressWarnings("all")
@Slf4j
public class GetAuthorizationController {

    /**
     * 客户端: 8080
     * 资源拥有者: 8081
     * 认证服务器: 8082
     * 资源服务器: 8083
     */

    private static String CLIENT_ID = "clientId";
    private static String CLIENT_SECRET = "clientSecret";
    private static String CODE_URL = "code";
    private static String RESPONSE_TYPE = "code";
    /*认证服务器地址*/
    private static String AUTH_SERVER_URL = "http://localhost:8082/authServer/token";
    /*资源拥有者地址*/
    private static String RESOURCE_OWNER_URL = "http://localhost:8081/owner/";
    /*资源服务器地址*/
    private static String RESOURCE_SERVER_URL = "http://localhost:8083/resourceServer/userinfo";
    /*授权码回调地址*/
    private static String CALLBACKCODE = "http://localhost:8080/client/callbackCode";
    /*获取资源地址*/
    private static String GETRESOURCE = "http://localhost:8080/client/getResource";

    /**
     * 客户向资源所有者获取授权码
     */
    @GetMapping("/getCode")
    public String getCode() throws OAuthSystemException {
        // 创建OAuthClientRequest对象,设置授权码请求的相关参数
        OAuthClientRequest oAuthClientRequest = OAuthClientRequest
                .authorizationLocation(CODE_URL) // 授权码请求的授权服务器地址
                .setClientId(CLIENT_ID) // 设置客户端ID
                .setRedirectURI(CALLBACKCODE) // 设置重定向URI
                .setResponseType(RESPONSE_TYPE) // 设置响应类型为授权码
                .buildQueryMessage(); // 构建查询消息
        String uriString = oAuthClientRequest.getLocationUri(); // 获取授权码请求的URI字符串
        // 重定向到资源所有者,获取验证码
        return "redirect:" + RESOURCE_OWNER_URL + uriString;
    }

    /**
     * 1. 资源所有者在生成授权码之后,会回调该接口将授权码传回给客户
     * 2. 客户获取授权码之后,使用该接口向认证服务器申请令牌
     */
    @RequestMapping("/callbackCode")
    public String callbackCode(HttpServletRequest request) throws OAuthSystemException, OAuthProblemException {
        // 从请求中获取授权码
        String code = request.getParameter("code");
        log.info(" --- 从资源拥有者获取code: {} -----------", code);
        // 创建OAuthClient对象,用于与认证服务器进行通信
        OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient());
        // 创建OAuthClientRequest对象,设置令牌请求的相关参数
        OAuthClientRequest tokenRequest = OAuthClientRequest
                .tokenLocation(AUTH_SERVER_URL) // 令牌请求的认证服务器地址
                .setClientId(CLIENT_ID) // 设置客户端ID
                .setClientSecret(CLIENT_SECRET) // 设置客户端密钥
                .setGrantType(GrantType.AUTHORIZATION_CODE) // 设置授权类型为授权码
                .setCode(code) // 设置授权码
                .setRedirectURI(CALLBACKCODE) // 设置重定向URI
                .buildQueryMessage(); // 构建查询消息
        // 通过Code,向认证服务器申请令牌
        OAuthJSONAccessTokenResponse tokenResp = oAuthClient.accessToken(tokenRequest, OAuth.HttpMethod.POST); // 发送请求并获取响应
        // 从响应中获取访问令牌
        String accessToken = tokenResp.getAccessToken();
        log.info("客户获取的访问令牌:" + accessToken);
        return "redirect:" + GETRESOURCE + "?accessToken=" + accessToken;
    }

    /**
     * 使用令牌获取资源服务器中的数据
     */
    @GetMapping("/getResource")
    @ResponseBody
    public String getResource(String accessToken) throws OAuthSystemException, OAuthProblemException {
        log.info("客户使用令牌向资源服务器获取数据 token = " + accessToken);
        // 创建OAuthClient对象,用于与资源服务器进行通信
        OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient());
        // 创建OAuthClientRequest对象,设置用户信息请求的相关参数
        OAuthClientRequest userInfoRequest =
                new OAuthBearerClientRequest(RESOURCE_SERVER_URL) // 用户信息请求的资源服务器地址
                        .setAccessToken(accessToken) // 设置访问令牌
                        .buildHeaderMessage(); // 构建请求头消息
        // 向资源服务器发送请求并获取响应
        OAuthResourceResponse resourceResponse = oAuthClient.resource(userInfoRequest, OAuth.HttpMethod.GET, OAuthResourceResponse.class);
        // 从响应中获取用户信息
        String userInfo = resourceResponse.getBody();
        log.info("客户获取的资源服务器的数据: " + userInfo);
        return userInfo;
    }

}

2.resource-owner

2.1pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>resource-owner</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>resource-owner</name>
    <description>resource-owner</description>

    <parent>
        <artifactId>Oauth</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.apache.oltu.oauth2</groupId>
            <artifactId>org.apache.oltu.oauth2.authzserver</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.oltu.oauth2</groupId>
            <artifactId>org.apache.oltu.oauth2.resourceserver</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.1</version>
                <configuration>
                    <mainClass>com.example.owner.ResourceOwnerApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

2.2controller

package com.example.owner.controller;

import lombok.extern.slf4j.Slf4j;
import org.apache.oltu.oauth2.as.request.OAuthAuthzRequest;
import org.apache.oltu.oauth2.as.response.OAuthASResponse;
import org.apache.oltu.oauth2.common.OAuth;
import org.apache.oltu.oauth2.common.exception.OAuthProblemException;
import org.apache.oltu.oauth2.common.exception.OAuthSystemException;
import org.apache.oltu.oauth2.common.message.OAuthResponse;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller // 声明这是一个控制器类
@RequestMapping("/owner") // 设置请求映射路径为 /owner
@Slf4j // 使用 Lombok 的 @Slf4j 注解,简化日志记录
@SuppressWarnings("all") // 忽略所有警告
public class CodeController {

    @GetMapping("/code") // 定义一个处理 GET 请求的方法,映射路径为 /code
    public String sendCode(HttpServletRequest request) {
        log.info("resource owner send code"); // 记录日志信息
        try {
            OAuthAuthzRequest oathReq = new OAuthAuthzRequest(request); // 从请求中获取 OAuthAuthzRequest 对象
            if (StringUtils.hasLength(oathReq.getClientId())) { // 如果客户端ID存在
                //设置授权码
                String code = "authorizationCode";
                String responseType = oathReq.getResponseType();
                //获取构建响应的对象
                OAuthASResponse.OAuthAuthorizationResponseBuilder builder =
                        OAuthASResponse.authorizationResponse(request, HttpServletResponse.SC_OK);
                builder.setCode(code); // 设置授权码
                String redirectURI = oathReq.getParam(OAuth.OAUTH_REDIRECT_URI); // 获取重定向URI
                OAuthResponse oauthResp = builder.location(redirectURI).buildQueryMessage(); // 构建查询消息
                log.info("resource owner send code "); // 记录日志信息
                String uri = oauthResp.getLocationUri(); // 获取重定向URI
                return "redirect:" + uri; // 返回重定向URL
            }
        } catch (OAuthSystemException e) { // 捕获 OAuthSystemException 异常
            e.printStackTrace(); // 打印异常堆栈信息
        } catch (OAuthProblemException e) { // 捕获 OAuthProblemException 异常
            e.printStackTrace(); // 打印异常堆栈信息
        }
        return null; // 如果发生异常或客户端ID不存在,返回 null
    }

}

3.authorization-server

3.1pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>authorization-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>authorization-server</name>
    <description>authorization-server</description>

    <parent>
        <artifactId>Oauth</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.apache.oltu.oauth2</groupId>
            <artifactId>org.apache.oltu.oauth2.authzserver</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.oltu.oauth2</groupId>
            <artifactId>org.apache.oltu.oauth2.resourceserver</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.1</version>
                <configuration>
                    <mainClass>com.example.authorization.AuthorizationServerApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

3.2controller
 

package com.example.authorization.controller;

import lombok.extern.slf4j.Slf4j;
import org.apache.oltu.oauth2.as.issuer.MD5Generator;
import org.apache.oltu.oauth2.as.issuer.OAuthIssuerImpl;
import org.apache.oltu.oauth2.as.request.OAuthTokenRequest;
import org.apache.oltu.oauth2.as.response.OAuthASResponse;
import org.apache.oltu.oauth2.common.exception.OAuthProblemException;
import org.apache.oltu.oauth2.common.exception.OAuthSystemException;
import org.apache.oltu.oauth2.common.message.OAuthResponse;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller // 声明这是一个控制器类
@RequestMapping("/authServer") // 设置请求映射路径为 /authServer
@Slf4j // 使用 Lombok 的 @Slf4j 注解,简化日志记录
@SuppressWarnings("all") // 忽略所有警告
public class AuthController {

    @PostMapping("/token") // 定义一个处理 POST 请求的方法,映射路径为 /token
    public HttpEntity getAccessToken(HttpServletRequest request) throws OAuthProblemException, OAuthSystemException {
        log.info("认证服务器,接收到客户的令牌请求 .... "); // 记录日志信息
        OAuthTokenRequest tokenReq = new OAuthTokenRequest(request); // 从请求中获取 OAuthTokenRequest 对象
        String clientSecret = tokenReq.getClientSecret(); // 获取客户端密钥
        if (StringUtils.hasLength(clientSecret)) { // 如果客户端密钥存在
            OAuthIssuerImpl oAuthIssuer = new OAuthIssuerImpl(new MD5Generator()); // 创建一个 OAuthIssuerImpl 对象,使用 MD5Generator 生成签名算法
            String token = oAuthIssuer.accessToken(); // 生成访问令牌
            log.info("token = " + token); // 记录日志信息
            //构造保护令牌的响应对象
            OAuthResponse oAuthResponse = OAuthASResponse
                    .tokenResponse(HttpServletResponse.SC_OK) // 设置响应状态码为 200 OK
                    .setAccessToken(token) // 设置访问令牌
                    .buildJSONMessage(); // 构建 JSON 格式的响应消息
            return new ResponseEntity(oAuthResponse.getBody(), HttpStatus.valueOf(oAuthResponse.getResponseStatus())); // 返回响应实体
        }
        return null; // 如果客户端密钥不存在,返回 null
    }

}

4.resource-server

4.1pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>resource-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>resource-server</name>
    <description>resource-server</description>

    <parent>
        <artifactId>Oauth</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.apache.oltu.oauth2</groupId>
            <artifactId>org.apache.oltu.oauth2.authzserver</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.oltu.oauth2</groupId>
            <artifactId>org.apache.oltu.oauth2.resourceserver</artifactId>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.1</version>
                <configuration>
                    <mainClass>com.example.resource.ResourceServerApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

4.2controller

package com.example.resource.controller;

import org.apache.oltu.oauth2.common.exception.OAuthProblemException;
import org.apache.oltu.oauth2.common.exception.OAuthSystemException;
import org.apache.oltu.oauth2.common.message.types.ParameterStyle;
import org.apache.oltu.oauth2.rs.request.OAuthAccessResourceRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@RestController // 声明这是一个控制器类
@RequestMapping("/resourceServer") // 设置请求映射路径为 /resourceServer
@SuppressWarnings("all") // 忽略所有警告
public class UserController {

    @GetMapping("/userinfo") // 定义一个处理 GET 请求的方法,映射路径为 /userinfo
    public Object getUserInfo(HttpServletRequest request) throws OAuthProblemException, OAuthSystemException {
        // 创建一个 OAuthAccessResourceRequest 对象,用于处理 OAuth 认证请求
        OAuthAccessResourceRequest oAuthAccessResourceRequest = new OAuthAccessResourceRequest(request, ParameterStyle.HEADER);
        // 获取访问令牌
        String accessToken = oAuthAccessResourceRequest.getAccessToken();
        // 创建一个 Map 对象,用于存储用户信息
        Map<String, Object> map = new HashMap<>();
        // 向 Map 中添加用户信息
        map.put("name", "zhengsuanfeng");
        map.put("phone", "13576472774");
        map.put("addr", "长沙岳麓区");
        // 返回用户信息
        return map;
    }

}

5.整体项目的pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>Oauth</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>client</module>
        <module>resource-owner</module>
        <module>authorization-server</module>
        <module>resource-server</module>
    </modules>

    <properties>
        <oauth2.version>0.31</oauth2.version>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.4.1</spring-boot.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.oltu.oauth2</groupId>
                <artifactId>org.apache.oltu.oauth2.client</artifactId>
                <version>${oauth2.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.oltu.oauth2</groupId>
                <artifactId>org.apache.oltu.oauth2.authzserver</artifactId>
                <version>${oauth2.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.oltu.oauth2</groupId>
                <artifactId>org.apache.oltu.oauth2.resourceserver</artifactId>
                <version>${oauth2.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

二.授权码模式的模拟代码流程讲解 

1.用户访问页面


2.访问的页面将请求重定向到认证服务器


3.认证服务器向用户展示授权页面,等待用户授权


4.用户授权完成

认证服务器带上client_id发送给应用服务器资源服务器➡生成一个code

然后,用户拿到code

5.获取令牌(Token)

将code、client_id、client_secret传给认证服务器换取access_token


 

6.将access_token传给资源服务器


7.验证token,访问真正的资源页面

拿到数据

好啦,今天的分享就到这了,希望能够帮到你呢!😊😊    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于5G智能网关的智慧塔吊监测方案

塔吊是建筑施工中必不可少的设施&#xff0c;由于塔吊工作重心高、起重载荷大、人工视距/视角受限等因素&#xff0c;也使得塔吊在工作过程中着较多的危险因素。对此&#xff0c;可以部署基于工业5G智能网关搭建智慧塔吊安全监测系统&#xff0c;实现对塔吊运行的全局精细监测感…

NLP论文阅读记录 - 以大语言模型为参考学习总结

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作2.1文本生成模型的训练方法2.2 基于LLM的自动评估2.3 LLM 蒸馏和基于 LLM 的数据增强 三.本文方法3.1 Summarize as Large Language Models3.1.1 前提3.1.2 大型语言模型作为参考具有…

随记-语义分割

Semantic Segmentation 什么是语义分割全卷积网络FCN摘要 什么是语义分割 语义分割 Semantic Segmentation 旨在对图像的每个像素进行分类&#xff0c;将其分配给预定义的语义类别。 &#xff08;检测图像中的物体并按属性分类&#xff09; 实例分割 Instance Segmentation 实…

一台服务器​最大并发 tcp 连接数多少?65535?

首先&#xff0c;问题中描述的65535个连接指的是客户端连接数的限制。 在tcp应用中&#xff0c;server事先在某个固定端口监听&#xff0c;client主动发起连接&#xff0c;经过三次握手后建立tcp连接。那么对单机&#xff0c;其最大并发tcp连接数是多少呢&#xff1f; 如何标…

HttpClient基础

简介&#xff1a; HttpClient是Apache的一个子项目&#xff0c;可以提供高效的、功能丰富的支持HTTP协议的客户端编程工具包&#xff0c;并且它支持HTTP协议最新的版本和建议。 作用&#xff1a; 发送HTTP请求接收响应数据 使用 导入maven坐标&#xff1a; <dependency&g…

VSLAM:对极几何

文章目录 概要对极约束推导参考概要 透视几何的缺陷是图像深度信息的丢失,如图1所示,根据相似变换关系,视线上的若干平面都映射为成像面上的一个平面。 图1 对极几何是两个透视几何模型间的几何约束关系,主要用于实现基于三角测量的双目立体视觉、深度估计等,对极几何约…

【代码学习】多标签分类 multilabel classfication | loss如何计算? | 衡量指标如何计算?

文章目录 loss计算 | BCELoss(), 最后sigmoid映射为0-1区间值衡量指标计算 sklearn.metrics代码 MultiLabelClassifier /CelebA_Classification_PyTorch_Github.ipynb loss计算 | BCELoss(), 最后sigmoid映射为0-1区间值 gpt解释 import torch import torch.nn as nn# 创建模…

全卷积网络

全卷积网络 全卷积网络就是图像到图像的变换&#xff0c;一般用于语义分割&#xff0c;图像恢复啥的 我们使用Resnet18来进行&#xff0c;最后平均池化和全连接层我们不需要 import torch import torchvision from torch import nn from torch.nn import functional as F fr…

sheng的学习笔记-【中】【吴恩达课后测验】Course 4 -卷积神经网络 - 第四周测验

课程4_第4周_测验题 目录 第一题 1.面部验证只需要将新图片与1个人的面部进行比较&#xff0c;而面部识别则需要将新图片与K个人的面部进行比较。 A. 【  】正确 B. 【  】错误 答案&#xff1a; A.【 √ 】正确 第二题 2.在人脸验证中函数d(img1,img2)起什么作用&a…

12.26_黑马数据结构与算法笔记Java

目录 243 图 Floyd Warshall 算法实现2 244 图 Floyd Warshall 算法实现3 245 图 Floyd Warshall 算法实现4 246 图 最小生成树 Prim 247 图 最小生成树 Kruskal 248 图 并查集 1 249 图 并查集 2 250 图 并查集 路径压缩 251 图 并查集 UnionBySize 252 贪心算法 介绍…

Python干饭神器告诉你,今天吃什么,再也不用为吃什么发愁!

亲爱的小伙伴们&#xff0c;由于微信公众号改版&#xff0c;打乱了发布时间&#xff0c;为了保证大家可以及时收到文章的推送&#xff0c;可以点击上方蓝字关注测试工程师成长之路&#xff0c;并设为星标就可以第一时间收到推送哦 一.前言 hello&#xff0c;大家好&#xff0c…

计算器——可支持小数的任意四则运算(中缀表达式转为后缀表达式算法)

中缀表达式转为后缀表达式的原理过程主要包括以下步骤&#xff1a; 1. 初始化两个栈&#xff0c;一个用于存储操作数&#xff0c;一个用于存储运算符。2. 从左到右扫描中缀表达式的每个字符。3. 如果遇到数字&#xff0c;则直接将其压入操作数栈。4. 如果遇到运算符&#xff0c…

[vue]Echart使用手册

[vue]Echart使用手册 使用环境Echart的使用Echart所有组件和图表类型Echart 使用方法 使用环境 之前是在JQuery阶段使用Echart&#xff0c;直接引入Echart的js文件即可&#xff0c;现在是在vue中使用,不仅仅时echarts包&#xff0c;还需要安装vue-echarts&#xff1a; "…

性能暴增的Rope Crystal版本:红宝石(12.25)

文章目录 &#xff08;零&#xff09;版本介绍&#xff08;一&#xff09;主界面调整&#xff08;二&#xff09;模型与性能&#xff08;三&#xff09;创作纪念日 &#xff08;零&#xff09;版本介绍 &#x1f517; Github仓库。 这次圣诞节更新主要是提升性能&#xff01;&…

JavaScript:DOM节点

JavaScript&#xff1a;DOM节点 DOM节点查找节点父节点查找子节点查找兄弟节点查找 插入节点追加节点克隆节点 删除节点浏览器渲染模式回流重绘 DOM节点 DOM树中的每一个内容都称之为节点&#xff0c;主要包括元素节点&#xff0c;属性节点&#xff0c;文本节点等&#xff0c;本…

EasyCVR无人机推流+人数统计AI算法,助力公共场所人群密度管控

一、背景与需求 在公共场所和大型活动的管理中&#xff0c;人数统计和人群密度控制是非常重要的安全问题。传统的方法可能存在效率低下或准确度不足的情况&#xff0c;无法满足现代社会的需求。TSINGSEE青犀可以利用无人机推流AI人流量统计算法&#xff0c;基于计算机视觉技术…

22000mAh 电池,这款国产新机来了场「续航」震撼

见惯了主流智能手机&#xff0c;是时候上一波离谱新机震撼了。 三防手机这一细分类型&#xff0c;咱们普通用户可能接触得比较少&#xff1b; 但对于极限运动、野外探险爱好者来说&#xff0c;这玩意儿可是关键时候能救命的必备神器。 在真正严苛环境面前&#xff0c;性能啥的…

ES慢查询分析——性能提升6 倍

问题 生产环境频繁报警。查询跨度91天的数据&#xff0c;请求耗时已经来到了30s。报警的阈值为5s。 背景 查询关键词简单&#xff0c;为‘北京’ 单次仅检索两个字段 查询时间跨度为91天&#xff0c;覆盖数据为450亿数据 问题分析 使用profle分析&#xff0c;复现监控报警的…

【DevOps 工具链】搭建 项目管理软件 禅道

文章目录 1、简介2、环境要求3、搭建部署环境3.1. 安装Apache服务3.2. 安装PHP环境&#xff08;以php7.0为例 &#xff09;3.3. 安装MySQL服务 4、搭建禅道4.1、下载解压4.2、 配置4.2.1、 启动4.2.2、自启动4.2.3、确认是否开机启动 5、成功安装 1、简介 禅道是国产开源项目管…

nvprof:CUDA编程性能分析工具

nvprof分析工具使您能够从命令行收集和查看分析数据。nvprof能够收集CPU和GPU上与CUDA相关的活动的时间线&#xff0c;包括内核执行、内存传输、内存集和CUDA API调用以及CUDA内核的事件或度量。评测选项通过命令行选项提供给nvprof。分析结果在收集分析数据后显示在控制台中&a…