我正在使用带有Spring安全性3.2.5的Hazelcast 3.4。当我部署应用程序并尝试登录时,登录成功但抛出异常,从而导致出现错误页面。无论我登录的错误页面和我的会话是“活着”。但是每次登录后我总是得到execption,结果是错误页面上的一块土地(我设置为出现未处理的异常)。
我在网络浏览器中的Hazelcast配置:
<filter>
<filter-name>hazelcast-filter</filter-name>
<filter-class>com.hazelcast.web.spring.SpringAwareWebFilter</filter-class>
<init-param>
<param-name>map-name</param-name>
<param-value>at-sessions</param-value>
</init-param>
<init-param>
<param-name>sticky-session</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cookie-name</param-name>
<param-value>hsessionId</param-value>
</init-param>
<init-param>
<param-name>cookie-http-only</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>instance-name</param-name>
<param-value>hazelcastInstance</param-value>
</init-param>
<init-param>
<param-name>shutdown-on-destroy</param-name>
<param-value>false</param-value>
</init-param>
</filter>
<listener>
<listener-class>com.hazelcast.web.SessionListener</listener-class>
</listener>
<filter-mapping>
<filter-name>hazelcast-filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
我在spring上下文中的hazelcast配置xml:
<hz:hazelcast id="hazelcastInstance">
<hz:config>
<hz:instance-name>hazelcastInstance</hz:instance-name>
<hz:group name="${hazelcast.group.name}" password="${hazelcast.group.password}"/>
<hz:properties>
<hz:property name="hazelcast.jmx">true</hz:property>
<hz:property name="hazelcast.logging.type">slf4j</hz:property>
</hz:properties>
<hz:network port="${hazelcast.port}">
<hz:join>
<hz:multicast enabled="false"/>
<hz:tcp-ip enabled="${hazelcast.tcp.ip.enabled}">
<hz:members>${hazelcast.tcp.ip.members}</hz:members>
</hz:tcp-ip>
<hz:aws enabled="${hazelcast.aws.enabled}"
access-key="${hazelcast.aws.access.key}"
secret-key="${hazelcast.aws.secret.key}"
region="${hazelcast.aws.region}"
tag-key="${hazelcast.aws.tag.key}"
tag-value="${hazelcast.aws.tag.value}"
/>
</hz:join>
</hz:network>
<hz:map name="at-sessions"
in-memory-format="${hazelcast.sessions.in.memory.format}"
backup-count="${hazelcast.sessions.backup.count}"
async-backup-count="${hazelcast.sessions.async.backup.count}"
time-to-live-seconds="${hazelcast.sessions.ttl.seconds}"
max-idle-seconds="${hazelcast.sessions.max.idle.seconds}"
eviction-policy="LRU"
max-size-policy="USED_HEAP_PERCENTAGE"
max-size="${hazelcast.sessions.max.size}"
eviction-percentage="${hazelcast.sessions.eviction.percentage}"
merge-policy="${hazelcast.sessions.merge.policy}"
/>
</hz:config>
</hz:hazelcast>
我得到以下异常:
Caused by: javax.servlet.ServletException: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.security.core.session.SessionRegistry] is defined
at org.apache.jsp.WEB_002dINF.views.common.general_002derror_jsp._jspService(general_002derror_jsp.java:195) ~[na:na]
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) ~[jasper.jar:7.0.57]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) [servlet-api.jar:na]
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) ~[jasper.jar:7.0.57]
... 97 common frames omitted
如果没有Hazelcast,登录工作完全正常。任何帮助将不胜感激。
答案 0 :(得分:2)
我遇到了同样的问题。原因是我使用DSL使用Spring Java Config for Spring Security。使用当前的Spring Security 4.0.1,Configurer将仅按需创建SessionRegistry,并且(看起来像)不是作为已注册的bean组件。
我已使用SessionRegistry的明确定义修复此问题。
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
.sessionFixation()
.migrateSession()
.maximumSessions(10)
.sessionRegistry(sessionRegistry()) // << this here!
.and()
.and()
和
@Bean
public SessionRegistry sessionRegistry() {
return new SessionRegistryImpl();
}
除非使用Hazelcast的WebFilter
,否则不需要这样做,因为Spring的SessionManagementConfigurer
将确保创建SessionRegistry
的实例。但是使用类型SessionRegistry
无法找到它。
答案 1 :(得分:0)
似乎一切都好。您已经配置了有关规格的所有内容。
此配置中没有最常见的错误,即使用 com.hazelcast.web.Webfilter ,而不是 com.hazelcast.web.SpringAwareWebFilter 在您的过滤器定义中。
此外,您可以检查“sessionRegistry”bean的定义是否以这种方式完成。
<beans:property name="sessionRegistry" ref="sessionRegistry"/>
在任何情况下,您都可以查看Hazelcast代码示例,以便逐步比较所有配置。
我希望它对你有用。 问候。
答案 2 :(得分:0)
如果对spring上下文使用xml配置,请确保定义
<bean id="sessionRegistry"
class="org.springframework.security.core.session.SessionRegistryImpl" />
在spring-security.xml
(或用于配置spring安全上下文的任何文件)