2016-10-16 3 views
0

내가 객체 계정이 나와 세션 데이터를 기억한다. 그런 다음 브라우저를 닫습니다. 다시 열면 객체 계정은 살아 있지만 자동차는 null입니다. 같은 세션에서 객체의 속성을 저장하는 올바른 방법은 무엇입니까? 여기 봄 보안 : 세션에 계정을 저장 한 후</p> <pre><code>public class Account { String name; List<Car> cars; } </code></pre> <p>내가 (사용자 지정 인증 공급자에서) 로그인하는 동안 차를 채우고 :

내 ApplicationContext를-security.xml의 조각입니다 :

<http use-expressions="true" 
      authentication-manager-ref="authenticationManager" 
      auto-config="true" 
      create-session="ifRequired"> 
     <intercept-url pattern="/my/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"/> 
     <intercept-url pattern="/service/**" access="hasRole('ROLE_ADMIN')"/> 
     <form-login 
      login-page="/login" 
      authentication-failure-handler-ref="simpleUrlAuthenticationFailureHandler" 
      username-parameter="j_username" 
      password-parameter="j_password" 
      default-target-url="/home" 
      always-use-default-target="false"/> 
     <logout logout-success-url="/logout" invalidate-session="true" delete-cookies="JSESSIONID"/> 
     <http-basic /> 
     <remember-me key="uniqueAndSecret" 
      token-validity-seconds="1209600" 
      remember-me-cookie="edrive" 
      remember-me-parameter="_spring_security_remember_me" 
      user-service-ref="localUserService"/> 
    </http> 

내가 계정 저장 방법 :

Account account = accountDao.getAccount(name, password); 
HttpSession session = httpUtilities.getSession(); // session from the HttpServletRequest 
account.setCars(domainUtilities.getAccountCars(account.getId())); 
session.setAttribute("account", account); 

봄 보안 4.1.3.RELEASE

UPDATE 1 : 내 조사에 따르면 처음 로그인 할 때 계정 개체는 세션에서 계속 유지됩니다.

세션 ID가 null -

org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository.CSRF_TOKEN [email protected] 
SPRING_SECURITY_CONTEXT [email protected]1c5848: Authentication: org.spring[email protected]5d1c5848: Principal: [email protected]: Username: someuser; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_USER; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]b364: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: null; Granted Authorities: ROLE_USER 

을 그리고 :

및 세션도 포함 : 나는 브라우저를 시작

[email protected] 
SPRING_SECURITY_CONTEXT [email protected]e3a7b0: Authentication: org.springframew[email protected]a2e3a7b0: Principal: [email protected]: Username: someuser; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_USER; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]ffff4c9c: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: 0B7153F813D8F0B943C34EF19A7271C8; Granted Authorities: ROLE_USER 

다음 번에, 톰캣 8 만에 새로운 세션을 엽니 다. 왜? 계정에 두 번째 액세스 할 수없는 이유가 무엇입니까?

답변

0

표준 체인 (앱의 WEB-APP/web.xml에 정의 됨)에 특수 필터를 추가하여 문제가 해결되었습니다. 사용자가 인증되어 있고 계정이 null인지 확인한 다음 필요한 데이터를 다시로드합니다.

두 번째 세션 ID가 null 인 경우 - create-session = "ifRequired"문제였습니다. 나는 그것을 "항상"으로 바꿨고 이제는 효과가있다.