2016-01-28 5 views
1

Я использую весну с сессиями redis. Если я получаю доступ к сайту, я вижу, что сеансы добавляются в базу данных. Затем я запустил flushdb в базе данных. Затем я пытаюсь получить доступ к сайту, и сеансы все еще живы (у меня одинаковый идентификатор сеанса.) Клавиши redis отличаются, но идентификаторы сеанса совпадают. Сохраняется ли сессия в другом месте, а не в redis? Ожидается ли это?Почему моя сессия все еще жива

Использование windows 64 bit redis 2.8.2400.

некоторые зависимости pom.

<dependency> 
     <groupId>org.springframework.data</groupId> 
     <artifactId>spring-data-redis</artifactId> 
     <version>1.6.2.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-pool2</artifactId> 
     <version>2.2</version> 
    </dependency> 

    <dependency> 
     <groupId>redis.clients</groupId> 
     <artifactId>jedis</artifactId> 
     <version>2.8.0</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.session</groupId> 
     <artifactId>spring-session-data-redis</artifactId> 
     <version>1.0.2.RELEASE</version> 
    </dependency> 


    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-config</artifactId> 
     <version>4.0.3.RELEASE</version> 
    </dependency> 
<!-- --> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-web</artifactId> 
     <version>4.0.3.RELEASE</version> 
    </dependency> 

Relavent Фасоль

<beans:bean id="RedisHttpSessionConfiguration" 
    class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" /> 
<beans:bean 
    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" 
    p:port="6379" /> 

некоторых web.xml

<listener> 
     <listener-class>com.mysite.listeners.sessionStarted</listener-class> 
    </listener> 

<filter> 
     <filter-name>springSessionRepositoryFilter</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>springSessionRepositoryFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

функция управления для закрытия сессии

RequestMapping(value = "/closeSession", method = RequestMethod.GET) 
    public String closeSession(HttpSession session, HttpServletRequest request) { 
     logger.info("Closeing Session (greri002 for testing)."); 
     session.invalidate(); 
     //request.logout(); 
     SecurityContextHolder.getContext().setAuthentication(null); 
     return "OK"; 
    } 
+0

Вы используете пружинную защиту? какой сервер вы используете? – denov

+0

imo - java config намного приятнее и xml config для весны. – denov

ответ

0

Spring безопасности управляет вашими сессиями хранения данных в Redis , Вам нужно всего лишь добавить что-то вроде redis, если вы планируете делиться данными сеанса между узлами.

Безопасность SpringContext, где хранится информация о безопасности. https://docs.spring.io/spring-security/site/docs/current/apidocs/org/springframework/security/core/context/SecurityContext.html

Предполагая, что вы используете сервер с поддержкой сервлетов 3.0, вам просто нужно вызвать logout() для объекта HttpServletRequest. Пружинный MVC образец -

@RequestMapping(value="/me/logout", method=RequestMethod.GET) 
public @ResponseBody String logout(HttpServletRequest request) throws ServletException { 
    request.logout(); 
    return "OK"; 
} 

http://docs.spring.io/spring-security/site/docs/3.2.1.CI-SNAPSHOT/reference/htmlsingle/#servletapi-logout

Если у вас нет доступа к HttpServletRequest вы можете сделать

SecurityContextHolder.getContext().setAuthentication(null); 

Также убедитесь, что вы выйти из системы для HTTP конфигурации config'ed правильно , он мой

<sec:logout logout-url="/logout" 
       delete-cookies="JSESSIONID,jsessionid" 
       invalidate-session="true" 
       success-handler-ref="myLogoutFilter"/> 
+0

У меня есть карта/closeSession, которая вызывает 'session.invalidate();' Почему это тоже не работает? –

+0

Я пробовал, но это не сработало, добавив код для публикации. –

+0

Я использую request.logout() с spring4 и tomcat8. ваш сервер приложений должен поддерживать Servlet 3.0 – denov

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