系列文章目录
前言
项目实战经验较浅,也没有系统的就专业知识进行汇总,今日尝试养成写博客学习的习惯。
本部分内容是初次接触《黑马头条》的0基础学习笔记。由于已经完成了腾讯云的nacos搭建内容,以及项目文档的下载,因此直接从项目架构开始介绍。
一、项目结构
项目模块与具体功能如下:
common模块:全局异常处理的模块(详细功能描述后续补充)
feign-api模块:远程接口模块
gateway模块:网关微服务模块
model模块:表中实体类模块,例如用户表ApUser的实现、登录Dto,也包含常用的请求的响应结果实现(SUCCESS:200等字段的实现)
service魔模块:微服务相关工程实现模块,例如用户端微服务搭建(需新建模块)其微服务的标准结构如图所示
test模块:常用测试模块
utils模块:常用工具类模块
二、APP实现
1.接口测试工具
有三种方式:postman、swagger、knife4j
其中postman是软件,提供各种接口测试;
swagger是测试类,仅支持在线测试,会生成文档,需要导入依赖并添加注解
http://localhost:51801/swagger-ui.html;
knife4j是类似于swagger的一个实现,也支持离线接口文档下载
http://localhost:51801/doc.html
2.网关校验jwt
项目中网关的服务工程结构
由上到下分别为平台管理的网关、自媒体的网关和当前app的网关
目前实现app网关,首先导入依赖:
<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>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
</dependencies>
由上至下分别是gateway的starter微服务依赖;nacos注册中心;nacos配置中心;jwt解析的jar包
接下来设置引导类
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
public class AppGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(AppGatewayApplication.class,args);
}
}
其中@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})要加括号里的内容,否则会报错
3.全局过滤器实现jwt校验
在网关模块中实现上述流程,代码如下
@Component
@Slf4j
//注解是被spring管理以及打印日志,重写接口Ordered和GlobalFilter中的方法
//filter:判断token是否有效
//getOrder:优先级设置,值越小,优先级越高
public class AuthorizeFilter implements Ordered, GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//1.获取request和response对象
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
//2.判断是否是登录
if(request.getURI().getPath().contains("/login")){
//放行
return chain.filter(exchange);
}
//3.获取token
String token = request.getHeaders().getFirst("token");
//4.判断token是否存在
if(StringUtils.isBlank(token)){
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
//5.判断token是否有效
try {
Claims claimsBody = AppJwtUtil.getClaimsBody(token);
//是否是过期
int result = AppJwtUtil.verifyToken(claimsBody);
if(result == 1 || result == 2){
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
}catch (Exception e){
e.printStackTrace();
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
//6.放行
return chain.filter(exchange);
}
/**
* 优先级设置 值越小 优先级越高
* @return
*/
@Override
public int getOrder() {
return 0;
}
}
总结
还得再练