• SpringCloud------自定义Zuul过滤器实现登录鉴权


    前提:

    已经配置Zuul网关

    参考:

    https://www.cnblogs.com/tianhengblogs/p/12495370.html

    1.添加登录过滤器

    import com.alibaba.fastjson.JSON;
    import com.netflix.zuul.ZuulFilter;
    import com.netflix.zuul.context.RequestContext;
    import com.netflix.zuul.exception.ZuulException;
    import org.apache.commons.lang.StringUtils;
    import org.springframework.http.HttpStatus;
    import org.springframework.stereotype.Component;
    import org.springframework.util.AntPathMatcher;
    
    import javax.servlet.http.HttpServletRequest;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
    
    /**
     * 登录过滤器
     */
    @Component
    public class LoginFilter extends ZuulFilter {
    
        /**
         * 过滤器类型,前置过滤器
         * @return
         */
        @Override
        public String filterType() {
            /*
                filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:自定义过滤器的实现,需要继承ZuulFilter,需要重写实现下面四个方法:
                pre:可以在请求被路由之前调用
                routing:在路由请求时候被调用
                post:在routing和error过滤器之后被调用
                error:处理请求时发生错误时被调用
            */
            return PRE_TYPE;
        }
    
        /**
         * 过滤器优先级,值越小,越优先
         * @return
         */
        @Override
        public int filterOrder() {
            return 0;
        }
    
        /**
         * 过滤器是否生效
         * true: 生效
         * false: 不生效
         * @return
         */
        @Override
        public boolean shouldFilter() {
    
            RequestContext context = RequestContext.getCurrentContext();
            HttpServletRequest request = context.getRequest();
    
            ///apigateway/order/api/v1/order/test
            System.out.println(request.getRequestURI());
            //http://127.0.0.1:9000/apigateway/order/api/v1/order/test
            System.out.println(request.getRequestURL());
    
            //ACL: 访问控制列表
            //不需要拦截的接口
            List<String> noFIlter = new ArrayList<>();
            noFIlter.add("/apigateway/product/**");
    
            AntPathMatcher matcher = new AntPathMatcher();
            for (String pattern : noFIlter) {//pattern--/user/**
                if (StringUtils.isNotEmpty(pattern)
                        && matcher.match(pattern, request.getRequestURI())) {
                    return false;
                }
            }
    
            return true;
        }
    
        /**
         * 业务逻辑
         * @return
         * @throws ZuulException
         */
        @Override
        public Object run() throws ZuulException {
    
            System.out.println("拦截了");
    
            //jwt权限设置
            RequestContext context = RequestContext.getCurrentContext();
            HttpServletRequest request = context.getRequest();
    
            //token
            String token = request.getHeader("token");
            if (StringUtils.isEmpty(token)) {
                token = request.getParameter("token");
            }
            if (StringUtils.isEmpty(token)) {
                Map<String, Object> result = new HashMap<>();
                result.put("code", 400);
                result.put("msg", "拦截了,没权限...");
    
                context.setSendZuulResponse(false);
                context.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
                context.setResponseBody(JSON.toJSONString(result));
                //解决中文乱码
                context.getResponse().setCharacterEncoding("UTF-8");
                context.getResponse().setContentType("text/html;charset=UTF-8");
            }
    
            return null;
        }
    }
  • 相关阅读:
    Web调试利器OpenWindow
    Caused by: java.lang.UnsatisfiedLinkError: Couldn't load BaiduMapVOS_v2_1_3: findLibrary returned nu
    exp
    paip.语义分析--分词--常见的单音节字词 2_deDuli 单字词 774个
    怎么计算Oracle的表一条记录占用空间的大小
    爱上WPF,努力才会有希望!
    大数据时代,你准备好了吗?
    将科学记数法的数字转换为字符串
    SQL Server安装
    AJAX
  • 原文地址:https://www.cnblogs.com/tianhengblogs/p/12501030.html
Copyright © 2020-2023  润新知