欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringCloud-使用路由网关的服务过滤功能-拦截登录前是否有token为例

程序员文章站 2023-02-02 09:27:54
场景 SpringCloud-使用路由网关统一访问接口(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102733039 在上面已经实现使用路由网关统一访问接口后,下面使用路由网关的服务过滤功能。 注: 博客: h ......

场景

springcloud-使用路由网关统一访问接口(附代码下载):

https://blog.csdn.net/badao_liumang_qizhi/article/details/102733039

在上面已经实现使用路由网关统一访问接口后,下面使用路由网关的服务过滤功能。

注:

博客:

关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

前面使用zuul实现路由统一网管功能。启示zuul还有一个功能是服务过滤功能。

只需要继承zuulfilter类并在类上添加@component注解就可以了。

在项目包下新建filter包,包下新建类loginfilter

package com.badao.hello.spring.cloud.zuul.filter;

import com.netflix.zuul.zuulfilter;
import com.netflix.zuul.context.requestcontext;
import com.netflix.zuul.exception.zuulexception;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
import org.springframework.stereotype.component;

import javax.servlet.http.httpservletrequest;
import java.io.ioexception;


@component
public class loginfilter extends zuulfilter {

    private static final logger logger = loggerfactory.getlogger(loginfilter.class);

    /**
     * 配置过滤类型,有四种不同生命周期的过滤器类型
     * 1. pre:路由之前
     * 2. routing:路由之时
     * 3. post:路由之后
     * 4. error:发送错误调用
     * @return
     */
    @override
    public string filtertype() {
        return "pre";
    }

    /**
     * 配置过滤的顺序
     * @return
     */
    @override
    public int filterorder() {
        return 0;
    }

    /**
     * 配置是否需要过滤:true/需要,false/不需要
     * @return
     */
    @override
    public boolean shouldfilter() {
        return true;
    }

    /**
     * 过滤器的具体业务代码
     * @return
     * @throws zuulexception
     */
    @override
    public object run() throws zuulexception {
        //获取httpservletrequest对象
        requestcontext context = requestcontext.getcurrentcontext();
        httpservletrequest request = context.getrequest();
        logger.info("{} >>> {}", request.getmethod(), request.getrequesturl().tostring());
        //获取请求参数token--令牌
        string token = request.getparameter("token");
        if (token == null) {
            logger.warn("token is empty");
            //s设置zuul响应为false
            context.setsendzuulresponse(false);
            //设置响应状态码为401-没有权限
            context.setresponsestatuscode(401);
            try {
                //向页面显示内容
                context.getresponse().getwriter().write("no authority");
            } catch (ioexception e) {
            }
        } else {
            logger.info("ok");
        }
        return null;
    }
}

 

注:

需要重写4个方法,具体作用如下。

在具体过滤方法中,这里是判断请求时是否有token参数,没有则是没有权限。

filtertype

配置过滤类型,有四种不同生命周期的过滤器类型
1. pre:路由之前
2. routing:路由之时
3. post:路由之后
4. error:发送错误调用

filterorder

配置过滤的顺序,数值越小越靠前。

shouldfilter

配置是否需要过滤:true/需要,false/不需要。

object run() throws zuulexception

过滤器的具体业务代码

至此整个服务体系的结构如下

 SpringCloud-使用路由网关的服务过滤功能-拦截登录前是否有token为例SpringCloud-使用路由网关的服务过滤功能-拦截登录前是否有token为例

 

 

我们依次启动eureka服务、服务提供者、两个服务消费者、zuul的application启动类

SpringCloud-使用路由网关的服务过滤功能-拦截登录前是否有token为例

 

 

SpringCloud-使用路由网关的服务过滤功能-拦截登录前是否有token为例

再打开浏览器输入:

http://localhost:8769/api/a/hi?message=hellozuul

SpringCloud-使用路由网关的服务过滤功能-拦截登录前是否有token为例

 

 

 此时如果带着token参数去请求,再次打开浏览器输入:

http://localhost:8769/api/a/hi?message=hellozuul&token=badao

SpringCloud-使用路由网关的服务过滤功能-拦截登录前是否有token为例

 SpringCloud-使用路由网关的服务过滤功能-拦截登录前是否有token为例