2013-11-13 4 views
1

web.xml содержит:Остановка сеанс пролонгация весной проект

<session-config> 
    <session-timeout>30</session-timeout> 
</session-config> 

Spring security-context.xml имеет пользовательскую OAuth фильтр авторизации 2,0:

<sec:http use-expressions="true" auto-config="false" 
      entry-point-ref="oauthEntryPoint" 
      authentication-manager-ref="oauthAuthenticationManager"> 
    <sec:custom-filter position="FORM_LOGIN_FILTER" ref="myFilter" /> 
    ... 
</sec:http> 

Как уже сессия действует attemptAuthentication метода myFilter не был назван. Если сеанс истек attemptAuthentication, метод запросит REST API настраиваемого сервера OAuth 2.0, чтобы проверить действительность токена OAuth (затем перенаправить на страницу входа или продлить сеанс).

Сессия имеет тайм-аут 30 минут, токен OAuth имеет 1 дневной тайм-аут.

Если пользователь сохраняет активность в течение 30 минут - сеанс автоматически продлевается, и пользователь может войти в систему в течение многих дней, когда токен OAuth становится недействительным!

Как аннулировать сеанс с первого входа в систему не с момента последнего доступа к сайту?

UPDATE Посмотрите также на мой вопрос о http://forum.spring.io/forum/spring-projects/security/725894-help-with-stoping-sesstion-prolongation

Я прочитал Servlet 2.1 спецификации. Кажется, что сеанс управляется контейнером, который предоставляет API-интерфейс Servlet. Он имеет тайм-аут сеанса, чтобы избежать перегрузки памяти из старых неактивных сеансов.

Таким образом, у вас нет контроля над истечением срока действия сеанса. Для достижения моей цели я могу связать специальную временную отметку времени с сеансом и проверить ее на предмет истечения срока действия.

Но, как говорят, Уилл Килинг эта информация уже хранится в session:

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) { 
    HttpServletRequest request = (HttpServletRequest) req; 
    HttpSession session = request.getSession(false); 
    if (session == null) 
    logger.warn("session is null"); 
    else 
    logger.warn("session created at {}", session.getCreationTime()); 

ответ

2

Вы могли бы реализовать свой собственный сервлет фильтр, который проверяет время создания сеанса, а затем отменяют сеанс, если он доступен через определенное время период.

long oneDay = 86400000; 
if ((System.currentTimeMillis() - session.getCreationTime()) > oneDay) { 
    session.invalidate(); 
} 
+0

getCreationTime хранить необходимую информацию, спасибо! +1 – gavenkoa

+0

http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpSession.html#getCreationTime%28%29 – gavenkoa

Смежные вопросы