1.項目模塊圖
2.首先得有一個eureka的服務,所有的服務都是註冊到eureka上的
3.在pom.xml中引入zuul相關的依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
4.編寫application.yml,這裏先配置user模塊的路由地址
spring:
application:
name: zuul
# 服務端口號
server:
port: 9050
#Eureka 相關配置
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka/
# 構建路由地址
zuul:
routes:
# 這裏可以自定義
user: /api/user/**
5.在啓動類添加相應的註解
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
6.編寫過濾器
@Component
public class AccessFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return -1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
// 獲取請求上下文
RequestContext rc = RequestContext.getCurrentContext();
HttpServletRequest request = rc.getRequest();
// 獲取表單中的 token
String token = request.getParameter("token");
// 業務邏輯處理
if (null == token) {
// 請求結束,不在繼續向下請求。
rc.setSendZuulResponse(false);
// 響應狀態碼,HTTP 401 錯誤代表用戶沒有訪問權限
rc.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
// 響應類型
rc.getResponse().setContentType("application/json; charset=utf-8");
try (PrintWriter writer = rc.getResponse().getWriter()) {
writer.print(JSON.toJSONString(new Result(401, "未攜帶token")));
} catch (IOException e) {
e.printStackTrace();
}
}
//TODO 通過token查詢用戶的信息,用戶不存在也返回錯誤信息
return null;
}
}