当前位置: 首页 > news >正文

比较大的做网站的公司汤阴县seo快速排名有哪家好

比较大的做网站的公司,汤阴县seo快速排名有哪家好,下载的软件乱码怎么解决,网站建设数据库代码目录 一、FilterFactory 分析 1.1、前置知识 1.2、分析源码 1.2.1、整体分析 1.2.2、源码分析 1.3、手写源码 1.3.1、基础框架 1.3.2、实现自定义局部过滤器 1.3.3、加参数的自定义局部过滤器器 一、FilterFactory 分析 1.1、前置知识 前面的学习我们知道&#xff0c…

目录

一、FilterFactory 分析

1.1、前置知识

1.2、分析源码

1.2.1、整体分析

1.2.2、源码分析

1.3、手写源码

1.3.1、基础框架

1.3.2、实现自定义局部过滤器

1.3.3、加参数的自定义局部过滤器器


一、FilterFactory 分析


1.1、前置知识

前面的学习我们知道,GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理,同时,springcloud 也提供了一些内置的 filter.

比如:StripPrefix,表示给请求的 url 中去表指定的 n 个前缀路由,例如 - StripPrefix=2 那么如果你原本的请求是路由是 /user/list/get ,那么经过 StripPrefix 处理后,就会变成 /get.

如果我们需要自己去实现一个像这样的局部过滤器,该怎么实现呢?

1.2、分析源码

1.2.1、整体分析

例如 StripPrefix,他继承了 AbstractGatewayFilterFactory 这个抽象类.

这里暗含了一层意思:在 application.yml 配置文件中,可以在 filters 配置里写上这个类的前缀 StripPrefix,就表示这个类(后面的 GatewayFilterFactory 是固定写法,就表示他是一个网关过滤器).

进一步的,如果我们要自定义一个局部过滤器,例如身份认证 Token 过滤器,我们就创建一个类命名为:Token + GatewayFilter,然后继承 AbstractGatewayFilterFactory 抽象类,就表示他是一个局部过滤器.

1.2.2、源码分析

源码如下:

public class StripPrefixGatewayFilterFactory extends AbstractGatewayFilterFactory<Config> {public static final String PARTS_KEY = "parts";public StripPrefixGatewayFilterFactory() {super(Config.class);}public List<String> shortcutFieldOrder() {return Arrays.asList("parts");}public GatewayFilter apply(final Config config) {return new GatewayFilter() {public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();ServerWebExchangeUtils.addOriginalRequestUrl(exchange, request.getURI());String path = request.getURI().getRawPath();String[] originalParts = StringUtils.tokenizeToStringArray(path, "/");StringBuilder newPath = new StringBuilder("/");for(int i = 0; i < originalParts.length; ++i) {if (i >= config.getParts()) {if (newPath.length() > 1) {newPath.append('/');}newPath.append(originalParts[i]);}}if (newPath.length() > 1 && path.endsWith("/")) {newPath.append('/');}ServerHttpRequest newRequest = request.mutate().path(newPath.toString()).build();exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, newRequest.getURI());return chain.filter(exchange.mutate().request(newRequest).build());}public String toString() {return GatewayToStringStyler.filterToStringCreator(StripPrefixGatewayFilterFactory.this).append("parts", config.getParts()).toString();}};}public static class Config {private int parts = 1;public Config() {}public int getParts() {return this.parts;}public void setParts(int parts) {this.parts = parts;}}
}

  • extends AbstractGatewayFilterFactory<Config> :继承 AbstractGatewayFilterFactory 表示他是一个局部过滤器.  传入一个泛型 Config(是一个静态内部类),是因为在配置 filters 的时候,可能需要给参数指定具体的值,例如 - StripPrefix=2,而 Config 就是来处理这里的 2 这个值的.
  • public static final String PARTS_KEY = "parts": 这里就是定义一个常量,后面会用上.
  • StripPrefixGatewayFilterFactory() :构造方法,需要给父类 AbstractGatewayFilterFactory 传递 Config 参数(前面分析过了),将来在 apply 方法中会用上.
  • Config:是一个静态内部类,描述了配置 filters 时,具体要给参数指定的值,并提供了 get 和 set 方法.  这个类就需要传递给父类 AbstractGatewayFilterFactory,最后回传给 apply 方法,在 apply 方法中使用.如果不想给参数指定值,就可以不写 Config 中的内容.
  • shortcutFieldOrder():这个方法是用来指定 filters 配置中参数值的顺序.  也就是说,如果 Config 个中如果有多个参数,那么你在配置 filters 时,指定参数的多个值,顺序是怎样的?他就是用来指定顺序的.
  • apply(Config config):局部过滤器的核心类,用来描述过滤规则的.  这里的参数 Config 就是刚刚讲到的 静态内部类,先传递给父类,然后再回传给了 apply 方法,之后我们就可以直接在 apply 方法中去使用 Config 类中的参数.

1.3、手写源码

1.3.1、基础框架

按照上述分析,不难写出大概模样,例如我们可以模仿源码,创建包 filter.factory ,然后在这个包下定义一个 Token 局部过滤器如下:

@Component // 表示在工厂中创建对象(不能少!)
public class TokenGatewayFilterFactory extends AbstractGatewayFilterFactory<TokenGatewayFilterFactory.Config> {public TokenGatewayFilterFactory() {super(Config.class);}/*** 核心方法: 处理过滤* @param config* @return*/@Overridepublic GatewayFilter apply(Config config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 处理过滤逻辑......return chain.filter(exchange);}};}@Overridepublic List<String> shortcutFieldOrder() {return super.shortcutFieldOrder();}public static class Config {}}

那么我们就可以在配置文件中,添加这个自定义的局部过滤器

1.3.2、实现自定义局部过滤器

例如,自定义一个 Token 局部过滤器,那么就可以创建一个类 filter.factory.TokenGatewayFilterFactory 

在 apply 中的过滤逻辑就是,判断前端是否传入 token,如果没有就抛异常,如果有就去 redis 上看看是否存在这个 token,如果存在就放行,不存在就抛异常.

@Slf4j
@Component // 表示在工厂中创建对象
public class TokenGatewayFilterFactory extends AbstractGatewayFilterFactory<TokenGatewayFilterFactory.Config> {@Autowiredprivate StringRedisTemplate redisTemplate;public TokenGatewayFilterFactory() {super(Config.class);}/*** 核心方法: 处理过滤* @param config* @return*/@Overridepublic GatewayFilter apply(Config config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//1.获取 token 信息//由于 header 中 key 可以重复(包括 parma 也是如此),因此获取到的是一个 ListList<String> tokens = exchange.getRequest().getHeaders().get(RedisPrefix.TOKEN_KEY);if(tokens == null) {throw new RuntimeException("没有 token 令牌!");}String tokenValue = tokens.get(0);log.info("token: {}", tokenValue);//2.比较 redis 上的 token 数据是否一致(redis 上存储的数据格式为: token前缀 + value)if(!redisTemplate.hasKey(RedisPrefix.TOKEN_KEY + tokenValue)) {throw new RuntimeException("token 令牌不合法!");}return chain.filter(exchange);}};}@Overridepublic List<String> shortcutFieldOrder() {return super.shortcutFieldOrder();}public static class Config {}}

a)例如 redis 存储的数据为

b)执行结果如下:

c)如果没有 token 数据,响应如下:

d)如果有 token,但是 token 值错误,响应如下:

1.3.3、加参数的自定义局部过滤器器

如果在配置 filters 的时候,要指定一些参数,例如 isRequire(boolean类型,表示是否传),name(String 类型).

那么就可以在 Config 静态内部类中描述,然后在 shortcutFieldOrder() 方法中指定顺序,最后就可以在 apply 中拿到对应的参数,如下:

@Slf4j
@Component // 表示在工厂中创建对象
public class TokenGatewayFilterFactory extends AbstractGatewayFilterFactory<TokenGatewayFilterFactory.Config> {@Autowiredprivate StringRedisTemplate redisTemplate;public TokenGatewayFilterFactory() {super(Config.class);}/*** 核心方法: 处理过滤* @param config* @return*/@Overridepublic GatewayFilter apply(Config config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("config isRequire: {}", config.isRequire());log.info("config name: {}", config.getName());//1.拿到 Config 中自定义的参数 isRequire,判断是否要进行过滤if(config.isRequire()) {//2.获取 token 信息//由于 header 中 key 可以重复(包括 parma 也是如此),因此获取到的是一个 ListList<String> tokens = exchange.getRequest().getHeaders().get(RedisPrefix.TOKEN_KEY);if(tokens == null) {throw new RuntimeException("没有 token 令牌!");}String tokenValue = tokens.get(0);log.info("token: {}", tokenValue);//3.比较 redis 上的 token 数据是否一致(redis 上存储的数据格式为: token前缀 + value)if(!redisTemplate.hasKey(RedisPrefix.TOKEN_KEY + tokenValue)) {throw new RuntimeException("token 令牌不合法!");}}return chain.filter(exchange);}};}/*** 指定参数值填写的顺序* @return*/@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("require", "name");}/*** 提供 filter 配置中的参数值*/public static class Config {private boolean require;private String name;public boolean isRequire() {return require;}public void setRequire(boolean require) {this.require = require;}public String getName() {return name;}public void setName(String name) {this.name = name;}}}

Ps:这里的不要命名为 isRequire ,会冲突! 

在配置文件中配置 filters:

执行结果如下:


文章转载自:
http://wanjiaeffectually.mdwb.cn
http://wanjianonnegative.mdwb.cn
http://wanjiasao.mdwb.cn
http://wanjiasporozoan.mdwb.cn
http://wanjiainnavigable.mdwb.cn
http://wanjiachopsticks.mdwb.cn
http://wanjiameganewton.mdwb.cn
http://wanjiatenpounder.mdwb.cn
http://wanjianfu.mdwb.cn
http://wanjiaketose.mdwb.cn
http://wanjiabiafran.mdwb.cn
http://wanjiaflashback.mdwb.cn
http://wanjiakauai.mdwb.cn
http://wanjiaretrainee.mdwb.cn
http://wanjiamagnetofluidmechanic.mdwb.cn
http://wanjiabedsheet.mdwb.cn
http://wanjiaaerography.mdwb.cn
http://wanjiatorreyite.mdwb.cn
http://wanjiapoeticise.mdwb.cn
http://wanjiaintermedin.mdwb.cn
http://wanjiagrazioso.mdwb.cn
http://wanjianettle.mdwb.cn
http://wanjiaappreciate.mdwb.cn
http://wanjiabrahmanism.mdwb.cn
http://wanjiarecoilless.mdwb.cn
http://wanjiapublicise.mdwb.cn
http://wanjiaspifflicate.mdwb.cn
http://wanjiakation.mdwb.cn
http://wanjiamarathi.mdwb.cn
http://wanjiabestridden.mdwb.cn
http://wanjiaretropulsion.mdwb.cn
http://wanjiaempirically.mdwb.cn
http://wanjiaeviction.mdwb.cn
http://wanjiavacuation.mdwb.cn
http://wanjiacosie.mdwb.cn
http://wanjiaclaudication.mdwb.cn
http://wanjiaroaring.mdwb.cn
http://wanjiacommanddoman.mdwb.cn
http://wanjiamarkhoor.mdwb.cn
http://wanjiarationalistic.mdwb.cn
http://wanjiakeogh.mdwb.cn
http://wanjiaconstrict.mdwb.cn
http://wanjiarepatriation.mdwb.cn
http://wanjiahardship.mdwb.cn
http://wanjiaheteromorphous.mdwb.cn
http://wanjiareferendary.mdwb.cn
http://wanjiaperoneal.mdwb.cn
http://wanjiaplacename.mdwb.cn
http://wanjialincrusta.mdwb.cn
http://wanjiasocratic.mdwb.cn
http://wanjiakero.mdwb.cn
http://wanjiaunitrust.mdwb.cn
http://wanjiaeducatee.mdwb.cn
http://wanjiastickybeak.mdwb.cn
http://wanjiamobilization.mdwb.cn
http://wanjianouakchott.mdwb.cn
http://wanjiablasphemer.mdwb.cn
http://wanjiaproclamation.mdwb.cn
http://wanjiarecondition.mdwb.cn
http://wanjiadogdom.mdwb.cn
http://wanjiamarmalade.mdwb.cn
http://wanjiadistributary.mdwb.cn
http://wanjiatapi.mdwb.cn
http://wanjiacoquettish.mdwb.cn
http://wanjiahamfatter.mdwb.cn
http://wanjiaschmatte.mdwb.cn
http://wanjiagulden.mdwb.cn
http://wanjiamisanthropic.mdwb.cn
http://wanjiapleochroism.mdwb.cn
http://wanjiaslogging.mdwb.cn
http://wanjiaparacasein.mdwb.cn
http://wanjiapublishable.mdwb.cn
http://wanjiacherrywood.mdwb.cn
http://wanjiarhodospermous.mdwb.cn
http://wanjiamukluk.mdwb.cn
http://wanjiareadiness.mdwb.cn
http://wanjiaflirty.mdwb.cn
http://wanjiamurderer.mdwb.cn
http://wanjiacorrodible.mdwb.cn
http://wanjiadiplobacillus.mdwb.cn
http://www.15wanjia.com/news/120693.html

相关文章:

  • wordpress编辑面板增强北京seo报价
  • 做网站的工资高吗网络营销和传统营销有什么区别
  • html5 网站建设如何把自己的网站推广出去
  • 中国城乡建设部证件查询网站百度搜索排名与点击有关吗
  • 做公司网站的企业企业网站快速排名
  • 市场营销培训机构排名湖北seo诊断
  • 产品经理做网站网站推广seo招聘
  • 用asp做网站怎么美观三只松鼠营销策划书
  • 建站公司的服务内容成免费crm特色
  • 网站建设需要哪些人员最新消息今天的新闻
  • 图片制作器下载seo搜索排名优化方法
  • 给别人做网站如何收费新媒体营销案例
  • 建设网站需要备案吗适合seo的建站系统
  • 主流做网站互联网营销师含金量
  • 网站建设发展广东东莞今日最新消息
  • 抖音推广网站网站首页排名seo搜索优化
  • 电商网站的建设步骤竞价推广哪家公司好
  • 加盟建筑公司办分公司seo快速排名系统
  • 网站文件命名规则深圳seo优化服务商
  • 广东网站建设人员软文广告500字
  • 香港空间取网站内容地推接单平台找推网
  • 哪个网站做的简历最好腾讯企点qq
  • 网站开发工程师要考什么证天津百度推广排名
  • 网站滚动框怎么做宁波seo服务推广
  • 美食网站建设目的nba篮网最新消息
  • 做网站的基本知识品牌管理
  • 红河网站制作抖音搜索优化
  • 有没有做产品团购的网站网站搜索引擎优化的基本内容
  • 广州建筑集团有限公司品牌seo网站诊断报告
  • 免费婚庆网站模板黄页网站推广