阿里云OSS、JWT令牌、微信支付

1 阿里云OSS

1.1 概述

阿里云对象存储OSS(Object Storage Service):是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。

SDK(Software Development Kit ):软件开发工具包,包括辅助软件开发的依赖(jar包)、代码示例等,都称作SDK。

Bucket:存储空间是用户用于存储对象(Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间。

1.2 准备工作

1.2.1 注册阿里云账户(注册完成后需实名认证)
1.2.2 注册完之后,登录阿里云
1.2.3 控制台寻找对象存储OSS服务
在这里插入图片描述

如果是第一次访问,还需要开通对象存储服务OSS
在这里插入图片描述

1.2.4 开通OSS服务之后,就可以进入到阿里云对象存储的控制台
在这里插入图片描述

1.2.5 点击左侧的 “Bucket列表”,创建一个Bucket

在这里插入图片描述
在这里插入图片描述

1.3 入门

官方SDK参照

属性 介绍
accessKeyId 阿里云账号AccessKey
accessKeySecret 阿里云账号AccessKey对应的秘钥
bucketName Bucket名称
objectName 对象名称,在Bucket中存储的对象的名称
filePath 文件路径
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.ByteArrayInputStream;

public class Demo {
    
    

    public static void main(String[] args) throws Exception {
    
    
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "yourAccessKeyId";
        String accessKeySecret = "yourAccessKeySecret";
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        String objectName = "exampledir/exampleobject.txt";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
    
    
            // 填写字符串。
            String content = "Hello OSS,你好世界";

            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));

            // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
            // ObjectMetadata metadata = new ObjectMetadata();
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            // metadata.setObjectAcl(CannedAccessControlList.Private);
            // putObjectRequest.setMetadata(metadata);

            // 设置该属性可以返回response。如果不设置,则返回的response为空。
            putObjectRequest.setProcess("true");
            // 上传字符串。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
            // 如果上传成功,则返回200。
            System.out.println(result.getResponse().getStatusCode());
        } catch (OSSException oe) {
    
    
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
    
    
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
    
    
            if (ossClient != null) {
    
    
                ossClient.shutdown();
            }
        }
    }
}   

1.4 创建AccessKey和accessKeySecret、获取endpoint 、bucketName 、objectName

1.4.2.1 创建AccessKey和accessKeySecret在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击查看 Secret会有AccessKey和accessKeySecret

1.4.2.2 获取endpoint
在这里插入图片描述

1.4.2.3获取bucketName
在这里插入图片描述

1.4.2.4 获取objectName
本地所要上传文件的绝对路径

// 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
        String objectName = "C:\\Users\\jiaoxin\\Pictures\\1.jpg";

1.4.2.5 运行测试方法上传完成
在这里插入图片描述

1.5 项目集成

1.5.1 阿里云 OSS 实体类

@Data
@Component

//在实体类上添加`@ConfigurationProperties`注解,通过perfect属性来指定配置参数项的前缀
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
    
    
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
}

1.5.2 阿里云 OSS 工具类

UUID自动生成文件名

/**
 * 阿里云 OSS 工具类
 */
@Component //把当前类对应的对象放到Spring容器中
public class AliOSSUtils {
    
    

    @Autowired
    private AliOSSProperties aliOSSProperties;


    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
    
    
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        //ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); //原始直接在工具类定义方法
        OSS ossClient = new OSSClientBuilder().build(aliOSSProperties.getEndpoint(),aliOSSProperties.getAccessKeyId(), aliOSSProperties.getAccessKeySecret());//使用@ConfigurationPropertiesOSS注解,将AliOSSProperties实体类注入到此工具类
        ossClient.putObject(aliOSSProperties.getBucketName(), fileName, inputStream);

        //文件访问路径
        String url = aliOSSProperties.getEndpoint().split("//")[0] + "//" + aliOSSProperties.getBucketName() + "." + aliOSSProperties.getEndpoint().split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }
}

1.5.3 yml配置信息

    #阿里云配置
aliyun:
  oss:
    endpoint: your endpoint
    accessKeyId: your accessKeyId
    accessKeySecret: your accessKeySecret
    bucketName: your bucketName

注,如遇红色警告在这里插入图片描述
加入下方依赖(自动识别被@Configuration Properties注解标识的bean对象)

<dependency>
   <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

2 JWT令牌

2.1 概述

JWT全称:JSON Web Token (官网:https://jwt.io/

WT的组成: (英文点分割的三个部分组成)

  • 第一部分:Header(头), 记录令牌类型、签名算法等。 例如:{“alg”:“HS256”,“type”:“JWT”}

  • 第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。 例如:{“id”:“1”,“username”:“Tom”}

  • 第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。

签名的目的:防jwt令牌被篡改,正因为jwt令牌最后一部分数字签名的存在,jwt 令牌是非常安全可靠的。jwt令牌任何一个部分被篡改,校验的都会失败。

2.2 生成和校验

2.2.1 JWT依赖

<!-- JWT依赖-->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

2.2.2 JWT工具类

package com.sasemeseed.Utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;

public class JwtUtils {
    
    

    private static String signKey = "ceshi";
    private static Long expire = 43200000L;

    /**
     * 生成JWT令牌
     * @param claims JWT第二部分负载 payload 中存储的内容
     * @return
     */
    public static String generateJwt(Map<String, Object> claims){
    
    
        String jwt = Jwts.builder()
                .addClaims(claims)
                .signWith(SignatureAlgorithm.HS256, signKey)
                .setExpiration(new Date(System.currentTimeMillis() + expire))
                .compact();
        return jwt;
    }

    /**
     * 解析JWT令牌
     * @param jwt JWT令牌
     * @return JWT第二部分负载 payload 中存储的内容
     */
    public static Claims parseJWT(String jwt){
    
    
        Claims claims = Jwts.parser()
                .setSigningKey(signKey)
                .parseClaimsJws(jwt)
                .getBody();
        return claims;
    }
}

2.2.3 controller访问控制层(登录控制)代码实现

@RestController
@Slf4j
public class LoginController {
    
    
    //依赖业务层对象
    @Autowired
    private EmpService empService;

    @PostMapping("/login")
    public Result login(@RequestBody Emp emp) {
    
    
        //调用业务层:登录功能
        Emp loginEmp = empService.login(emp);

        //判断:登录用户是否存在
        if(loginEmp !=null ){
    
    
            //自定义信息
            Map<String , Object> claims = new HashMap<>();
            claims.put("id", loginEmp.getId());
            claims.put("username",loginEmp.getUsername());
            claims.put("name",loginEmp.getName());

            //使用JWT工具类,生成身份令牌
            String token = JwtUtils.generateJwt(claims);
            return Result.success(token);
        }
        return Result.error("用户名或密码错误");
    }
}

2.2.4 postman测试

在这里插入图片描述

3 微信支付

猜你喜欢

转载自blog.csdn.net/stange1/article/details/129369111