2016-05-18 6 views
3

habe ich ein Projekt mit Frühlings-Boot 1.3.3 [andere Sachen] und Redis konfiguriert Sitzungen zu verwalten, das heißt, @EnableRedisHttpSession. Die Anwendung funktioniert gut und speichert die Informationen regelmäßig auf Redis. Das Problem, das ich konfrontiert bin, ist, dass, anders als die Dokumentation sagt, ob ich eine server.session.timeout definieren, die Redis verwendet immer den Standardwert für seine Annotation-Attribut (maxInactiveIntervalInSeconds) ist :@EnableRedisHttpSession + Frühling Stiefel ignorieren server.session.timeout auf application.yml

hier ist die Dokumentation, die ich gefolgt: http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-session.html

ich habe auch den Ansatz von @rwinch hier https://github.com/spring-projects/spring-session/issues/110 aber auch ohne Erfolg definiert versucht.

Aktualisierung ......


Meine Konfigurationsdatei wie gewünscht:

#First attempt (server.session.timeout) following the Spring documentation mentioned 
server: 
    session: 
    timeout: 10 
spring: 
    #session timeout under spring (as mentioned by M Deinum in comment - unfortunately doesnt work) 
    session: 
    timeout: 10 
    redis: 
    host: 192.168.99.101 
    port: 6379 

Daneben habe ich auch versucht, eine SessionListener zu implementieren, die verantwortlich war Einstellen der Zeitüberschreitung (in etwa):

public class SessionListener implements HttpSessionListener { 
     @Value(value = "${server.session.timeout}") 
     private int timeout; 
     @Override 
     public void sessionCreated(HttpSessionEvent event) { 
      if(event!=null && event.getSession()!=null){ 
       event.getSession().setMaxInactiveInterval(timeout); 
      } 
     } 
... 

Es hat immer noch nicht zu einem korrekten Szenario geführt. Ich zerbringe mir wirklich den Kopf: |


Bitte Leute, vermisse ich einen Punkt? Hat jemand anderes es gesehen?

Vielen Dank im Voraus.

+0

Fügen Sie Ihre Konfiguration hinzu. –

+0

Statt 'server.session.timeout' verwenden Sie' spring.session.timeout'. –

+0

@ m-deinum danke für deine hilfe, leider ist das problem immer noch passiert. –

Antwort

2

Nun, nur falls jemand die gleiche Situation konfrontiert ist, haben wir zwei Möglichkeiten zur Umgehung:

I. Umsetzung der folgende:

@EnableRedisHttpSession 
public class Application { 
//some other codes here 
    @Value("${spring.session.timeout}") 
    private Integer maxInactiveIntervalInSeconds; 
    @Bean 
    public RedisOperationsSessionRepository sessionRepository(RedisConnectionFactory factory) { 
     RedisOperationsSessionRepository sessionRepository = new RedisOperationsSessionRepository(factory); 
     sessionRepository.setDefaultMaxInactiveInterval(maxInactiveIntervalInSeconds); 
     return sessionRepository; 
    } 

Leider habe ich einen Listener implementieren, um musste um zusätzliche Aktionen auszuführen, wenn eine Sitzung abläuft. Und wenn Sie ein RedisOperationsSessionRepository definieren, haben Sie keinen HttpSessionListener mehr (stattdessen haben Sie einen SessionMessageListener, wie hier beschrieben: http://docs.spring.io/spring-session/docs/current/reference/html5/#api-redisoperationssessionrepository). Aufgrund dieser Frage wurde der 2. Ansatz benötigt.

II. Um das Problem zu überwinden:

@EnableRedisHttpSession 
public class Application implements ApplicationListener{ 

    @Value("${spring.session.timeout}") 
    private Integer maxInactiveIntervalInSeconds; 

    @Autowired 
    private RedisOperationsSessionRepository redisOperation; 

    @Override 
    public void onApplicationEvent(ApplicationEvent event) { 
     if (event instanceof ContextRefreshedEvent) { 
      redisOperation.setDefaultMaxInactiveInterval(maxInactiveIntervalInSeconds); 
     } 
    } 
    ... 

Unter der Annahme, dass keiner von ihnen ist wünschenswert, out-of-Box-Einrichtung zumindest erlauben sie mich in meinem PoC fortzusetzen.

+0

Danke für Ihre Freigabe. Ich bin verwirrt, dass wenn wir ein RedisOperationsSessionRepository neu erstellen, wir 'HttpSessionListener' nicht mehr verwenden können, und warum die 2. Lösung das vermeiden kann, danke – DiveInto

+0

Hi @DiveInto Sorry, es ist nicht "so frisch" in meinem Aber soweit ich mich richtig erinnere, war das Problem, dass mein HttpSessionListener nicht mehr aufgerufen wurde, als ich zu RedisOperationsSessionRepository wechselte. Ich denke, dass die Dokumentation einen Hinweis bringt: RedisOperationsSessionRepository ist ein SessionRepository, das mit RedisOperations von Spring Data implementiert wird. In einer Webumgebung wird dies normalerweise in Kombination mit SessionRepositoryFilter verwendet. Die Implementierung unterstützt SessionDestroyedEvent und SessionCreatedEvent über SessionMessageListener. –

+0

Gegeben, dass ich meinen Listener, der bereits getan wurde (HttpSessionListener) umschreiben musste, um eine Art SessionMessageListener zu sein - es war nicht mein Wunsch. Mit dem zweiten Ansatz habe ich beobachtet, dass mein HttpSessionListener immer noch zugegriffen wurde und es erreicht, was ich will. Ich weiß, dass es verwirrend ist, weil sie auf der gleichen Objektklasse basieren. Vielleicht habe ich etwas irregeführt/missverstanden, aber später werde ich versuchen, meinen Zweig wiederzuerlangen, um ihn zu testen und besser zu erklären. Lassen Sie mich wissen, wenn (in gewisser Weise) ich ein wenig über die Notwendigkeit eines MessageListener geklärt habe. –

3

Eine andere Lösung:

@EnableRedisHttpSession 
public class HttpSessionConfig { 

    @Value("${server.session.timeout}") 
    private Integer maxInactiveIntervalInMinutes; 

    @Inject 
    private RedisOperationsSessionRepository sessionRepository; 

    @PostConstruct 
    private void afterPropertiesSet() { 
     sessionRepository.setDefaultMaxInactiveInterval(maxInactiveIntervalInMinutes * 60); 
    } 

Auf diese Weise können Sie die Standardkonfiguration verwenden, und nur Ihr Timeout hinzuzufügen.Sie pflegen also den Standard-HttpSessionListener, und Sie müssen keinen ApplicationListener verwenden, um das Zeitlimit im Anwendungslebenszyklus einmalig festzulegen.

0
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60) 
Verwandte Themen