2016-02-19 6 views
1

Я пробовал пример, предоставленный официальной ссылкой Spring Session. После входа в систему через http://localhost:8080/login кажется, что данные сеанса по-прежнему сохраняются в памяти, и никаких повторных взаимодействий (наблюдается через команду redis-cli monitor). Только JSESSIONID хранится в печеньеspring-session-data-redis не работает

Настройки ниже:

web.xml

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath:spring.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<servlet> 
    <servlet-name>springmvc</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>springmvc</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

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

spring.xml:

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

<security:authentication-manager> 
    <security:authentication-provider> 
     <security:user-service> 
      <security:user name="root" password="123456" authorities="ROLE_ADMIN"/> 
     </security:user-service> 
    </security:authentication-provider> 
</security:authentication-manager> 
<security:global-method-security secured-annotations="enabled"/> 
<security:http auto-config="true"> 
    <security:intercept-url pattern="/ping" access="hasRole('ROLE_ADMIN')"/> 
    <security:form-login default-target-url="/ping"/> 
    <security:csrf disabled="true"/> 
</security:http> 

<mvc:annotation-driven/> 

<context:component-scan base-package="io.hbprotoss.demo.controller"/> 

ответ

2

Вы должны объявить репозиторий сессии фильтр, например:

<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> 

Поскольку вы используете весеннюю безопасность, убедитесь, что фильтр репозитория сеанса объявлен перед фильтром безопасности (и любым другим фильтром (фильтрами), который может захотеть получить доступ к сеансу, иначе вы можете получить два сеанса, предоставленных контейнером сервлетов и один по весенней сессии.

Более подробную информацию можно найти здесь https://docs.spring.io/spring-session/docs/current/reference/html5/#xml-servlet-container-initialization

+0

Я не совсем понимаю, использование фильтра-имени. Оказывает ли это влияние на какую функцию использовать фильтр-класс? Поскольку у меня есть два фильтра с таким же классом фильтров, но с другим именем фильтра. – hbprotoss

+0

PS: он действительно работает – hbprotoss

+1

Вот что делает фильтр 'DelegatingFilterProxy' (проверьте его документы). На самом деле у вас есть настоящие фильтры, как весенние бобы. 'SpringSessionRepositoryFilter' создается из-за этой строки' ' – tsachev

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