1. 程式人生 > >基於Spring Cloud技術棧的自定義ZuulFilter的使用

基於Spring Cloud技術棧的自定義ZuulFilter的使用

ZuulFilter基礎

Zuul作為整個微服務架構的閘道器實現,是整個後臺系統的入口,因此,經常會有對所有經過閘道器的請求進行操作的場景。這裡,我們可以繼承ZuulFilter類來實現自定義的過濾器。

Zuul定義的四種Filter的型別:

PRE:在請求被路由之前呼叫,可以使用這種過濾器實現身份驗證、在叢集中選擇請求的微服務、記錄除錯Log等。
ROUTE:將請求路由到對應的微服務,用於構建傳送給微服務的請求。
POST:在請求被路由到對應的微服務以後執行,可用來為Response新增HTTP Header、將微服務的Response傳送給客戶端等。
ERROR

:在其他階段發生錯誤時執行該過濾器。

從下圖中可以明確瞭解Zuul中各種Filter執行的順序:

Zuul中各種Filter執行的順序

具體實現

LoginFilter.java:

package com.example.filters;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER;
import
static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE; /** * Created by Skye on 2018/1/11. */ public class LoginFilter extends ZuulFilter { /** * 指定該Filter的型別 * ERROR_TYPE = "error"; * POST_TYPE = "post"; * PRE_TYPE = "pre"; * ROUTE_TYPE = "route"; */
@Override public String filterType() { return PRE_TYPE; } /** * 指定該Filter執行的順序(Filter從小到大執行) * DEBUG_FILTER_ORDER = 1; * FORM_BODY_WRAPPER_FILTER_ORDER = -1; * PRE_DECORATION_FILTER_ORDER = 5; * RIBBON_ROUTING_FILTER_ORDER = 10; * SEND_ERROR_FILTER_ORDER = 0; * SEND_FORWARD_FILTER_ORDER = 500; * SEND_RESPONSE_FILTER_ORDER = 1000; * SIMPLE_HOST_ROUTING_FILTER_ORDER = 100; * SERVLET_30_WRAPPER_FILTER_ORDER = -2; * SERVLET_DETECTION_FILTER_ORDER = -3; */ @Override public int filterOrder() { return PRE_DECORATION_FILTER_ORDER - 1; } /** * 指定需要執行該Filter的規則 * 返回true則執行run() * 返回false則不執行run() */ @Override public boolean shouldFilter() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); String requestUrl = request.getRequestURL().toString(); // 請求URL內不包含login或join則需要經過該過濾器,即執行run() return !requestUrl.contains("login") && !requestUrl.contains("join"); } /** * 該Filter具體的執行活動 */ @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); HttpSession httpSession = request.getSession(); // 若session中不包含userId,則這次請求視為未登入請求,不給予路由,而提示“請登入” if (httpSession.getAttribute("userId") == null) { ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(200); // 為使得中文字元不亂碼 ctx.getResponse().setCharacterEncoding("UTF-8"); ctx.setResponseBody("請登入"); } return null; } }

SpringcloudZuulApplication.java中需要包含以下程式碼即可使該Filter生效。

@Bean
public LoginFilter loginFilter() {
    return new LoginFilter();
}

相關推薦

基於Spring Cloud技術定義ZuulFilter的使用

ZuulFilter基礎 Zuul作為整個微服務架構的閘道器實現,是整個後臺系統的入口,因此,經常會有對所有經過閘道器的請求進行操作的場景。這裡,我們可以繼承ZuulFilter類來實現自定義的過濾器。 Zuul定義的四種Filter的型別: P

spring-cloud中zuul定義service級別,api級別的路由白名單

als tex let simple 配置 api ring mat ng- 主要實現對在白名單中的service級別或者api級別的網關路由。 一.service和api級別的路由 1.service級別的網關路由 public class ServiceIdWhiteT

【視訊免費分享】基於Spring Boot技術 部落格系統企業級前後端實戰

推薦視訊連結 Java 微服務實踐視訊教程 - Spring Boot Java 微服務實踐 視訊教程- Spring Cloud redis高可用視訊 分散式電商商城視訊教程 kubernets+docer jvm 秒殺專案實戰 Lin

基於Spring Boot技術 部落格系統企業級前後端實戰 漸進式講解+Thymeleaf+Elasticsearch+多種資料庫

第1章 Spring Boot 簡介講解Spring Boot的專案背景,已經與其他技術框架(比如,Spring、SpringMVC、SpringCloud等)的關係。簡單介紹下Spring Boot 整個生態系統1-1 _Spring Boot部落格_課程導學1-2 -Spring Boot 是什麼 第2

慕課網實戰課程之基於Spring Boot技術部落格系統企業級前後端實戰

慕課網實戰課程專案-基於Spring boot部落格的搭建教程 技術棧 後端: SpringBoot+ElasticSearch+SpringSecurity 前端: Thymeleaf/Bootstrap/jQuery 資料庫:MySQL/MongoD

Spring Cloud技術還沒有學完!Hystrix又雙叒叕停止更新了!

作者:徐劉根 | 微信公眾號 :Java後端技術(ID:JavaITWork) 今天無意間翻了一下Hystrix程式碼倉庫,無意間看到最近的一條變更,竟然發現Hystrix也不再進行活躍的更新了,停止開發新功能了!後期只是進行維護了!!! 這是繼

spring cloud的Eureka定義介面,啟動介面定義

spring cloud eureka server註冊中心的介面不太好看,想自定義。經檢視原始碼發現(原始碼位於spring-cloud-netflix-eureka-server),servers的首頁由template/eureka目錄下的四個ftl檔案組成 將裡面的檔案改稱自己

【 專欄 】- 快速學習 Spring Cloud 技術

快速學習 Spring Cloud 技術棧 這裡分享 Spring Cloud 開發經典案例,示例程式碼:https://github.com/ityouknow/spring-cloud-examples

spring cloud中Ribbon定義負載均衡策略

一、Ribbon中的負載均衡策略 1、Ribbon中支援的負載均衡策略 AvailabilityFilteringRule:過濾掉那些因為一直連線失敗的被標記為circuit tripped的後端s

Spring AOP 基於註解實現日誌記錄+定義註解

一、寫一個自定義註解        註解中包括配置方法所在模組名稱,以及功能名稱,當然我們在註解裡可以自定義。import java.lang.annotation.Documented; import java.lang.annotation.ElementType; im

Spring Boot下如何定義Repository中的DAO方法

hibernate reat 軟件測試 bst pass update pop 後綴 mark 環境配置介紹 jdk 1.8, spring Boot 1.5.3.RELEASE, MySQL, Spring Data, JPA 問題描述 Spring Data提供了一套簡

基於Spring Cloud的微服務構建學習-2 Spring Boot

html art ann 發布 class start pid 問題 需要 基於Spring Cloud的微服務構建學習-2 Spring Boot 為什麽使用Spring Boot而不是Spring   Spring Boot具有自動化配置,快速開發,輕松部署優點,非

Spring Boot筆記之定義啟動banner

bottom rule mage ack eight ooo manifest log blank 控制banner內容 Spring Boot啟動的時候默認的banner是spring的字樣,看多了覺得挺單調的,Spring Boot為我們提供了自定義banner的功

Spring Boot中的定義start pom

sin string cond aps 標註 bind rip ges 由於 start pom是springboot中提供的簡化企業級開發絕大多數場景的一個工具,利用好strat pom就可以消除相關技術的配置得到自動配置好的Bean。 舉個例子,在一般使用中,我們使用基

基於Spring Cloud、JWT 的微服務權限系統設計

pri ref -c log4 bsp open 微服務 range tee 基於Spring Cloud、JWT 的微服務權限系統設計 https://gitee.com/log4j/pig https://github.com/kioyong/spring-c

Spring Security技術開發企業級認證與授權

iyu 復雜 sha 日誌 開發app 一個 核心概念 並發 自動 Spring Security技術棧開發企業級認證與授權網盤地址:https://pan.baidu.com/s/1mj8u6JQ 密碼: 92rp備用地址(騰訊微雲):https://share.weiy

如何在SAP Cloud for Customer定義BO中創建訪問控制

global ssp 我會 TP BE lis 訪問權限 author ext 文章作者: Yi 已獲得Yi的轉載許可。 訪問控制方式和使用註意事項 1. C4C中的訪問控制有兩種方式 RelevantForAccessControl AccessControlConte

實戰:基於spring cloud + docker構建微服務

系列 速度 oss 分享 -s 本地 border 檢查 pad 本系列記錄學習 spring-cloud-microservice-example的實戰過程,並對利用spring cloud + docker 構建端到端的微服務架構技術進行解析。0.安裝前的準備,下列軟件

譯:基於Spring Cloud Stream構建和測試 message-driven 微服務

sage rabbit 下一步 總結 sting partition for 入參 tde 原文鏈接:https://piotrminkowski.wordpress.com/2018/06/15/building-and-testing-message-driven-mi

基於同步器AbstractQueuedSynchronizer 實現定義

AbstractQueuedSynchronizer(AQS) 同步器 是JAVA5 實現鎖關建。利用同步器將所得語義(Semantic) 實現, 然後在自定義鎖的實現中聚合AQS同步器。這裡推薦一篇非常好的關於AQS的文章: http://ifeve.com/introduce-abstr