zoukankan      html  css  js  c++  java
  • 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

    过滤器的具体业务代码

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

     

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

    再打开浏览器输入:

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

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

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

     

  • 相关阅读:
    C# List转换成DataTable
    表达式计算
    通过GitHub高级条件组合精确搜索开源项目学习
    今天开通博客啦 随便记录一下东西
    VSCode开发Vue-代码格式化最完美设置
    C# DataTable 行转列 列转行 同时转换
    [转载]DevExpress GridControl 使用方法技巧 总结 收录整理
    控件已成功添加到工具箱中,但未在活动设计器中启用
    js-beautify 不换行
    tomcat端口修改后在Eclipse中启动无效问题解决
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/11735714.html
Copyright © 2011-2022 走看看