日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Zuul:Pre和Post过滤器(下)

發(fā)布時(shí)間:2024/4/13 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Zuul:Pre和Post过滤器(下) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
可以看到所有的請(qǐng)求都會(huì)經(jīng)過他,那么我們現(xiàn)在要對(duì)這個(gè)請(qǐng)求做一個(gè)權(quán)限的校驗(yàn),加入沒有Zuul這個(gè)服務(wù),那你Server A/B/C,都要校驗(yàn)一次,這個(gè)每個(gè)服務(wù)都要做一次,所以權(quán)限校驗(yàn)我們可以放到Zuul統(tǒng)一的實(shí)現(xiàn)掉,接下來我們演示如何對(duì)請(qǐng)求進(jìn)行統(tǒng)一的校驗(yàn),我們現(xiàn)在來做這么一件事,希望所有經(jīng)過Zuul的請(qǐng)求,都要有一個(gè)參數(shù)叫做Token,并且內(nèi)容不能為空,如果你不帶這個(gè)參數(shù)的話,如果不帶這個(gè)參數(shù)的話,那么就權(quán)限校驗(yàn)不通過,我們新建一個(gè)包叫filter,下面新建一個(gè)TokenFilterimport 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;import javax.servlet.http.HttpServletRequest;import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils;import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext;@Component public class TokenFilter extends ZuulFilter {@Overridepublic String filterType() {return PRE_TYPE;}@Overridepublic int filterOrder() {return PRE_DECORATION_FILTER_ORDER - 1;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() {RequestContext requestContext = RequestContext.getCurrentContext();HttpServletRequest request = requestContext.getRequest();//這里從url參數(shù)里獲取, 也可以從cookie, header里獲取String token = request.getParameter("token");if (StringUtils.isEmpty(token)) {requestContext.setSendZuulResponse(false);requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());}return null;} }/*** {@code 401 Unauthorized}.* @see <a href="http://tools.ietf.org/html/rfc7235#section-3.1">HTTP/1.1: Authentication, section 3.1</a>*/ UNAUTHORIZED(401, "Unauthorized"),繼承ZuulFiltercom.netflix.zuul.ZuulFilter這里要實(shí)現(xiàn)幾個(gè)方法,實(shí)現(xiàn)這四個(gè)方法,這里有一個(gè)常量類FilterConstants,這里我們要做的是參數(shù)校驗(yàn),用這個(gè)PRE_TYPE@Override public String filterType() {return PRE_TYPE; }/*** {@link ZuulFilter#filterType()} pre type.*/ String PRE_TYPE = "pre";這個(gè)filterOrder這是順序,這個(gè)順序用什么順序呢,正如我們之前所說,一種過濾器一個(gè)類型下面,有很多個(gè)過濾器,這些都是pre的,這個(gè)ORDER我們填什么呢,我們把順序放到這個(gè)過濾器之前,這些順序越小的越靠前,越小的優(yōu)先級(jí)越高,放到他前面我們減1就好了@Override public int filterOrder() {return PRE_DECORATION_FILTER_ORDER - 1; }/*** Filter Order for {@link org.springframework.cloud.netflix.zuul.filters.pre.PreDecorationFilter}*/ int PRE_DECORATION_FILTER_ORDER = 5;這也是官方推薦的一個(gè)寫法,@Override public boolean shouldFilter() {return true; }這里就是我們的邏輯@Override public Object run() {RequestContext requestContext = RequestContext.getCurrentContext();HttpServletRequest request = requestContext.getRequest();//這里從url參數(shù)里獲取, 也可以從cookie, header里獲取String token = request.getParameter("token");if (StringUtils.isEmpty(token)) {requestContext.setSendZuulResponse(false);requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());}return null; }我們從一個(gè)對(duì)象里面拿到一個(gè)請(qǐng)求的內(nèi)容,叫做RequestContext,這也是Zuul他自己封裝的,獲取當(dāng)前的一個(gè)上下文,RequestContext requestContext = RequestContext.getCurrentContext();在從這里面拿到Request,拿到Request之后大家就熟了,從這我們就可以拿到Token了,這里寫點(diǎn)注釋,這里我們是從參數(shù)里面去拿,你也可以從Cookie或者h(yuǎn)eader里面獲取,基本上也就放到這里面了,獲取到了之后判斷一下,如果他是空的話呢,這個(gè)時(shí)候返回沒有權(quán)限,往requestContext這里面設(shè)置一些值就好了,首先設(shè)置sendZuulResponse為false,false是不通過,再設(shè)置一個(gè)HTTP的狀態(tài)碼,狀態(tài)碼權(quán)限不足我們一般是用401,我們也可以直接寫枚舉HttpStatus.UNAUTHORIZED.value()BAD_REQUEST(400, "Bad Request"), /*** {@code 401 Unauthorized}.* @see <a href="http://tools.ietf.org/html/rfc7235#section-3.1">HTTP/1.1: Authentication, section 3.1</a>*/ UNAUTHORIZED(401, "Unauthorized"),org.springframework.http.HttpStatus.UNAUTHORIZEDhttp://localhost:8040/myProduct/product/list?token=1234現(xiàn)在地址帶了token,沒問題和之前一樣http://localhost:8040/myProduct/product/list如果不帶TOKEN就401,返回的是401,權(quán)限沒有通過,會(huì)走這個(gè)校驗(yàn)的邏輯,你的業(yè)務(wù)類型可能也不只是判斷是否為空,你拿到這個(gè)值之后也可以從數(shù)據(jù)庫(kù)里面去讀,從Redis里面去比較,都是可以的,我們也可以自定義一個(gè)POST Filter,就是請(qǐng)求到了目標(biāo)服務(wù),返回了結(jié)果之后,對(duì)結(jié)果進(jìn)行加工,我們從返回的頭里面寫一些東西吧@Component public class AddResponseHeaderFilter extends ZuulFilter{@Overridepublic String filterType() {return POST_TYPE;}@Overridepublic int filterOrder() {return SEND_RESPONSE_FILTER_ORDER - 1;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() {RequestContext requestContext = RequestContext.getCurrentContext();HttpServletResponse response = requestContext.getResponse();response.setHeader("X-Foo", UUID.randomUUID().toString());return null;} }同樣的繼承ZuulFilter,type是POST_TYPE/*** {@link ZuulFilter#filterType()} post type.*/ String POST_TYPE = "post";org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.POST_TYPEfilterOrder這個(gè)也是比較有講究的,我們?cè)偃タ匆幌耾rder,如果我們自定義POST order的話,我們會(huì)把它放到這個(gè)之前,也就是放到這個(gè)fiter之前,所以我們選中這個(gè)再減1@Override public int filterOrder() {return SEND_RESPONSE_FILTER_ORDER - 1; }/*** Filter Order for {@link org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter#filterOrder()}*/ int SEND_RESPONSE_FILTER_ORDER = 1000;org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SEND_RESPONSE_FILTER_ORDER優(yōu)先級(jí)在他之前了,也是獲取requestContext@Override public Object run() {RequestContext requestContext = RequestContext.getCurrentContext();HttpServletResponse response = requestContext.getResponse();response.setHeader("X-Foo", UUID.randomUUID().toString());return null; }不是request,而是要拿到結(jié)果了,我們從返回的結(jié)果里面寫東西了,設(shè)置一個(gè)header,header名隨便設(shè)置一個(gè),生成一下隨機(jī)數(shù),這就寫完了http://localhost:8040/myProduct/product/list?token=1234結(jié)果是返回了,返回頭里面有沒有我們添加進(jìn)去的信息呢,Response Header有吧以上就是自定義POST Filter的內(nèi)容 <?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"><modelVersion>4.0.0</modelVersion><groupId>com.learn.cloud</groupId><artifactId>api-gateway</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><parent><groupId>cn.learn</groupId><artifactId>microcloud02</artifactId><version>0.0.1</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties> <dependencies><!-- <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency> --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><!-- <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId></dependency> --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zuul</artifactId></dependency></dependencies><!-- 這個(gè)插件,可以將應(yīng)用打包成一個(gè)可執(zhí)行的jar包 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project> package com.learn.cloud;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy;@EnableZuulProxy @SpringBootApplication public class APIGatewayApplication {public static void main(String[] args) {SpringApplication.run(APIGatewayApplication.class, args);}} package com.learn.cloud.filter;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;import javax.servlet.http.HttpServletRequest;import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils;import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext;@Component public class TokenFilter extends ZuulFilter {@Overridepublic String filterType() {return PRE_TYPE;}@Overridepublic int filterOrder() {return PRE_DECORATION_FILTER_ORDER - 1;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() {RequestContext requestContext = RequestContext.getCurrentContext();HttpServletRequest request = requestContext.getRequest();//這里從url參數(shù)里獲取, 也可以從cookie, header里獲取String token = request.getParameter("token");if (StringUtils.isEmpty(token)) {requestContext.setSendZuulResponse(false);requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());}return null;} } package com.learn.cloud.filter;import java.util.UUID;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Component;import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.POST_TYPE; import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SEND_RESPONSE_FILTER_ORDER;@Component public class AddResponseHeaderFilter extends ZuulFilter{@Overridepublic String filterType() {return POST_TYPE;}@Overridepublic int filterOrder() {return SEND_RESPONSE_FILTER_ORDER - 1;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() {RequestContext requestContext = RequestContext.getCurrentContext();HttpServletResponse response = requestContext.getResponse();response.setHeader("X-Foo", UUID.randomUUID().toString());return null;} } server.port=8040 spring.application.name=api-gateway eureka.instance.prefer-ip-address=true eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}} eureka.client.serviceUrl.defaultZone=http://admin:1234@10.40.8.152:8761/eureka #eureka.instance.appname=api-gateway #zuul.routes.user-route.service-id=product #zuul.ignoredServices=microservice-consumer-movie-ribbon-hystrix #zuul.routes.user-route.path=/user/** #zuul.routes.user-route.url=http://localhost:7900/ #ribbon.eureka.enabled=false #microservice-simple-provider-user.ribbon.listOfServers=http://localhost:7900/,http://localhost:7901/zuul.routes.myProduct.path=/myProduct/** zuul.routes.myProduct.service-id=product zuul.routes.myProduct.sensitiveHeaders= #zuul.routes.product=/myProduct/** management.security.enabled=false

?

總結(jié)

以上是生活随笔為你收集整理的Zuul:Pre和Post过滤器(下)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。