美文网首页Spring Cloud
Spring Cloud Gateway设置session超时时

Spring Cloud Gateway设置session超时时

作者: 王广帅 | 来源:发表于2020-06-18 21:18 被阅读0次

    在使用Spring Cloud框架的时候,Http的请求首先会到达Spring Cloud Gateway服务,并与之建立session对象,但是在默认情况下,请求结果之后,session会立刻过期。有些业务场景可能会在session中存储一些数据,比如登陆状态,如果登陆之后,长时间没有访问,再次访问的时候,让用户重新登陆等,都需要控制session的空闲时间。在Spring Cloud Gateway中,默认管理session的类是InMemoryWebSessionStore,它里面的内部类InMemoryWebSession实现了WebSession接口。在这个接口,有两个方法,有来设置和获取session的最大空闲时间:

            @Override
            public void setMaxIdleTime(Duration maxIdleTime) {
                this.maxIdleTime = maxIdleTime;
            }
    
            @Override
            public Duration getMaxIdleTime() {
                return this.maxIdleTime;
            }
    
    

    所以,要想修改它的空闲最大时间,就需要调用setMaxIdleTime方法进行设置。
    另外,session过期检测的方法如下:

           @Override
            public boolean isExpired() {
                return isExpired(clock.instant());
            }
    
            private boolean isExpired(Instant now) {
                if (this.state.get().equals(State.EXPIRED)) {
                    return true;
                }
                if (checkExpired(now)) {
                    this.state.set(State.EXPIRED);
                    return true;
                }
                return false;
            }
    
            private boolean checkExpired(Instant currentTime) {
                return isStarted() && !this.maxIdleTime.isNegative() &&
                currentTime.minus(this.maxIdleTime).isAfter(this.lastAccessTime);
            }
    

    在这个代码里面有一个isStarted方法,在里面会判断,如果设置了session是start状态,或者session里面有属性值时,isStarted才返回true。

    遗憾的是,session的最大空闲值默认是不能在application.yml中直接配置的,如果想修改最大空闲,可以添加过滤器实现,如下所示:

    import java.time.Duration;
    
    import org.springframework.cloud.gateway.filter.GatewayFilter;
    import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
    import org.springframework.stereotype.Service;
    import org.springframework.web.server.WebSession;
    
    @Service
    public class SessionGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {
        @Override
        public GatewayFilter apply(Object config) {
            return (exchange, chain) -> {
                WebSession session = exchange.getSession().block();
                session.setMaxIdleTime(Duration.ofDays(7));
                return chain.filter(exchange);
            };
        }
    
    }
    

    然后在application.yml中添加下面的配置,让过滤器生效:

    spring:
       cloud:
          gateway:
            discovery:
              locator:
                enabled: true
            default-filters:
            - Session
    

    这样就成功修改了session的最大空闲时间了。一般session中存储了一些数据时,才需要设置最大空闲参数。

    公众号

    相关文章

      网友评论

        本文标题:Spring Cloud Gateway设置session超时时

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