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用来完成警告发送以及关闭。