Zuul學習(一)——登陸鑑權

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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章