2015-07-14 5 views
8

मुझे कई फ्रंट-एंड सर्वरों में मेरे फ्रंट-एंड उपयोगकर्ताओं के स्टेटलेस लोड संतुलन को करने के लिए एक संबंधपरक डेटाबेस में HTTP सत्र को स्टोर करने में सक्षम होना चाहिए। स्प्रिंग 4 में मैं इसे कैसे प्राप्त कर सकता हूं?स्प्रिंग 4 में डेटाबेस-आधारित HTTP सत्र दृढ़ता से मैं कैसे संबंध रख सकता हूं?

मुझे लगता है कि कोई रेडिस के साथ ऐसा कैसे कर सकता है, हालांकि यह एक संबंधपरक डेटाबेस के साथ ऐसा करने के तरीके पर दस्तावेज़ प्रतीत नहीं होता है। Postgres।

+0

की संभावित डुप्लिकेट: http://stackoverflow.com/questions/20507749/how-can-i-make-the-spring-security-stores-the-http-session -इन-डेटाबेस-so-i-can – bphilipnyc

उत्तर

18

वसंत सत्र के साथ (यह पारदर्शी रूप से जावा ईई से एचटीपीएसएशन को ओवरराइड करेगा) आप केवल SessionRepository इंटरफ़ेस ले सकते हैं और इसे अपने कस्टम पूर्व के साथ कार्यान्वित कर सकते हैं। JdbcSessionRepository। यह करना आसान है। आप अपने कार्यान्वयन है, तो बस मैन्युअल रूप से जोड़ने (आप @EnableRedisHttpSession एनोटेशन जरूरत नहीं है) श्रृंखला फिल्टर करने के लिए, bellow तरह फिल्टर बनाया:

@Configuration 
@EnableWebMvcSecurity 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    //other stuff... 

    @Autowired 
    private SessionRepository<ExpiringSession> sessionRepository; 

    private HttpSessionStrategy httpSessionStrategy = new CookieHttpSessionStrategy(); // or HeaderHttpSessionStrategy 

    @Bean 
    public SessionRepository<ExpiringSession> sessionRepository() { 
     return new JdbcSessionRepository(); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     super.configure(http); 
     SessionRepositoryFilter<ExpiringSession> sessionRepositoryFilter = new SessionRepositoryFilter<>(sessionRepository); 
     sessionRepositoryFilter.setHttpSessionStrategy(httpSessionStrategy); 
     http 
      .addFilterBefore(sessionRepositoryFilter, ChannelProcessingFilter.class); 
    } 
} 

यहाँ आप कैसे SessionRepository इंटरफ़ेस की तरह लग रहा है। इसे लागू करने के लिए केवल 4 तरीके हैं। सत्र ऑब्जेक्ट बनाने के तरीके के लिए, आप MapSessionRepository और MapSession कार्यान्वयन (या RedisOperationsSessionRepository और RedisSession) देख सकते हैं।

public interface SessionRepository<S extends Session> { 
    S createSession(); 
    void save(S session); 
    S getSession(String id); 
    void delete(String id); 
} 

उदाहरण समाधान https://github.com/Mati20041/spring-session-jpa-repository

+0

धन्यवाद, क्या आप कृपया जेडीबीसी सत्र रेजोजिटरी के कार्यान्वयन के साथ इसे पूरा कर सकते हैं? – BestPractices

+0

मैं आपको बाद में स्प्रिंग डेटा जेपीए (एसक्यूएल डाटाबेस के साथ डाटासोर्स के रूप में) में एक उदाहरण दे सकता हूं, अगर वह आपको खुश करेगा। – Mati

+0

हां, और यदि आप दिखा सकते हैं कि डेटाबेस तालिका परिभाषा क्या है, तो यह सहायक होगी। – BestPractices

-1

बस उस पर वसंत सत्र को थप्पड़ मारो, और आप कर चुके हैं। एक रेडिस क्लाइंट बीन जोड़ना और @EnableRedisHttpSession के साथ कॉन्फ़िगरेशन क्लास को एनोटेट करना आपको बस चाहिए।

+0

जैसा कि प्रश्न में बताया गया है, मैं रेडिस के साथ ऐसा नहीं करना चाहता हूं। मैं डेटाबेस में ऐसा करना चाहता हूं जो मेरे पास पहले से है, पोस्टग्रेस। – BestPractices

+0

@ बेस्टप्रैक्टिस विशेष रूप से रेडिस से परहेज करना विशेष रूप से स्पष्ट आवश्यकता नहीं थी। उस ने कहा, मेरा मानना ​​है कि वसंत सत्र एक जेडीबीसी भंडार का समर्थन करता है (और यदि कोई ऐसा नहीं करता है तो एक छोटा हो जाएगा)। – chrylis

संबंधित मुद्दे