2016-09-21 23 views
0

我正在使用JHipster應用程序(使用v3.4.2生成),並且偶爾會發生服務器500錯誤:"Cannot change session ID. There is no session associated with this request."
應用程序配置爲使用OAuth 2.0進行安全性設置,會話創建策略設置爲sessionCreationPolicy(SessionCreationPolicy.STATELESS)。據我所知,堆棧跟蹤根本不通過我的應用程序代碼。

我的問題:JHipster 500錯誤:「無法更改會話ID,沒有會話與此請求關聯。」

  • 我如何讓這個我的應用程序不會嘗試改變會話ID,當它被配置爲無狀態?
  • 如何防止發生此錯誤?

這裏是我的.yo-rc.json文件:

{ 
    "generator-jhipster": { 
    "jhipsterVersion": "3.4.2", 
    "baseName": "xxx", 
    "packageName": "xx.xx.xxx", 
    "packageFolder": "xx/xx/xxx", 
    "serverPort": "8080", 
    "authenticationType": "oauth2", 
    "hibernateCache": "hazelcast", 
    "clusteredHttpSession": "hazelcast", 
    "websocket": "no", 
    "databaseType": "sql", 
    "devDatabaseType": "h2Disk", 
    "prodDatabaseType": "mariadb", 
    "searchEngine": "elasticsearch", 
    "buildTool": "gradle", 
    "useSass": true, 
    "applicationType": "monolith", 
    "testFrameworks": [ 
     "gatling", 
     "cucumber", 
     "protractor" 
    ], 
    "jhiPrefix": "jhi", 
    "enableTranslation": true, 
    "nativeLanguage": "en", 
    "languages": [ 
     "en", 
     "fr", 
     "es" 
    ] 
    }, 
    "generator-jhipster-entity-audit": { 
    "auditFramework": "custom" 
    } 
} 

我也已經安裝了以下JHipster插件:

  • jhipster實體審計 - 以跟蹤創建&爲每個實體
  • 修改數據
  • jhipster-elasticsearch-reindexer - 爲彈性馴化提供REST端點

最後,堆棧跟蹤:

2016-09-21 02:42:59.057 ERROR 20379 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception 

java.lang.IllegalStateException: Cannot change session ID. There is no session associated with this request. 
     at org.apache.catalina.connector.Request.changeSessionId(Request.java:2539) 
     at org.apache.catalina.connector.RequestFacade.changeSessionId(RequestFacade.java:918) 
     at javax.servlet.http.HttpServletRequestWrapper.changeSessionId(HttpServletRequestWrapper.java:249) 
     at javax.servlet.http.HttpServletRequestWrapper.changeSessionId(HttpServletRequestWrapper.java:249) 
     at sun.reflect.GeneratedMethodAccessor710.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:216) 
     at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:201) 
     at org.springframework.security.web.authentication.session.ChangeSessionIdAuthenticationStrategy.applySessionFixation(ChangeSessionIdAuthenticationStrategy.java:55) 
     at org.springframework.security.web.authentication.session.AbstractSessionFixationProtectionStrategy.onAuthentication(AbstractSessionFixationProtectionStrategy.java:87) 
     at org.springframework.security.web.authentication.session.ChangeSessionIdAuthenticationStrategy.onAuthentication(ChangeSessionIdAuthenticationStrategy.java:32) 
     at org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy.onAuthentication(CompositeSessionAuthenticationStrategy.java:89) 
     at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:98) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
     at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:112) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
     at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:169) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
     at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
     at org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter.doFilter(OAuth2AuthenticationProcessingFilter.java:176) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
     at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:121) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
     at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66) 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
     at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:106) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
     at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
     at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) 
     at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177) 
     at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
     at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
     at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
     at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:87) 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
     at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
     at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672) 
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1502) 
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1458) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
     at java.lang.Thread.run(Thread.java:745) 

任何幫助表示讚賞!

回答

1

問題解決。我配置了應用程序以使用hazelcast進行分佈式會話管理,但之後選擇了無狀態身份驗證方法(oauth2),導致我的應用程序沒有會話cookie,從而導致上述錯誤。

解決方案是將生成的代碼註釋掉以便初始化hazelcast會話管理,這是兩行代碼。

CacheConfiguration.java,我註釋掉"clustered-http-sessions"行:

@Bean 
public HazelcastInstance hazelcastInstance(JHipsterProperties jHipsterProperties) { 
    log.debug("Configuring Hazelcast"); 
    Config config = new Config(); 
    config.setInstanceName("CUE2"); 

    config.getNetworkConfig().setPort(5701); 
    config.getNetworkConfig().setPortAutoIncrement(true); 

    // In development, remove multicast auto-configuration 
    if (env.acceptsProfiles(Constants.SPRING_PROFILE_DEVELOPMENT)) { 
     System.setProperty("hazelcast.local.localAddress", "127.0.0.1"); 

     config.getNetworkConfig().getJoin().getAwsConfig().setEnabled(false); 
     config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false); 
     config.getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(false); 
    } 


    config.getMapConfigs().put("default", initializeDefaultMapConfig()); 
    config.getMapConfigs().put("com.ads.cue2.domain.*", initializeDomainMapConfig(jHipsterProperties)); 

    // vvv -- This line here -- vvv 
    // config.getMapConfigs().put("clustered-http-sessions", initializeClusteredSession(jHipsterProperties)); <-- This line here 
    // ^^^ -- -------------- -- ^^^ 

    hazelcastInstance = HazelcastInstanceFactory.newHazelcastInstance(config); 

    return hazelcastInstance; 
} 

WebConfigurer.java,我在onStartup註釋掉initClusteredHttpSessions行:

@Override 
public void onStartup(ServletContext servletContext) throws ServletException { 
    if (env.getActiveProfiles().length != 0) { 
     log.info("Web application configuration, using profiles: {}", Arrays.toString(env.getActiveProfiles())); 
    } 
    EnumSet<DispatcherType> disps = EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.ASYNC); 

    // vvv -- This line here -- vvv 
    // initClusteredHttpSessionFilter(servletContext, disps); 
    // ^^^ -- -------------- -- ^^^ 

    initMetrics(servletContext, disps); 
    if (env.acceptsProfiles(Constants.SPRING_PROFILE_PRODUCTION)) { 
     initCachingHttpHeadersFilter(servletContext, disps); 
    } 
    if (env.acceptsProfiles(Constants.SPRING_PROFILE_DEVELOPMENT)) { 
     initH2Console(servletContext); 
    } 
    log.info("Web application fully configured"); 
} 
+0

你能否詳細說明你註釋掉哪個類別/代碼解決這個?我偶爾也會遇到這個錯誤,並想擺脫它。謝謝。 – gtiwari333

+0

@ gtiwari333我編輯了我的答案以添加詳細信息,希望這有助於... – simon