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

场景

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

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

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

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

前面使用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为例_第1张图片

 

 

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

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

 

 

再打开浏览器输入:

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

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

 

 

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

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

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

 

你可能感兴趣的:(SpringCloud-使用路由网关的服务过滤功能-拦截登录前是否有token为例)