2014-03-25 33 views
1

我有一個通過Spring Security進行安全保護的Web應用程序。如何防止HTTP會話在WebSocket打開時到期

該應用程序創建一個WebSocket並將通知消息推送給客戶端。

然而,由於有時沒有頁面重新加載長一段時間,但只有WebSocket消息時,HTTP session到期和WebSocket被關閉。

有沒有辦法讓Spring Security只要連接了WebSocket即可保持會話正常運行,即使沒有HTTP請求進來?

這裏是我的Spring Security配置:

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
    .csrf().disable() 
    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) 
    .and() 
    .authorizeRequests() 
    .anyRequest() 
    .access("hasAnyRole('ROLE_ADMIN') or hasIpAddress('127.0.0.1/32') or hasIpAddress('192.168.0.0/24') or hasIpAddress('192.168.1.0/24')") 
    .and() 
    .formLogin().loginPage("/login") 
    .loginProcessingUrl("/checklogin") 
    .usernameParameter("user") 
    .passwordParameter("pass") 
    .defaultSuccessUrl("/", true) 
    .failureUrl("/login?failed=true") 
    .permitAll() 
    .and() 
    .logout() 
    .logoutUrl("/logout") 
    .logoutSuccessUrl("/login") 
    .deleteCookies("JSESSIONID") 
    .invalidateHttpSession(true) 
    .permitAll(); 
} 

當我在任何允許網絡我不是,我得到的登錄表單。一旦使用ROLE_ADMIN登錄後,我不再收到WebSocket消息。當我再刷新頁面,我重定向到登錄面具,所以最有可能的會話過期... :-)

+0

是喲確定發生了這種情況嗎?這看起來不太可能。 – EJP

+0

看到我更新的答案 – yglodt

回答

1

你可能想看看spring-session

的WebSocket - 提供在接收WebSocket消息時保持HttpSession活着的能力