SpringCloud-Gateway网关实现入参统一解密

1.添加依赖

剩下的依赖自行添加...

复制代码
    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

2.创建配置文件

这里我使用了Nacos,使用时需要添加Nacos依赖 及配置

复制代码
server:
  port: 8081

spring:
  application:
    name: itvgetway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: smsinterface
          uri: lb://smsinterfacecloud
          predicates:
            - Path=/smsinterface/**
          filters:
           - RequestSign

3.过滤器

直接看代码

java 复制代码
package com.example.itvgetway.filter;

import com.alibaba.fastjson.JSONObject;
import com.example.itvcommoncore.commons.AESCoder;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.util.UriComponentsBuilder;
import reactor.core.publisher.Mono;
import java.net.URLEncoder;
import java.net.URI;
import java.nio.charset.StandardCharsets;


@Component
public class RequestSignGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {
    @Override
    public GatewayFilter apply(Object config) {
        return  new RequestSignGatewayFilter();
    }


    public class RequestSignGatewayFilter implements GatewayFilter, Ordered {


        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            //获取请求参数
MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
            //拿到请求参数,我这里入参格式是:  http://ip:port?REQUEST=xxxxxxxx
            String decryptedParam = queryParams.getFirst("REQUEST");
            //使用解密方法解密
            String decryptedValue = decrypt(decryptedParam);
            // 编码参数值
            String encodedDecryptedParam = URLEncoder.encode(decryptedValue, StandardCharsets.UTF_8);
            // 构建修改后的URI
            URI modifiedUri = UriComponentsBuilder.fromUri(exchange.getRequest().getURI())
                    .replaceQueryParam("REQUEST", encodedDecryptedParam)
                    .build(true)
                    .toUri();
            // 修改请求,设置新的URI
            ServerHttpRequest modifiedRequest = exchange.getRequest().mutate()
                    .uri(modifiedUri)
                    .build();
            // 用修改后的请求继续处理请求链
            return chain.filter(exchange.mutate().request(modifiedRequest).build());

        }

        @Override
        public int getOrder() {
            return 1;
        }
    }
    //解密的方法
    private String decrypt(String encryptedParam) {
        String returnResult = "";
        JSONObject json = JSONObject.parseObject(encryptedParam);
        String encrypt = json.getString("ENCRYPT");
        try {
            returnResult = AESCoder.decryptAES(encrypt, "F51riKYgKK8PRrt+5IC6CQ==");
            return returnResult;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return returnResult;
    }
}

4.接口层

java 复制代码
@RestController
@RequestMapping("smsinterface")
public class Test{

    @GetMapping("hello")
    public String test(@RequestParam("REQUEST")String result){
        System.out.println(result);
        return result;
        
        }

}

5. 测试

我这里是编写了一个测试类

java 复制代码
 public static void main(String[] args) throws Exception {
        try {
            JSONObject jo = new JSONObject();
            jo.put("param1", "测试啊");
            jo.put("param2", "1");
            JSONObject reqjo = new JSONObject();
            String encrypt = "";
            //加密请求参数
            encrypt = AESCoder.encrypt(jo.toString(), "F51riKYgKK8PRrt+5IC6CQ==");
            reqjo.put("ENCRYPT", encrypt);
            reqjo.put("SUMMARY", MD5.GetMD5Code(encrypt));
            String responseBody = "";
            // 请求参数
                String params = "REQUEST="
                        + URLEncoder.encode(reqjo.toString(), "UTF-8");
            String localUrl="htp://localhost:8081/smsinterface/hello"

                HttpClientCommon hc = new HttpClientCommon();
                responseBody = hc.responseBody(localUrl + "?" + params, params);
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println(responseBody);
            JSONObject json = JSONObject.fromObject(responseBody);
            String res = (String) json.get("RESPONSE=");
            res = URLDecoder.decode(res, "UTF-8");
            byte[] bytes = AESCoder.decrypt(res, "F51riKYgKK8PRrt+5IC6CQ==");
            String returnResult = new String(bytes, "UTF-8");
            System.out.println("返回参数:" + returnResult);
        }
相关推荐
橘猫云计算机设计23 分钟前
基于jspm校园安全管理系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·安全·毕业设计
幽络源小助理23 分钟前
SpringBoot学生宿舍管理系统的设计与开发
java·spring boot·后端·学生宿舍管理
猿java24 分钟前
源码分析:Spring IOC容器初始化过程
java·后端·spring
阿拉保31 分钟前
C++复试笔记(四)
java·c++·笔记
蓝莓浆糊饼干1 小时前
请简述一下String、StringBuffer和“equals”与“==”、“hashCode”的区别和使用场景
android·java
好多大米1 小时前
3.JVM-内部结构
java·jvm·性能优化
小薛博客1 小时前
Git常用操作之GitLab
java·git·gitlab·github·idea
小梁不秃捏2 小时前
Java 代理模式:从静态代理到动态代理
java·开发语言·代理模式
小徐Chao努力3 小时前
【Nexus】Maven 私服搭建以及上传自己的Jar包
java·maven·jar
onejason3 小时前
轻松掌握爬虫技术:如何根据关键词抓取商品列表
java·前端·python