对外
This commit is contained in:
72
pom.xml
Normal file
72
pom.xml
Normal file
@@ -0,0 +1,72 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<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/xsd/maven-4.0.0.xsd">
|
||||
|
||||
<parent>
|
||||
<groupId>com.yxt</groupId>
|
||||
<artifactId>yxt-parent</artifactId>
|
||||
<version>0.0.1</version>
|
||||
<relativePath/>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>ss-gateway-api</artifactId>
|
||||
<groupId>ss-gateway-api</groupId>
|
||||
<version>0.0.1</version>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-gateway</artifactId>
|
||||
</dependency>
|
||||
<!-- <dependency>
|
||||
<groupId>com.alibaba.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
|
||||
</dependency>-->
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.24</version>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-webmvc</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<version>2.5.6</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>repackage</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/java</directory>
|
||||
<includes>
|
||||
<include>**/*Mapper.xml</include>
|
||||
</includes>
|
||||
</resource>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<includes>
|
||||
<include>**/*.*</include>
|
||||
</includes>
|
||||
<filtering>false</filtering>
|
||||
</resource>
|
||||
</resources>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.yxt.ss.gateway.api;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
||||
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
|
||||
|
||||
/**
|
||||
* @description:
|
||||
* @author: dimengzhe
|
||||
* @date: 2024/12/6
|
||||
**/
|
||||
//@EnableDiscoveryClient
|
||||
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
|
||||
public class GatewayApiApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(GatewayApiApplication.class, args);
|
||||
}
|
||||
}
|
||||
87
src/main/java/com/yxt/ss/gateway/api/rest/Signature.java
Normal file
87
src/main/java/com/yxt/ss/gateway/api/rest/Signature.java
Normal file
@@ -0,0 +1,87 @@
|
||||
package com.yxt.ss.gateway.api.rest;
|
||||
|
||||
import com.yxt.ss.gateway.api.utils.ResultBean;
|
||||
import com.yxt.ss.gateway.api.utils.SignatureUtil;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
|
||||
/**
|
||||
* @description:
|
||||
* @author: dimengzhe
|
||||
* @date: 2024/12/6
|
||||
**/
|
||||
@RestController
|
||||
@RequestMapping("/signature")
|
||||
public class Signature {
|
||||
|
||||
//appkey
|
||||
static final String APPKEY = "appkey";
|
||||
//secret
|
||||
static final String SECRET = "secret";
|
||||
|
||||
//获取签名
|
||||
@PostMapping("/getSign")
|
||||
ResultBean<String> getSign(@RequestParam("parameters") Map<String, String> parameters, @RequestParam("appKey") String appKey, @RequestParam("secret") String secret) throws UnsupportedEncodingException, NoSuchAlgorithmException {
|
||||
ResultBean<String> rb = ResultBean.fireFail();
|
||||
String sign = SignatureUtil.generateSignature(parameters, appKey, secret);
|
||||
return rb.success().setData(sign);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 对传入的参数集合进行签名处理
|
||||
* 返回系统参数
|
||||
*/
|
||||
@PostMapping("/getSignParameters")
|
||||
public ResultBean<Map<String, String>> signParameters(@RequestParam("parameters") Map<String, String> parameters, @RequestParam("appKey") String appKey, @RequestParam("secret") String secret) throws UnsupportedEncodingException, NoSuchAlgorithmException {
|
||||
ResultBean<Map<String, String>> rb = ResultBean.fireFail();
|
||||
// 1. 使用 TreeMap 按照字典顺序对参数进行排序
|
||||
Map<String, String> tree = new TreeMap<>(parameters);
|
||||
tree.put("_app", appKey);
|
||||
tree.putIfAbsent("_t", String.valueOf(System.currentTimeMillis()));
|
||||
|
||||
// 拼接参数串
|
||||
String content = SignatureUtil.joinParameters(tree);
|
||||
|
||||
// 将参数串前后拼上密钥
|
||||
content = secret + content + secret;
|
||||
|
||||
// 计算sign值并添加到参数集合中
|
||||
String sign = SignatureUtil.md5(content);
|
||||
tree.put("_sign", sign);
|
||||
tree.put("_s", "");
|
||||
|
||||
return rb.success().setData(tree);
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证签名是否正确
|
||||
*
|
||||
* @param parameters 请求参数
|
||||
* @param appKey 应用的 AppKey
|
||||
* @param secret 密钥
|
||||
* @param receivedSignature 请求中的签名
|
||||
* @return 是否验证通过
|
||||
*/
|
||||
@PostMapping("/validateSignature")
|
||||
public ResultBean<Boolean> validateSignature(@RequestParam("parameters") Map<String, String> parameters, @RequestParam("appKey") String appKey, @RequestParam("secret") String secret, @RequestParam("receivedSignature") String receivedSignature) throws UnsupportedEncodingException, NoSuchAlgorithmException {
|
||||
ResultBean<Boolean> rb = ResultBean.fireFail();
|
||||
// 1. 重新生成签名
|
||||
String calculatedSignature = SignatureUtil.generateSignature(parameters, appKey, secret);
|
||||
|
||||
// 2. 比较计算出来的签名和请求中的签名
|
||||
boolean validd = calculatedSignature.equals(receivedSignature);
|
||||
return rb.success().setData(validd);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
23
src/main/java/com/yxt/ss/gateway/api/utils/HttpStatus.java
Normal file
23
src/main/java/com/yxt/ss/gateway/api/utils/HttpStatus.java
Normal file
@@ -0,0 +1,23 @@
|
||||
package com.yxt.ss.gateway.api.utils;
|
||||
|
||||
/**
|
||||
* @author dimengzhe
|
||||
* @date 2021/6/16 10:50
|
||||
* @description
|
||||
*/
|
||||
|
||||
public class HttpStatus {
|
||||
|
||||
/**
|
||||
* 操作成功
|
||||
*/
|
||||
public static final int SUCCESS = 200;
|
||||
|
||||
/**
|
||||
* 系统内部错误
|
||||
*/
|
||||
public static final int ERROR = 500;
|
||||
|
||||
public static final String OVERDUE = "5000";
|
||||
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
/*********************************************************
|
||||
*********************************************************
|
||||
******************** *******************
|
||||
************* ************
|
||||
******* _oo0oo_ *******
|
||||
*** o8888888o ***
|
||||
* 88" . "88 *
|
||||
* (| -_- |) *
|
||||
* 0\ = /0 *
|
||||
* ___/`---'\___ *
|
||||
* .' \\| |// '. *
|
||||
* / \\||| : |||// \ *
|
||||
* / _||||| -:- |||||- \ *
|
||||
* | | \\\ - /// | | *
|
||||
* | \_| ''\---/'' |_/ | *
|
||||
* \ .-\__ '-' ___/-. / *
|
||||
* ___'. .' /--.--\ `. .'___ *
|
||||
* ."" '< `.___\_<|>_/___.' >' "". *
|
||||
* | | : `- \`.;`\ _ /`;.`/ - ` : | | *
|
||||
* \ \ `_. \_ __\ /__ _/ .-` / / *
|
||||
* =====`-.____`.___ \_____/___.-`___.-'===== *
|
||||
* `=---=' *
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
|
||||
*********__佛祖保佑__永无BUG__验收通过__钞票多多__*********
|
||||
*********************************************************/
|
||||
package com.yxt.ss.gateway.api.utils;
|
||||
|
||||
/**
|
||||
* Project: yxt-common <br/>
|
||||
* File: IResultCodeMsg.java <br/>
|
||||
* Class: com.yxt.common.core.result.IResultCodeMsg <br/>
|
||||
* Description: <描述类的功能>. <br/>
|
||||
* Copyright: Copyright (c) 2011 <br/>
|
||||
* Company: https://gitee.com/liuzp315 <br/>
|
||||
* Makedate: 2021/9/11 下午11:00 <br/>
|
||||
*
|
||||
* @author popo
|
||||
* @version 1.0
|
||||
* @since 1.0
|
||||
*/
|
||||
public interface IResultCodeMsg {
|
||||
String getCode();
|
||||
String getMsg();
|
||||
}
|
||||
191
src/main/java/com/yxt/ss/gateway/api/utils/ResultBean.java
Normal file
191
src/main/java/com/yxt/ss/gateway/api/utils/ResultBean.java
Normal file
@@ -0,0 +1,191 @@
|
||||
package com.yxt.ss.gateway.api.utils;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* Project: yxt-common-core <br/>
|
||||
* File: ResultBean.java <br/>
|
||||
* Class: com.yxt.common.core.result.ResultBean <br/>
|
||||
* Description: 通过接口、Rest、逻辑处理执行后的结果信息. <br/>
|
||||
* Copyright: Copyright (c) 2011 <br/>
|
||||
* Company: https://gitee.com/liuzp315 <br/>
|
||||
* Makedate: 2020/8/4 0:51 <br/>
|
||||
*
|
||||
* @author liupopo
|
||||
* @version 1.0
|
||||
* @since 1.0
|
||||
*/
|
||||
public class ResultBean<T> implements Serializable {
|
||||
private static final long serialVersionUID = 4529658978692424234L;
|
||||
|
||||
private long timestamp = System.currentTimeMillis();
|
||||
|
||||
public long getTimestamp() {
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
// 是否成功
|
||||
private boolean success;
|
||||
|
||||
// 消息 返回结果的说明
|
||||
private String msg;
|
||||
|
||||
// 结果状态码
|
||||
private String code;
|
||||
|
||||
// 数据
|
||||
private T data;
|
||||
|
||||
private String message;
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public ResultBean<T> setMessage(String message) {
|
||||
this.message = message;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ResultBean() {
|
||||
}
|
||||
|
||||
public ResultBean(boolean success) {
|
||||
this.success = success;
|
||||
}
|
||||
|
||||
public ResultBean(boolean success, String msg) {
|
||||
this.success = success;
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
public ResultBean(boolean success, String msg, String code) {
|
||||
this.success = success;
|
||||
this.msg = msg;
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public ResultBean(T data) {
|
||||
this.success = true;
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public ResultBean(String code, T data) {
|
||||
this.success = true;
|
||||
this.code = code;
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public ResultBean(String code, String msg, T data) {
|
||||
this.success = true;
|
||||
this.code = code;
|
||||
this.msg = msg;
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public boolean getSuccess() {
|
||||
return success;
|
||||
}
|
||||
|
||||
public ResultBean<T> setSuccess(boolean success) {
|
||||
this.success = success;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getMsg() {
|
||||
return msg;
|
||||
}
|
||||
|
||||
public ResultBean<T> setMsg(String msg) {
|
||||
this.msg = msg;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public ResultBean<T> setCode(String code) {
|
||||
this.code = code;
|
||||
return this;
|
||||
}
|
||||
|
||||
public T getData() {
|
||||
return data;
|
||||
}
|
||||
|
||||
public ResultBean<T> setData(T data) {
|
||||
this.data = data;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ResultBean<T> successOne() {
|
||||
this.setSuccess(true);
|
||||
this.setCode("0");
|
||||
this.setMessage("成功!");
|
||||
return this;
|
||||
}
|
||||
|
||||
public ResultBean<T> failOne() {
|
||||
this.setSuccess(false);
|
||||
this.setCode(String.valueOf(HttpStatus.ERROR));
|
||||
this.setMessage("操作失败!");
|
||||
return this;
|
||||
}
|
||||
|
||||
public ResultBean<T> success() {
|
||||
this.setSuccess(true);
|
||||
this.setCode(String.valueOf(HttpStatus.SUCCESS));
|
||||
this.setMsg("操作成功!");
|
||||
return this;
|
||||
}
|
||||
|
||||
public ResultBean<T> fail() {
|
||||
this.setSuccess(false);
|
||||
this.setCode(String.valueOf(HttpStatus.ERROR));
|
||||
this.setMsg("操作失败!");
|
||||
return this;
|
||||
}
|
||||
|
||||
public static <T> ResultBean<T> fireSuccess() {
|
||||
ResultBean<T> rb = new ResultBean<T>();
|
||||
rb.setSuccess(true);
|
||||
rb.setCode(String.valueOf(HttpStatus.SUCCESS));
|
||||
rb.setMsg("操作成功!");
|
||||
return rb;
|
||||
}
|
||||
|
||||
public static <T> ResultBean<T> fireFail() {
|
||||
ResultBean<T> rb = new ResultBean<T>();
|
||||
rb.setSuccess(false);
|
||||
rb.setCode(String.valueOf(HttpStatus.ERROR));
|
||||
rb.setMsg("操作失败!");
|
||||
return rb;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置返回code及msg
|
||||
*
|
||||
* @param codeMsg Code和Msg的枚举
|
||||
* @return
|
||||
*/
|
||||
public ResultBean<T> setCode(IResultCodeMsg codeMsg) {
|
||||
this.code = codeMsg.getCode();
|
||||
this.msg = codeMsg.getMsg();
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回失败信息,并指定结果code
|
||||
*
|
||||
* @param codeMsg Code和Msg的枚举
|
||||
* @return
|
||||
*/
|
||||
public ResultBean<T> fail(IResultCodeMsg codeMsg) {
|
||||
this.setSuccess(false);
|
||||
this.code = codeMsg.getCode();
|
||||
this.msg = codeMsg.getMsg();
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
package com.yxt.ss.gateway.api.utils;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
|
||||
/**
|
||||
* @description: 生成签名
|
||||
* @author: dimengzhe
|
||||
* @date: 2024/11/28
|
||||
**/
|
||||
public class SignatureUtil {
|
||||
|
||||
|
||||
/**
|
||||
* 生成请求签名
|
||||
*
|
||||
* @param parameters 请求参数
|
||||
* @param appKey 应用的 AppKey
|
||||
* @param secret 密钥
|
||||
* @return 签名
|
||||
*/
|
||||
public static String generateSignature(Map<String, String> parameters, String appKey, String secret) throws UnsupportedEncodingException, NoSuchAlgorithmException {
|
||||
// 1. 使用 TreeMap 按照字典顺序对参数进行排序
|
||||
Map<String, String> sortedParams = new TreeMap<>(parameters);
|
||||
sortedParams.put("_app", appKey); // 添加应用的 AppKey
|
||||
sortedParams.put("_t", String.valueOf(System.currentTimeMillis())); // 添加时间戳
|
||||
|
||||
// 2. 拼接参数字符串
|
||||
String content = joinParameters(sortedParams);
|
||||
|
||||
// 3. 将密钥加在参数字符串的前后
|
||||
content = secret + content + secret;
|
||||
|
||||
// 4. 计算签名 (MD5)
|
||||
return md5(content);
|
||||
}
|
||||
|
||||
/**
|
||||
* 拼接参数字符串
|
||||
*
|
||||
* @param tree 排序后的参数
|
||||
* @return 拼接后的参数字符串
|
||||
*/
|
||||
public static String joinParameters(Map<String, String> tree) throws UnsupportedEncodingException {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (Map.Entry<String, String> entry : tree.entrySet()) {
|
||||
if (builder.length() > 0) {
|
||||
builder.append("&");
|
||||
}
|
||||
builder.append(entry.getKey()).append("=");
|
||||
builder.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算 MD5
|
||||
*
|
||||
* @param content 要计算 MD5 的字符串
|
||||
* @return MD5 值
|
||||
*/
|
||||
public static String md5(String content) throws NoSuchAlgorithmException {
|
||||
MessageDigest md = MessageDigest.getInstance("MD5");
|
||||
byte[] bytes = md.digest(content.getBytes());
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (byte b : bytes) {
|
||||
sb.append(String.format("%02x", b));
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
0
src/main/resources/application-devv.yml
Normal file
0
src/main/resources/application-devv.yml
Normal file
0
src/main/resources/application-pro.yml
Normal file
0
src/main/resources/application-pro.yml
Normal file
0
src/main/resources/application-test.yml
Normal file
0
src/main/resources/application-test.yml
Normal file
8
src/main/resources/application.yml
Normal file
8
src/main/resources/application.yml
Normal file
@@ -0,0 +1,8 @@
|
||||
server:
|
||||
port: 9999
|
||||
spring:
|
||||
application:
|
||||
name: ss-gateway-api
|
||||
profiles:
|
||||
active: devv
|
||||
|
||||
0
target/classes/application-devv.yml
Normal file
0
target/classes/application-devv.yml
Normal file
0
target/classes/application-pro.yml
Normal file
0
target/classes/application-pro.yml
Normal file
0
target/classes/application-test.yml
Normal file
0
target/classes/application-test.yml
Normal file
8
target/classes/application.yml
Normal file
8
target/classes/application.yml
Normal file
@@ -0,0 +1,8 @@
|
||||
server:
|
||||
port: 9999
|
||||
spring:
|
||||
application:
|
||||
name: ss-gateway-api
|
||||
profiles:
|
||||
active: devv
|
||||
|
||||
Reference in New Issue
Block a user