文档章节

Spring Cloud Gateway全局过滤器GlobalFilter:返回消息和重定向

夜雨寄北09
 夜雨寄北09
发布于 2018/09/21 11:27
字数 572
阅读 4.2K
收藏 12

Spring Cloud Gateway的全局过滤器GlobalFilter,顾名思义,声明后会对所有的请求生效,可以用来做权限控制,这里简单记录一下拦截到非法请求后如何返回自定义信息和将请求重定向到指定URL。spring-cloud-gateway版本为2.0.1.RELEASE。

一、返回401状态码和提示信息

只要将自定义的GlobalFilter声明成Spring Bean就会自动生效,Ordered接口用来指定拦截器生效顺序(数字越小优先级越高)。

这里假设用来验证权限的key是authToken。

import java.net.URI;
import java.nio.charset.StandardCharsets;

import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.util.UriComponentsBuilder;

import com.alibaba.fastjson.JSONObject;

@Component
public class AuthFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getQueryParams().getFirst("authToken");
        //返回401状态码和提示信息
        if (StringUtils.isBlank(token)) {
            ServerHttpResponse response = exchange.getResponse();
            JSONObject message = new JSONObject();
            message.put("status", -1);
            message.put("data", "鉴权失败");
            byte[] bits = message.toJSONString().getBytes(StandardCharsets.UTF_8);
            DataBuffer buffer = response.bufferFactory().wrap(bits);
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            //指定编码,否则在浏览器中会中文乱码
            response.getHeaders().add("Content-Type", "text/plain;charset=UTF-8");
            return response.writeWith(Mono.just(buffer));
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return -100;
    }
}

二、重定向(redirect)到指定页面

对于浏览器,通常是发现没有权限后跳转到登录页面。响应状态码需要为HttpStatus.SEE_OTHER(303)。

重定向(redirect)会丢失之前请求的参数,对于需要转发到目标URL的参数,需手工添加。

import java.net.URI;
import java.nio.charset.StandardCharsets;

import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

@Component
public class AuthFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getQueryParams().getFirst("authToken");
        //重定向(redirect)到登录页面
        if (StringUtils.isBlank(token)) {
            String url = "http://想跳转的网址";
            ServerHttpResponse response = exchange.getResponse();
            //303状态码表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源
            response.setStatusCode(HttpStatus.SEE_OTHER);
            response.getHeaders().set(HttpHeaders.LOCATION, url);
            return response.setComplete();
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return -100;
    }
}

 

© 著作权归作者所有

夜雨寄北09
粉丝 17
博文 17
码字总数 17016
作品 0
浦东
程序员
私信 提问
加载中

评论(0)

spring cloud gateway之filter篇

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址:http://blog.csdn.net/forezp。 https://blog.csdn.net/forezp/article/details/85057268 转载请标明出处...

方志朋
2018/12/17
0
0
微服务SpringCloud之GateWay服务化和过滤器

Spring Cloud Gateway 提供了一种默认转发的能力,只要将 Spring Cloud Gateway 注册到服务中心,Spring Cloud Gateway 默认就会代理服务中心的所有服务。 一、服务网关注册到注册中心 这里服...

社会主义接班人
2019/11/10
0
0
spring cloud gateway 全局过滤器

全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证,IP访问限制等等。 接口定义类:org.springframework.cloud.gateway.filter.Glob...

尹吉欢
2018/10/16
0
0
聊聊spring cloud gateway的GlobalFilter

序 本文主要研究一下spring cloud gateway的GlobalFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/Gateway......

go4it
2018/06/08
467
0
网关Spring Cloud Gateway科普

http://localhost:8082/user port: 9091spring:application: cloud: id: pathroute1 Path=/user import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplica......

朱小厮
04/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Argo 项目加入 CNCF 孵化器 | 云原生生态周报 Vol. 45

作者 | 陈洁、高相林、陈有坤、敖小剑 业界要闻 Argo 项目加入 CNCF 孵化器 Argo 项目是一组 Kubernetes 原生工具,用于运行和管理 Kubernetes 上的作业和应用程序。目前由 Argo Workflows,...

阿里巴巴云原生
5分钟前
7
0
css-方形边框四角

项目中遇到下图这种样式,刚开始想切图解决 后来想到更好的解决办法,代码如下: HTML: <div class="BoxWrap"> <div class="horn"> <div class="lt"></div> <div c......

osc_vo0yi5f8
6分钟前
5
0
离职10天,面挂4家公司!

作者:莫那鲁道 来源:http://1t.click/U4g 楼主离职已有 10 天,这段时间里除了看源码,就是投简历面试了。一共面试了 4 家,说说感受。 # XX 汇 XX 汇是一家小型的电商网站,由于楼主的技术...

Java技术栈
6分钟前
5
0
Navicat12 for Mysql激活

1 下载 注册机和Navicat网盘下载地址 链接:https://pan.baidu.com/s/1AFpQIlHCXVHc8OuBZ9PAlA 提取码:xvi2 2 安装 2.1 安装Navicat 安装完成后,将Navicat_Keygen_Patch_v4.8_By_DFoX复制到...

osc_mra0q9h6
7分钟前
13
0
学习第一周

监督学习(他们中有标签加以区分) 回归算法 我们给出一个数据集,里面包含了正确的答案,假如我们给他一个房价的数据集,在这个数据集中的每个样本,我们都给出正确的答案(房子的实际价格)...

osc_ocl8o73l
8分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部