《黑马头条》项目学习第四天

1.创建网关

(1)在heima-leadnews-gateway导入依赖(注意要在红圈内的pom文件上添加依赖) 

(2)在heima-leadnews-gateway下创建heima-leadnews-app-gateway微服务

(3)去nacos中心配置

(4)postman测试

2.认证过滤器校验

package com.heima.app.gateway.filter;

import com.heima.app.gateway.util.AppJwtUtil;
import io.jsonwebtoken.Claims;
import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
//标注为springboot里面的一个类
@Component
@Slf4j
public class AuthorizeFilter implements Ordered, GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //获取request和response对象
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        //判断是否已经登录
        if(request.getURI().getPath().contains("/login")){
            return chain.filter(exchange);
        }
        //获取token
        String token = request.getHeaders().getFirst("token");
        //判断token是否存在
        if (StringUtils.isBlank(token)){
            //发送失败401警告
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
//            结束
            return response.setComplete();
        }
        //判断token是否有效
        try {
            Claims claimsBody = AppJwtUtil.getClaimsBody(token);
            //判断是否过期
            int result = AppJwtUtil.verifyToken(claimsBody);
//        这个判断是根据工具里面设定来的
            if(result==1||result==2) {
                //发送失败401警告
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
//            结束
                return response.setComplete();
            }
        }catch (Exception e){
            e.printStackTrace();
            //发送失败401警告
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
//            结束
            return response.setComplete();
        }
        //放行,登陆成功
        return chain.filter(exchange);
    }
//    优先值设定,值越小,优先级越高

    @Override
    public int getOrder() {
        return 0;
    }
}

根据这张图设计代码。

注意细节: 

1.这里面有一些方法要用到util里面的工具,但是不能跨模块运用,所以要复制一份到网关模块

 

2.这个工具特殊用法

放行 :return chain.filter(exchange);

报错://发送失败401警告 response.setStatusCode(HttpStatus.UNAUTHORIZED);

                // 结束 return response.setComplete();

这里面的request和response都是可以直接通过工具的exchang.getXXXX直接获取

request用来判断是否登录:

request.getURI().getPath().contains("/login")

response用来完成警告发送以及关闭。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值