2014-07-01 64 views
1

我将shiro添加到现有的Web应用程序(使用spring mvc),但我总是得到NullPointerException。使用Shiro的NullPointerException

以下是错误消息:

Servlet.service() for servlet [jsp] in context with path [/haha-web] threw exception [Filtered request failed.] with root cause 
    java.lang.NullPointerException 
     at org.apache.shiro.mgt.SessionsSecurityManager.getSession(SessionsSecurityManager.java:125) 
     at org.apache.shiro.mgt.DefaultSecurityManager.resolveContextSession(DefaultSecurityManager.java:456) 
     at org.apache.shiro.mgt.DefaultSecurityManager.resolveSession(DefaultSecurityManager.java:442) 
     at org.apache.shiro.mgt.DefaultSecurityManager.createSubject(DefaultSecurityManager.java:338) 
     at org.apache.shiro.subject.Subject$Builder.buildSubject(Subject.java:846) 
     at org.apache.shiro.web.subject.WebSubject$Builder.buildWebSubject(WebSubject.java:148) 
     at org.apache.shiro.web.servlet.AbstractShiroFilter.createSubject(AbstractShiroFilter.java:292) 
     at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:359) 
     at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) 
     at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
     at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 

org.apache.catalina.core.StandardWrapperValve invoke 
Servlet.service() for servlet [static] in context with path [/haha-web] threw exception [Filtered request failed.] with root cause 
    java.lang.NullPointerException 
     at org.apache.shiro.mgt.SessionsSecurityManager.getSession(SessionsSecurityManager.java:125) 
     at org.apache.shiro.mgt.DefaultSecurityManager.resolveContextSession(DefaultSecurityManager.java:456) 
     at org.apache.shiro.mgt.DefaultSecurityManager.resolveSession(DefaultSecurityManager.java:442) 
     at org.apache.shiro.mgt.DefaultSecurityManager.createSubject(DefaultSecurityManager.java:338) 
     at org.apache.shiro.subject.Subject$Builder.buildSubject(Subject.java:846) 
     at org.apache.shiro.web.subject.WebSubject$Builder.buildWebSubject(WebSubject.java:148) 
     at org.apache.shiro.web.servlet.AbstractShiroFilter.createSubject(AbstractShiroFilter.java:292) 
     at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:359) 
     at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) 
     at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
     at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 

org.apache.catalina.core.StandardWrapperValve invoke 
Servlet.service() for servlet [static] in context with path [/haha-web] threw exception [Filtered request failed.] with root cause 
    java.lang.NullPointerException 
     at org.apache.shiro.mgt.SessionsSecurityManager.getSession(SessionsSecurityManager.java:125) 
     at org.apache.shiro.mgt.DefaultSecurityManager.resolveContextSession(DefaultSecurityManager.java:456) 
     at org.apache.shiro.mgt.DefaultSecurityManager.resolveSession(DefaultSecurityManager.java:442) 
     at org.apache.shiro.mgt.DefaultSecurityManager.createSubject(DefaultSecurityManager.java:338) 
     at org.apache.shiro.subject.Subject$Builder.buildSubject(Subject.java:846) 
     at org.apache.shiro.web.subject.WebSubject$Builder.buildWebSubject(WebSubject.java:148) 
     at org.apache.shiro.web.servlet.AbstractShiroFilter.createSubject(AbstractShiroFilter.java:292) 
     at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:359) 
     at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) 
     at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
     at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 

我检查四郎的源代码,似乎sessionManager为空。

这里是我的四郎配置的一部分:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:util="http://www.springframework.org/schema/util" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> 

    <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"> 
     <property name="cacheManagerConfigFile" value="classpath:spring/ehcache.xml"/> 
    </bean> 

    <bean id="credentialsMatcher" class="org.haha.security.credentials.RetryLimitHashedCredentialsMatcher"> 
     <constructor-arg ref="cacheManager"/> 
     <property name="hashAlgorithmName" value="md5"/> 
     <property name="hashIterations" value="2"/> 
     <property name="storedCredentialsHexEncoded" value="true"/> 
    </bean> 

    <bean id="userRealm" class="org.haha.security.realm.UserRealm"> 
     <property name="operatorService" ref="operatorService"/> 
     <property name="credentialsMatcher" ref="credentialsMatcher"/> 
     <property name="cachingEnabled" value="true"/> 
     <property name="authenticationCachingEnabled" value="true"/> 
     <property name="authenticationCacheName" value="authenticationCache"/> 
     <property name="authorizationCachingEnabled" value="true"/> 
     <property name="authorizationCacheName" value="authorizationCache"/> 
    </bean> 

    <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/> 

    <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> 
     <constructor-arg value="sid"/> 
     <property name="httpOnly" value="true"/> 
     <property name="maxAge" value="180000"/> 
    </bean> 

    <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO"> 
     <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/> 
     <property name="sessionIdGenerator" ref="sessionIdGenerator"/> 
    </bean> 

    <bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler"> 
     <property name="sessionValidationInterval" value="1800000"/> 
     <property name="sessionManager" ref="sessionManager"/> 
    </bean> 

    <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> 
     <property name="globalSessionTimeout" value="1800000"/> 
     <property name="deleteInvalidSessions" value="true"/> 
     <property name="sessionValidationSchedulerEnabled" value="true"/> 
     <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/> 
     <property name="sessionDAO" ref="sessionDAO"/> 
     <property name="sessionIdCookieEnabled" value="true"/> 
     <property name="sessionIdCookie" ref="sessionIdCookie"/> 
    </bean> 

    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> 
     <property name="realm" ref="userRealm"/> 
     <property name="sessionManager" ref="sessionManager"/> 
     <property name="cacheManager" ref="cacheManager"/> 
    </bean> 

    <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
     <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/> 
     <property name="arguments" ref="securityManager"/> 
    </bean> 

    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> 

    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> 
     <property name="securityManager" ref="securityManager"/> 
     <property name="loginUrl" value="/home"/> 
     <property name="successUrl" value="/home"/> 
     <property name="unauthorizedUrl" value="/home"/> 
     <property name="filterChainDefinitions"> 
      <value> 
       /js/** = anon 
       /api-js/** = anon 
       /img/** = anon 
       /css/** = anon 
       /** = authc 
      </value> 
     </property>   
    </bean> 

</beans> 

我是新来四郎,我已经在过去4天T_T试图尽我所能,希望有人能帮助我。

回答

0

我的Web应用程序将重新加载ContextRefreshedEvent上下文(当ApplicationContext得到初始化),我重写代码,避免重装,和NullPointerException异常消失。虽然我不太了解逻辑,但似乎重载会使sessionManager变为空。希望有人能解释: - D.

+0

补充:【shiro maillist的讨论】(http://shiro-user.582556.n2.nabble.com/NullPointerException-using-Shiro-tc7580049.html) – charmpeach

相关问题