1. 安装nacos 2.1.2
下载ubuntu版的nocos,传到服务器,并解决。
1.1首先安装jdk: apt-get install openjdk-8-jdk
1.2 进行bin目录启动nacos: bash startup.sh -m standalone
1.3 根据输出日志 找到启动路径
2.开发gateWay
2.1 配置pom.xml
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<!-- <version>2021.1</version>-->
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<!-- <version>2021.1</version>-->
</dependency>
<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.18.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter
不引入spring-boot-starter-jdbc 会报错-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
<!--fegin组件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- Feign Client for loadBalancing -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
</dependencies>
这个版本nacos 一定要需要fegin组件,虽然用不到,不然做gateway路由的时候,会提示503,死活转发到后面的服务(uri使用lb://iotServer,如果使用真实地址是没有问题)。
server:
port: 8888 #网关地址
spring:
profiles:
active: dev
application:
name: gateway #服务名称
cloud:
nacos:
server-addr: 192.168.56.101:8848
gateway:
routes:
- id: iotServer
# uri: http://127.0.0.1:8099/
uri: lb://iotServer #路由目的地址
predicates:
- Path=/kaying/v1/huabang/** #遇到这样的url进行拦截与转发
jwt代码
//@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter , Ordered {
@Autowired
AuthorizeDao dao;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String requestUrl = exchange.getRequest().getURI().getPath();/*获取请求地址 财哥 2022/10/31 8:15*/
System.out.println("开始拦截");
System.out.println(requestUrl);
MultiValueMap<String,String> params = exchange.getRequest().getQueryParams();/*获取参数列表 财哥 2022/10/31 8:20*/
String loginUrl = "/kaying/v1/huabang/login";
if(loginUrl.equals(requestUrl)){/*进行身份验证 财哥 2022/10/31 8:17*/
if(!params.containsKey("userCode")){
JSONObject json = new JSONObject();
json.put("desc","用户名不能为空");
json.put("code","401");
return returnJsonResult(exchange,json.toJSONString());
}
String userCode = params.getFirst("userCode");
String password = params.getFirst("password");
//查数据库进行匹配
Map<String, Object> userMap = dao.queryForMap(String.format("select * from hb_user where user_code='%s' and user_pwd='%s' and is_job='1'",userCode,password));
if(userMap != null){
User user = new User();
// user.setUserName(userMap.get("user_name").toString());
user.setUserCode(userMap.get("user_code").toString());
user.setUserPwd(userMap.get("user_pwd").toString());
String token = JwtUtils.getToken(user);/*获取token 财哥 2022/10/31 13:04*/
exchange.getResponse().setStatusCode(HttpStatus.OK);
exchange.getResponse().getHeaders().set("Authorization",token);
}else{
JSONObject json = new JSONObject();
json.put("desc","用户名或密码错误");
json.put("code","401");
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return returnJsonResult(exchange,json.toJSONString());
}
return exchange.getResponse().setComplete();
}else{
if(!exchange.getRequest().getHeaders().containsKey("Authorization")){
JSONObject json = new JSONObject();
json.put("desc","无token值");
json.put("code","401");
return returnJsonResult(exchange,json.toJSONString());
}
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
System.out.println("token="+token);
if (null == token || "".equals(token.trim())) {
JSONObject json = new JSONObject();
json.put("desc","未登录");
json.put("code","401");
return returnJsonResult(exchange,json.toJSONString());
}
System.out.println("token1");
try{
System.out.println("token2");
JwtUtils.checkToken(token);/* 可以正常解析token就放行 财哥 2022/10/31 15:25*/
System.out.println("token3");
return chain.filter(exchange);/* 放行 财哥 2022/10/31 15:25*/
}catch (Exception ex){
System.out.println("token4");
JSONObject json = new JSONObject();
json.put("desc","token验证失败");
json.put("code","401");
return returnJsonResult(exchange,json.toJSONString());
}
}
}
/**
* 拦截并返回自定义的json字符串
*/
private Mono<Void> returnJsonResult(ServerWebExchange exchange, String msg) {
ServerHttpResponse response = exchange.getResponse();
// response.setStatusCode(HttpStatus.OK);
//这里在返回头添加编码,否则中文会乱码
response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
byte[] bytes = JSON.toJSONBytes(msg, SerializerFeature.WriteMapNullValue);
DataBuffer buffer = response.bufferFactory().wrap(bytes);
return response.writeWith(Mono.just(buffer));
}
@Override
public int getOrder() {
return -1;
}
}