1.pom文件介绍
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>GrainOnlineEducation_Parent</artifactId>
<groupId>com.grain</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>GrainOnlineEducation_Gateway</artifactId>
<dependencies>
<!--网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!--服务注册-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
2.代码分析
package com.grain.gateway.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
/**
* @author:Dragon Wen
* @email:18475536452@163.com
* @date:Created in 2020/3/14 15:05
* @description:
* @modified By:
* @version: $
*/
@Component
public class LoginFilter extends ZuulFilter {
//定义过滤器的类型
@Override
public String filterType() {
return PRE_TYPE; //PRE
}
//过滤器执行顺序,返回的值越小,越先执行
@Override
public int filterOrder() {
return 1;
}
//决定是否执行下面的run方法
//如果返回false,表示过滤器放行操作,不执行run方法
//如果返回true,过滤器没有放行,执行run方法
@Override
public boolean shouldFilter() {
//判断:访问路径包含/eduvod/vid/getPlayAuthFront进行登录校验
//1 获取请求的路径 uri,HttpServletRequest是请求对象
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
String requestURI = request.getRequestURI();
System.out.println("uri: "+requestURI);
String palyUrl = "/vod/get-play-auth/";
//2 根据获取请求路径判断,路径里面是否包含 /vod/get-play-auth/
if(!StringUtils.isEmpty(requestURI) && requestURI.contains(palyUrl)) {
//3 如果包含,进行验证操作,return true
return true; //run方法执行,进行校验
}
return false; //放行
}
//run方法写过滤器具体逻辑
@Override
public Object run() throws ZuulException {
System.out.println("run方法执行了.........");
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
String token = request.getParameter("token");
if(StringUtils.isEmpty(token)) {
//不能访问接口
currentContext.setSendZuulResponse(false); //不会向后执行
//设置不能访问状态码
currentContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
}
return null;
}
}
对前端发过来的请求进行网关过滤,根据自己的逻辑处理。
package com.grain.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
/**
* @author:Dragon Wen
* @email:18475536452@163.com
* @date:Created in 2020/3/14 13:15
* @description:
* @modified By:
* @version: $
*/
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
}
3.配置文件
application.properties:
server.port=9001
#环境设置:dev、test、prod
spring.profiles.active=dev
#服务的名称
spring.application.name=grain-api-gateway
### 配置URL 映射 ###(该功能类似于Nginx)
#这里的配置表示,访问path路径 直接重定向到url指定的地址
#如:访问 http://localhost:9001/teacher/list
# 重定向到 http://localhost:8001/teacher/list
#zuul.routes.api-edu.path=/teacher/**
#zuul.routes.api-edu.url=http://localhost:8001/teacher/
#指定注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8004/eureka/
#eureka服务器上获取的是服务器的ip地址,否则是主机名
eureka.instance.prefer-ip-address=true
### 环境隔离配置 ###
#禁止grain-statistics对外提供接口
#zuul.ignored-services=grain-statistics
### 禁止通过网关访问路由 ###
#zuul.ignored-patterns=/**/admin/**
### 自定义路由映射###
#zuul.routes.grain-teacher=/teacher-api/**
#还原被网关过滤的请求头
zuul.sensitive-headers=