Maison > Questions et réponses > le corps du texte
J'ai créé un serveur API pour les appels mobiles, utilisé Spring Session pour connecter Redis afin de partager des sessions avec plusieurs Tomcats, utilisé la sécurité pour intercepter les autorisations API et utilisé x-auth-token, qui est la vérification du jeton de l'en-tête. Maintenant, je rencontre un problème. Certaines API ne sont pas autorisées pour la vérification. Cependant, lors de l'accès à ces API, Spring créera une session pour chaque requête et renverra un nouveau jeton x-auth. Cela peut entraîner un trop grand nombre de sessions. moi. Comment le configurer pour que cette situation ne nécessite pas de créer une session ? Create-session="never" a été configuré, mais cela ne fonctionne pas. Voici la configuration de sécurité
<http realm="Protected API" use-expressions="true" auto-config="false"
create-session="never" entry-point-ref="customAuthenticationEntryPoint">
<intercept-url pattern="/auth/login/phone" access="permitAll()" />
<intercept-url pattern="/**" access="isAuthenticated()" />
<access-denied-handler ref="customAccessDeniedHandler" />
</http>
séance de printemps
<!-- 在HTTP的header中使用x-auth-token:來實現session -->
<bean class="org.springframework.session.web.http.HeaderHttpSessionStrategy" />
<!-- This is essential to make sure that the Spring Security session registry
is notified when the session is destroyed. -->
<bean
class="org.springframework.security.web.session.HttpSessionEventPublisher" />
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" scope="singleton">
<!-- session为60分钟过期 -->
<property name="maxInactiveIntervalInSeconds" value="${session.maxInactiveIntervalInSeconds}"></property>
</bean>
...
省略redis pool配置
漂亮男人2017-06-28 09:25:34
J'ai trouvé la raison. Ouvrez d'abord la trace du journal, puis tracez org.springframework. À ce stade, vous pouvez voir qu'il y aura un journal à chaque fois qu'une nouvelle session est créée, et spring imprimera la pile de création de session.
java.lang.RuntimeException: For debugging purposes only (not an error)
at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.getSession(SessionRepositoryFilter.java:368)
at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.getSession(SessionRepositoryFilter.java:390)
at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.getSession(SessionRepositoryFilter.java:217)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:238)
at xxx.xxxxxxxx.LogFilter.doFilterInternal(LogFilter.java:52)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
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:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:208)
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:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:167)
at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:80)
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: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:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
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)
Vous pouvez y trouver la ligne xxx.xxxx. Vérifiez le code dans la ligne 52 de LogFilter et constatez que req.getSession() est appelé bien que create-session soit configuré avec never, s'il existe du code qui appelle req.getSession(). , le printemps en créera toujours une nouvelle. Essayez de ne pas appeler req.getSession() dans les intercepteurs globaux tels que les filtres, sinon une nouvelle session sera créée à tout moment