spring cloud gateway 网关路由转发及request、response的加解密处理

springcloud gateway的介绍和原理及使用请自行查阅和学习,本章内容需在对spring cloud gateway的基本的了解和一定的知识基础上进行的。附上一个可供学习的博文:SpringCloud gateway (史上最全) - 疯狂创客圈 - 博客园

需求场景

前端对post请求的数据进行加密(主流的加密方式),后端需要解密,将接口的响应数据进行加密返回,前端解密并展示或其他操作等。出于安全性的考虑和可扩展性故使用了网关来做。

涉及到的问题

1、request的body数据流读取只能读取一次,controller层获取不到抛异常问题等

2、加解密采用对称加密算法是否前后端通用包括:ios、android、js

设计思路:(尽量使网关通用且可配置减少网关的代码修改和上线)

1、框架为springcloud+nacos+gateway+feign 后期可以加入hystrix等

2、在网关层进行对token的验证

3、在网关层进行统一解密request数据,并将header中添加特定数据,业务系统拦截器中进行对header的数据进行识别处理

4、业务系统返回数据后在网关层中对response数据进行加密返回,前端进行解密

直接上代码:(对token的验证)

启动类很普通,注册发现nacos相关注解

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}
server:
  port: 8080 #网关端口号

spring:
  application:
    name: k_men-gateway
    active: dev
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #本地nacos需要启动默认8848端口
      config:
        server-addr: localhost:8848 #本地nacos需要启动默认8848端口
        file-extension: yaml
        group: DEFAULT_GROUP
    gateway:
      discovery:
        locator:
          enabled: true #开启动态路由的功能

对token验证的自定义filter(代码中涉及到自定义的返回体或者返回错误码之类的自行替换)

@Slf4j
public class AuthGatewayFilterFactory extends AbstractGatewayFilterFactory<AuthGatewayFilterFactory.Config> {

    @Autowired
    private RedisUtils redisUtils;

    public AuthGatewayFilterFactory() {
        super(Config.class);
    }

    @Autowired
    private ModifyResponseBodyGatewayFilterFactory modifyResponseBodyGatewayFilterFactory;

    @Autowired
    private ObjectMapper objectMapper;

    /**
     * 具体的过滤逻辑
     * 1.如果没有登录令牌token,直接返回没有授权的信息
     * 2.如果有登录令牌token
     * 2.1通过令牌校验,继续向下执行
     * 2.2没有通过校验,返回没有通过校验的原因
     *
     * @param config 自定义配置类
     * @return 网关过滤器
     */
    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            String token = exchange.getRequest().getHeaders().getFirst("Authorization");
            ServerHttpResponse resp = exchange.getResponse();
            resp.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
            try {
                if (!exchange.getRequest().getPath().toString().contains("admin/login")){
                    if (StrUtil.isBlank(token) || JwtUtils.getAppTokenKey(token) == null || !token.equals(redisUtils.get(JwtUtils.getAppTokenKey(token)))) {
                        String result = JSONUtil.parseObj(R.fail(ErrorCodeEnum.TOKEN_ERROR.getCode(), "token error")).toStringPret
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值