美文网首页
zuul,过滤器

zuul,过滤器

作者: Axiao_徐垚 | 来源:发表于2018-12-25 11:47 被阅读0次

    阿潇个人最懂版本

    • 启动类加注解 @EnableZuulProxy
      若使用redis则加入(开启spring-session和redis的注解)@EnableRedisHttpSession

    • zuul 依赖

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
            </dependency>
    
    • zuul 完整的pom.xml
        <!--版本控制-->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.3.RELEASE</version>
            <relativePath/>
        </parent>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
        </properties>
    
    
        <dependencies>
    
            <!--支持全栈式Web开发,包括Tomcat和spring-webmvc。-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--eureka-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
            <!--  zuul-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
            </dependency>
    
            <!--支持常规的测试依赖,包括JUnit、Hamcrest、Mockito以及spring-test模块。-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <!--引入spring-session和redis的包,zuul网关和其他模块都需要映入:-->
            <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-data-redis</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
    
        </dependencies>
    
        <!--spring cloud 微服务-->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <!--Maven插件 能够将Spring Boot应用打包为可执行的jar或war文件,然后以通常的方式运行Spring Boot应用-->
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    • application.yml
    #注册到eureka
    eureka:
      client:
        service-url:
          defaultZone: http://127.0.0.1:8762/eureka/
    
    #端口号
    server:
      port: 8899
    
    #名字
    spring:
      application:
        name: ec-zuul
    
    #配置redis
      redis:
        database: 0
        host: 127.0.0.1
        port: 6379
        password: 12345
        jedis:
          pool:
            max-active: 8
        timeout: 50000ms
    
    
    #路由转发
    # 结合eureka 使用
    zuul:
      routes:
    #   可以随便起,但是规范是与服务名一样
        ec-user:
    #     拦截的路径 可以随便起,但是规范是与服务名一样
          path: /ec-user/**
    #     具体服务可以小写
          serviceId: EC-USER
    #设置cookie可以传递
      sensitive-headers:
    
    • 过滤器创建类AuthFilter(类名必须为AuthFilter)
    package com.mengmaec.eczuul;
    
    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 javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
    import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SERVLET_DETECTION_FILTER_ORDER;
    
    /**
     * @Auther: 18358
     * @Date: 2018/12/18 15:35
     * @Description:
     */
    @Component
    public class AuthFilter extends ZuulFilter {
    
        //    过滤器类型
        @Override
        public String filterType() {
            return PRE_TYPE;
        }
    
    //    过滤的顺序 越小越靠前
        @Override
        public int filterOrder() {
            return SERVLET_DETECTION_FILTER_ORDER - 1;
        }
    
        //    是否执行 具体的过滤逻辑 返回true==执行 ,反之
    //    默认true 中间可写具体需要拦截的服务
        @Override
        public boolean shouldFilter() {
            //        获取用户请求地址,判断是否是需要过滤的地址
    
            //共享RequestContext,上下文对象
    //        RequestContext requestContext = RequestContext.getCurrentContext();
    //        HttpServletRequest request = requestContext.getRequest();
    //        System.out.println(request.getRequestURI());
    //        String uri = request.getRequestURI();
    //        if (uri.equals("/ec-user/user/get_user_info")||uri.equals("/ec-user/user/logout")) {
    //            return true;
    //        }
    //        return false;
            
            return true;
        }
    
        //    过滤逻辑
        @Override
        public Object run() throws ZuulException {
            //        判断用户具有什么权限
            //JWT
            RequestContext requestContext = RequestContext.getCurrentContext();
            HttpServletRequest request = requestContext.getRequest();
    
            String uri = request.getRequestURI();
            HttpSession session = request.getSession();
    
            //需要权限校验的接口
            if (uri.equals("/ec-user/user/get_user_info")||uri.equals("/ec-user/user/logout"))
                //空 代表没有登录
                if (session.getAttribute("currentUser") == null) {
                    // 过滤该请求,不对其进行路由
                    requestContext.setSendZuulResponse(false);
                    //返回错误代码
                    requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
                }
            return null;
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:zuul,过滤器

          本文链接:https://www.haomeiwen.com/subject/fypxlqtx.html