2010-02-06 13 views
20

क्या स्प्रिंग 3.0 के तहत कोई तरीका है HttpSession तक पहुंचने के लिए विधि हस्ताक्षर में इसे शामिल किए बिना? मैं वास्तव में क्या करना चाहता हूं वह एचटीपीएसशन से मूल्यों में गुजरने में सक्षम है जो शून्य हो सकता है।स्प्रिंग एमवीसी सत्र विशेषता पहुंच

कुछ इस तरह:

@RequestMapping("/myHomePage") 
public ModelAndView show(UserSecurityContext ctx) {} 
बजाय इस बात का

:

@RequestMapping("/myHomePage") 
public ModelAndView show(HttpSession session) { 
     UserSecurityContext ctx = (UserSecurityContext) session.getAttribute("userSecurityCtx"); 
} 
+1

संबंधित: http://stackoverflow.com/questions/3621266/how-to-pass-a-session-attribute-as-method-argument-parameter-with-spring-mvc – Bozho

+0

यहां वसंत टिकट [# एसपीआर- 4452] (https: //jira.springsource।संगठन/ब्राउज़/एसपीआर -4452) इसके लिए। तेज संकल्प के लिए उपरोक्त टिकट। –

उत्तर

25

@SessionAttribute एनोटेशन @uthark ने उल्लेख इस कार्य के लिए उपयुक्त नहीं है - मैंने सोचा कि यह था भी, लेकिन bit of reading sh ows अन्यथा:

सत्र विशेषताओं के रूप में यह व्याख्या का उपयोग कर संकेत दिया एक विशिष्ट हैंडलर के मॉडल विशेषताओं को, पारदर्शी रूप से एक संवादी सत्र में संग्रहीत हो रही अनुरूप हैं। गुण हैंडलर एक बार हटा दिए जाएंगे, इसके बातचीत सत्र को पूरा करने का संकेत मिलता है। इसलिए, इस सुविधा का उपयोग इस तरह के संवादी गुण जो एक विशिष्ट हैंडलर की बातचीत के दौरान सत्र अस्थायी रूप से में संग्रहित होने की अपेक्षा की जाती है के लिए।

स्थायी सत्र विशेषताओं के लिए, उदा। उपयोगकर्ता प्रमाणीकरण ऑब्जेक्ट, पारंपरिक सत्र.सेट एट्रिब्यूट विधि का उपयोग करें। वैकल्पिक रूप से, सामान्य जेनरेट WebRequest इंटरफ़ेस की विशेषता क्षमताओं का उपयोग करने पर विचार करें।

दूसरे शब्दों में, @SessionAttribute सत्र में बातचीत MVC मॉडल वस्तुओं के भंडारण (के रूप में अनुरोध के रूप में जिम्मेदार बताते हैं उन्हें भंडारण के खिलाफ) के लिए है। यह मनमाने ढंग से सत्र विशेषताओं के साथ उपयोग करने के लिए इरादा नहीं है। जैसा कि आपने पाया है, यह केवल तभी काम करता है जब सत्र विशेषता हमेशा वहां होती है।

मैं किसी अन्य विकल्प के बारे में पता नहीं कर रहा हूँ, मुझे लगता है कि आप HttpSession.getAttribute()

+0

मैं वास्तव में @uthark समाधान के हिस्से का उपयोग करके समाप्त हुआ। एक शून्य उपयोगकर्ता संदर्भ ऑब्जेक्ट के कारण अपवादों से बचने के लिए, मैंने यह सुनिश्चित करने के लिए एक ServletFilter रखा है कि यह आबादी वाला था। मैं इस विशेष वर्कफ़्लो के लिए इस समाधान के साथ ठीक हूं लेकिन यह अजीब लगता है कि आप इसके लिए स्प्रिंग के बजाय अपने आप को एक शून्य मूल्य संभाल नहीं सकते हैं। सहायता और अंतर्दृष्टि के लिए सभी को धन्यवाद। – Mark

+0

@ मार्क: यह अजीब लगता है, हाँ। – skaffman

+0

@skaffman क्या कोई कारण है कि दस्तावेज़ सही नहीं आते हैं और 'हैंडलर' शब्द का उपयोग करने के बजाय नियंत्रक कहते हैं? –

5

हाँ, आप कर सकते हैं।

@SessionAttributes("userSecurityContext") 
public class UserSecurityContext { 
} 

@RequestMapping("/myHomePage") 
public String show(@ModelAttribute("userSecurityContext") UserSecurityContext u) { 
    // code goes here. 
} 

जानकारी के लिए देखें:

  1. http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/bind/annotation/SessionAttributes.html

  2. http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/bind/annotation/ModelAttribute.html

+0

प्रतिक्रिया के लिए धन्यवाद। मैं session.putAttribute() के साथ शुरुआत में अपना सुरक्षा संदर्भ जोड़ रहा हूं। जब मैं आपका कोड आज़माता हूं, तो संदर्भ वस्तु शून्य होती है। – Mark

+3

क्षमा करें, जब मैंने @SessionAttributes ("userSecurityContext") को नियंत्रक में जोड़ा, तो यह काम खत्म हो गया। बस इसे वास्तविक UserSecurityContext pojo में जोड़कर मेरे लिए कुछ भी नहीं किया। हालांकि वसंत से एक अपवाद फेंक दिया जाता है जब विशेषता शून्य होती है जो मैं बचने की कोशिश कर रहा हूं। org.springframework.web.HttpSessionRequiredException: सत्र विशेषता 'उपयोगकर्ता सुरक्षा कॉन्टेक्स्ट' आवश्यक - सत्र – Mark

+0

@Mark में नहीं मिला अगर यह उत्तर उचित नहीं है, तो कृपया स्वीकार किए गए ध्वज को हटाएं (या इसे हटाएं), जैसा कि नीचे दिए गए उत्तर द्वारा सुझाया गया है (द्वारा * skaffman *)। यह भ्रामक है क्योंकि बहुत से लोग केवल स्वीकृत उत्तर पढ़ते हैं। (बस नीचे अपनी टिप्पणी पढ़ें - आपका कॉल!) –

8

के साथ फंस रहे हैं आप उपयोग कर सकते हैं एक RequestContextHolder:

class SecurityContextHolder { 
    public static UserSecurityContext currentSecurityContext() { 
     return (UserSecurityContext) 
      RequestContextHolder.currentRequestAttributes() 
      .getAttribute("userSecurityCtx", RequestAttributes.SCOPE_SESSION)); 
    } 
} 
... 
@RequestMapping("/myHomePage")   
public ModelAndView show() {   
    UserSecurityContext ctx = SecurityContextHolder.currentSecurityContext(); 
} 

इस तरह के सुरक्षा के रूप में पार काटने चिंताओं के लिए इस दृष्टिकोण है बेहतर क्योंकि आपको अपने नियंत्रक हस्ताक्षर को संशोधित करने की आवश्यकता नहीं है।

+0

मुझे इस तरह की समाधान भी पसंद है। यह कुछ हद तक थ्रेडलोकल पैटर्न के समान है। धन्यवाद! – Mark

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