Spring mvc Apache Ignite Spring安全错误

Spring mvc Apache Ignite Spring安全错误,spring-mvc,spring-security,ignite,distributed-system,distributed-cache,Spring Mvc,Spring Security,Ignite,Distributed System,Distributed Cache,我试图开发一个具有spring安全登录功能的应用程序,同时使用ApacheIgnite分发用户会话 服务器:ApacheTomcat8 Spring版本:4.2.2.0版本 点火版本:2.1.0 我的申请中有两个错误 从应用程序注销时记录异常。除此之外,会话失效按预期进行 2017年8月12日14:09:01.580严重[http-nio-8080-exec-2]org.apache.ignite.logger.java.JavaLogger.error更新web会话失败:null java

我试图开发一个具有spring安全登录功能的应用程序,同时使用ApacheIgnite分发用户会话

  • 服务器:ApacheTomcat8
  • Spring版本:4.2.2.0版本
  • 点火版本:2.1.0
我的申请中有两个错误

  • 从应用程序注销时记录异常。除此之外,会话失效按预期进行
  • 2017年8月12日14:09:01.580严重[http-nio-8080-exec-2]org.apache.ignite.logger.java.JavaLogger.error更新web会话失败:null java.lang.NullPointerException 位于org.apache.ignite.cache.websession.WebSessionFilter$RequestWrapperV2.getSession(WebSessionFilter.java:1001) 位于org.apache.ignite.cache.websession.WebSessionFilter.doFilterV2(WebSessionFilter.java:564) 在org.apache.ignite.cache.websession.WebSessionFilter.doFilterDispatch(WebSessionFilter.java:407) 位于org.apache.ignite.cache.websession.WebSessionFilter.doFilter(WebSessionFilter.java:383) 位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) 位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 位于org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) 位于org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 位于org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) 位于org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624) 位于org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) 位于org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) 位于org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 位于org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) 位于org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) 位于org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 位于org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 运行(Thread.java:748)

  • 当两台具有相同应用程序部署的tomcat服务器在两个不同端口启动时,只能从一台服务器访问登录页面。 (若我从第一台服务器访问登录页面,页面将按预期加载。但若我再次尝试从第二台服务器访问登录页面,则会出现错误。然而,一旦登录,应用程序将按预期工作,并且可以从两台服务器访问分布式会话。)。
  • 首次访问
  • 从另一台服务器进行第二次访问
  • 我的配置文件如下

  • Spring上下文配置

    <beans xmlns.... >
    <context:component-scan base-package="test.ignite.spring"/>
    <mvc:annotation-driven/>
    <context:property-placeholder location="classpath:system.properties" ignore-resource-not-found="true" ignore-unresolvable="true"/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- Cache of HTML pages -->
            <mvc:mapping path="/**"/>
            <bean class="org.springframework.web.servlet.mvc.WebContentInterceptor">
                <property name="cacheSeconds" value="0"/>
            </bean>
        </mvc:interceptor>
    </mvc:interceptors>
    </beans>
    
  • ----更新---

  • 点火配置(整个文件内容)

    
    127.0.0.1:47500..47509
    

  • Spring安全配置

    <beans:beans xmlns.... >
    <http auto-config="true" create-session="always" use-expressions="true" >
       <form-login login-page="/login" default-target-url="/home" authentication-failure-url="/login?error" username-parameter="username" password-parameter="password" always-use-default-target="true"/>
    
       <logout invalidate-session="true" logout-success-url="/login" delete-cookies="JSESSIONID"/>
    
       <session-management session-fixation-protection="newSession" invalid-session-url="/" session-authentication-error-url="/login">
           <concurrency-control session-registry-alias="sessionRegistry" max-sessions="10" expired-url="/" error-if-maximum-exceeded="true"/>
       </session-management>
    
       <access-denied-handler error-page="/403"/>
    </http>
    <authentication-manager>
       <authentication-provider user-service-ref="userDetailsService">
       </authentication-provider>
    </authentication-manager>
    </beans:beans>
    
    
    
  • web.xml

    <web-app xmlns... >
    <listener>
        <listener-class>org.apache.ignite.startup.servlet.ServletContextListenerStartup</listener-class>
    </listener>
    
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
    </listener>
    
    <filter>
        <filter-name>IgniteWebSessionsFilter</filter-name>
        <filter-class>org.apache.ignite.cache.websession.WebSessionFilter</filter-class>
    </filter>
    
    <!-- You can also specify a custom URL pattern. -->
    <filter-mapping>
        <filter-name>IgniteWebSessionsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-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>
    
    <!-- Specify Ignite configuration (relative to META-INF folder or Ignite_HOME). -->
    <context-param>
        <param-name>IgniteConfigurationFilePath</param-name>
        <param-value>example-ignite.xml</param-value>
    </context-param>
    
    <!-- Specify the name of Ignite cache for web sessions. -->
    <context-param>
        <param-name>IgniteWebSessionsCacheName</param-name>
        <param-value>example</param-value>
    </context-param>
    
    <!--SERVLETS-->
    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:mvc-dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:mvc-dispatcher-servlet.xml,
            classpath:security-config.xml
        </param-value>
    </context-param>
    </web-app>
    
    
    org.apache.ignite.startup.servlet.ServletContextListenerStartup
    org.springframework.web.context.ContextLoaderListener
    org.springframework.security.web.session.HttpSessionEventPublisher
    点火过滤器
    org.apache.ignite.cache.websession.WebSessionFilter
    点火过滤器
    /*
    springSecurityFilterChain
    org.springframework.web.filter.DelegatingFilterProxy
    springSecurityFilterChain
    /*
    IgniteConfigurationFilePath
    示例-ignite.xml
    斯卡奇纳姆酒店
    例子
    mvc调度器
    org.springframework.web.servlet.DispatcherServlet
    上下文配置位置
    类路径:mvc-dispatcher-servlet.xml
    1.
    mvc调度器
    /
    上下文配置位置
    类路径:mvc-dispatcher-servlet.xml,
    类路径:security-config.xml
    

  • 如果您能提供解决问题的任何解决方案/想法,我将不胜感激。

    由于您的两个部署都在本地主机上,它们将共享
    JSESSIONID
    cookie。到目前为止一切顺利

    然而,Tomcat、Spring Security和Ignite之间似乎存在不匹配,这导致Spring Security认为来自Ignite的会话在匿名(即未登录)时无效。我还不明白这与您应该已经登录的情况有什么关系

    您可能可以使用一种解决方法:从Spring安全配置中删除
    无效会话url=“/”
    。这将防止重定向循环行为。这还将导致用户在cookie过期时被引导到
    /login

    <beans:beans xmlns.... > <http auto-config="true" create-session="always" use-expressions="true" > <form-login login-page="/login" default-target-url="/home" authentication-failure-url="/login?error" username-parameter="username" password-parameter="password" always-use-default-target="true"/> <logout invalidate-session="true" logout-success-url="/login" delete-cookies="JSESSIONID"/> <session-management session-fixation-protection="newSession" invalid-session-url="/" session-authentication-error-url="/login"> <concurrency-control session-registry-alias="sessionRegistry" max-sessions="10" expired-url="/" error-if-maximum-exceeded="true"/> </session-management> <access-denied-handler error-page="/403"/> </http> <authentication-manager> <authentication-provider user-service-ref="userDetailsService"> </authentication-provider> </authentication-manager> </beans:beans>
    <web-app xmlns... >
    <listener>
        <listener-class>org.apache.ignite.startup.servlet.ServletContextListenerStartup</listener-class>
    </listener>
    
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
    </listener>
    
    <filter>
        <filter-name>IgniteWebSessionsFilter</filter-name>
        <filter-class>org.apache.ignite.cache.websession.WebSessionFilter</filter-class>
    </filter>
    
    <!-- You can also specify a custom URL pattern. -->
    <filter-mapping>
        <filter-name>IgniteWebSessionsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-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>
    
    <!-- Specify Ignite configuration (relative to META-INF folder or Ignite_HOME). -->
    <context-param>
        <param-name>IgniteConfigurationFilePath</param-name>
        <param-value>example-ignite.xml</param-value>
    </context-param>
    
    <!-- Specify the name of Ignite cache for web sessions. -->
    <context-param>
        <param-name>IgniteWebSessionsCacheName</param-name>
        <param-value>example</param-value>
    </context-param>
    
    <!--SERVLETS-->
    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:mvc-dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:mvc-dispatcher-servlet.xml,
            classpath:security-config.xml
        </param-value>
    </context-param>
    </web-app>