स्प्रिंग-एमवीसी में सत्र विशेषताओं का उपयोग कैसे करें


108

क्या आप मुझे इस कोड का स्प्रिंग mvc स्टाइल एनालॉग लिखने में मदद कर सकते हैं?

 session.setAttribute("name","value");

और @ModelAttributeसत्र को एनोटेशन द्वारा एनोटेट किया गया एक तत्व कैसे जोड़ें और फिर उस तक पहुंच प्राप्त करें?

जवाबों:


185

यदि आप प्रत्येक प्रतिक्रिया के बाद ऑब्जेक्ट को हटाना चाहते हैं, तो आपको सत्र की आवश्यकता नहीं है,

यदि आप उपयोगकर्ता सत्र के दौरान ऑब्जेक्ट रखना चाहते हैं, तो कुछ तरीके हैं:

  1. सत्र में सीधे एक विशेषता जोड़ें:

    @RequestMapping(method = RequestMethod.GET)
    public String testMestod(HttpServletRequest request){
       ShoppingCart cart = (ShoppingCart)request.getSession().setAttribute("cart",value);
       return "testJsp";
    }

    और आप इसे इस तरह नियंत्रक से प्राप्त कर सकते हैं:

    ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
  2. अपने नियंत्रक सत्र को स्कूप करें

    @Controller
    @Scope("session")
  3. ऑब्जेक्ट्स को स्कोप करें, उदाहरण के लिए आपके पास उपयोगकर्ता ऑब्जेक्ट है जो हर बार सत्र में होना चाहिए:

    @Component
    @Scope("session")
    public class User
     {
        String user;
        /*  setter getter*/
      }

    फिर प्रत्येक नियंत्रक में वर्ग इंजेक्ट करें जो आप चाहते हैं

       @Autowired
       private User user

    जो सत्र पर कक्षा रखता है।

  4. AOP प्रॉक्सी इंजेक्शन: स्प्रिंग -xml में:

    <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
    
      <bean id="user"    class="com.User" scope="session">     
          <aop:scoped-proxy/>
      </bean>
    </beans>

    फिर प्रत्येक नियंत्रक में वर्ग इंजेक्ट करें जो आप चाहते हैं

    @Autowired
    private User user

5.Pass HttpSession विधि करने के लिए:

 String index(HttpSession session) {
            session.setAttribute("mySessionAttribute", "someValue");
            return "index";
        }

6.Make ModelAttribute in session द्वारा @SessionAttributes ("ShoppingCart"):

  public String index (@ModelAttribute("ShoppingCart") ShoppingCart shoppingCart, SessionStatus sessionStatus) {
//Spring V4
//you can modify session status  by sessionStatus.setComplete();
}

या आप मॉडल को संपूर्ण नियंत्रक वर्ग में जोड़ सकते हैं जैसे,

@Controller
    @SessionAttributes("ShoppingCart")
    @RequestMapping("/req")
    public class MYController {

        @ModelAttribute("ShoppingCart")
        public Visitor getShopCart (....) {
            return new ShoppingCart(....); //get From DB Or Session
        }  
      }

हर एक को फायदा और नुकसान है:

@ सत्र क्लाउड सिस्टम में अधिक मेमोरी का उपयोग कर सकता है यह सत्र को सभी नोड्स में कॉपी करता है, और प्रत्यक्ष विधि (1 और 5) में गड़बड़ दृष्टिकोण है, यह यूनिट टेस्ट के लिए अच्छा नहीं है।

सत्र jsp तक पहुँचने के लिए

<%=session.getAttribute("ShoppingCart.prop")%>

Jstl में:

<c:out value="${sessionScope.ShoppingCart.prop}"/>

थाइमेलफ में:

<p th:text="${session.ShoppingCart.prop}" th:unless="${session == null}"> . </p>

6
3. यदि आपका कंट्रोलर सिंगलटन है तो आपको सत्र स्कोप वाले इंजेक्टेड कंपोनेंट के लिए प्रॉक्सीमोड = स्कॉप्डप्रोक्सीमोड .ARGET_CLASS की परिभाषा देनी होगी। @ स्कोप (मान = "सत्र", प्रॉक्सीमोड = स्कोपप्रॉक्सीमोड। टारगेट_क्लस)
वादिम

1
नियंत्रक सत्र को स्कॉप्ड बनाना यहां सबसे खराब विकल्प है, भले ही यह पहली बार में सरल और आसान लग रहा हो। लेकिन अगर आप भविष्य में कुछ समय के लिए अपने आवेदन को स्केल करना चाहते हैं, तो आप मुश्किल में पड़ जाएंगे क्योंकि आपको शायद एक वितरित सत्र स्टोर की आवश्यकता होगी जैसे कि रेडिस (जब तक आप चिपचिपा सत्र का उपयोग नहीं करते हैं, सुविधा के लिए उपलब्धता का त्याग करते हैं)। इस प्रकार, सत्र-स्कोप बीन्स को आम तौर पर अनुक्रमिक पीओजेओ गूंगा होना चाहिए। इस तरह से आप जरूरत पड़ने पर स्केल-आउट के लिए तैयार हैं।
क्रिस

RequestContextHolder के बारे में क्या?
user1589188

Userबीन को इंजेक्ट करना केवल तभी काम करेगा जब आप बीन को क्लास में बुला रहे हैं session, यह भी स्कोप किया गया है, अन्यथा यदि कोई सत्र मौजूद नहीं है, तो यह अपवाद को फेंकता है क्योंकि संदर्भ में कोई सक्रिय सत्र नहीं होगा @runtime जब हम userबीन को इंजेक्ट करते हैं I !!
जोश म्लंगा

41

उपयोग @SessionAttributes

डॉक्स देखें: अनुरोधों के बीच HTTP सत्र में मॉडल विशेषताओं को संग्रहीत करने के लिए @SessionAttributes का उपयोग करना

" स्प्रिंग एमवीसी मॉडल और सत्र विशेषताओं को समझना " भी स्प्रिंग एमवीसी सत्रों का एक बहुत अच्छा अवलोकन देता है और बताता है कि कैसे / जब @ModelAttributeसत्र में स्थानांतरित किया जाता है (यदि नियंत्रक @SessionAttributesएनोटेट है)।

यह लेख यह भी बताता है कि @SessionAttributesHttpSession पर सीधे विशेषताओं को सेट करने के बजाय मॉडल पर उपयोग करना बेहतर है क्योंकि यह स्प्रिंग एमवीसी को दृश्य-अज्ञेयवादी बनाने में मदद करता है।


आप कन्ट्रोलर्स के बीच वस्तुओं को स्थानांतरित करने के लिए सेशन का लाभ कैसे उठा सकते हैं?
लैरीटेक 14

27

SessionAttributeअनुरोध ऑब्जेक्ट और सेटिंग विशेषता से सत्र प्राप्त करने के बजाय एनोटेशन सबसे सरल और सीधे आगे है। किसी भी वस्तु को नियंत्रक में मॉडल में जोड़ा जा सकता है और सत्र में संग्रहीत किया जाएगा यदि उसका नाम @SessionAttributesएनोटेशन में तर्क के साथ मेल खाता है । नीचे उदाहरण के लिए, personObjसत्र में उपलब्ध होगा।

@Controller
@SessionAttributes("personObj")
public class PersonController {

    @RequestMapping(value="/person-form")
    public ModelAndView personPage() {
        return new ModelAndView("person-page", "person-entity", new Person());
    }

    @RequestMapping(value="/process-person")
    public ModelAndView processPerson(@ModelAttribute Person person) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("person-result-page");

        modelAndView.addObject("pers", person);
        modelAndView.addObject("personObj", person);

        return modelAndView;
    }

}

सत्र एक ही नियंत्रक उदाहरण के भीतर अनुरोधों के लिए काम करते हैं। क्या होगा यदि नियंत्रण को किसी अन्य नियंत्रक को भेजने की आवश्यकता है, तो यह सत्र नष्ट हो जाएगा और यदि आवश्यक हो तो एक नया बनाया जाएगा।
लैरीटेक

1
@larrytech यह कैसे हो सकता है? मुझे लगता है कि तुम सिर्फ अपने दूसरे नियंत्रक से SessionAttributes जोड़ने के लिए भूल गए हैं
Yura

19

नीचे दिया गया एनोटेट कोड "मान" को "नाम" पर सेट करेगा

@RequestMapping("/testing")
@Controller
public class TestController {
@RequestMapping(method = RequestMethod.GET)
public String testMestod(HttpServletRequest request){
    request.getSession().setAttribute("name", "value");
    return "testJsp";
  }
}

JSP के उपयोग में समान का उपयोग करने के लिए ${sessionScope.name}

@ModelAttributeइस लिंक को देखने के लिए


4

क्या यह सबसे आसान और छोटा रास्ता नहीं है? मैं इसे जानता था और अभी-अभी इसका परीक्षण किया है -

@GetMapping
public String hello(HttpSession session) {
    session.setAttribute("name","value");
    return "hello";
}

ps मैं यहां " स्प्रिंग-एमवीसी में सत्र विशेषताओं का उपयोग कैसे करें " के उत्तर की खोज के लिए आया था , लेकिन मैंने अपने कोड में जो सबसे स्पष्ट लिखा था, उसे देखे बिना इतने सारे पढ़े। मैंने इसे नहीं देखा, इसलिए मैंने सोचा कि यह गलत है, लेकिन नहीं यह नहीं था। तो मुख्य प्रश्न के सबसे आसान समाधान के साथ उस ज्ञान को साझा करने दें।


1
आप सही हे ! जब से आप सभी Http ऑब्जेक्ट को प्राप्त कर सकते हैं, जो मुझे सीधे तौर पर चाहिए था, जब आप उन्हें नियंत्रक विधियों (GET / POST अनुरोध) में घोषित करते हैं
Shessuky

1

इसे इस्तेमाल करे...

@Controller
@RequestMapping("/owners/{ownerId}/pets/{petId}/edit")
@SessionAttributes("pet")
public class EditPetForm {

    @ModelAttribute("types")

    public Collection<PetType> populatePetTypes() {
        return this.clinic.getPetTypes();
    }

    @RequestMapping(method = RequestMethod.POST)
    public String processSubmit(@ModelAttribute("pet") Pet pet, 
            BindingResult result, SessionStatus status) {
        new PetValidator().validate(pet, result);
        if (result.hasErrors()) {
            return "petForm";
        }else {
            this.clinic.storePet(pet);
            status.setComplete();
            return "redirect:owner.do?ownerId="
                + pet.getOwner().getId();
        }
    }
}

0

जब मैं अपने लॉगिन (जो बूटस्ट्रैप मोडल है) की कोशिश कर रहा हूं, तो मैंने @sessionattributes एनोटेशन का उपयोग किया। लेकिन समस्या तब थी जब दृश्य एक पुनर्निर्देशित ("पुनर्निर्देशित: / घर") है, मान जो मैंने सत्र में url में दिखाया था। कुछ इंटरनेट स्रोत http://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#mvc-redirecting का अनुसरण करने का सुझाव देते हैं लेकिन मैंने इसके बजाय Http://ession का उपयोग किया। यह सत्र तब तक रहेगा जब तक आप ब्राउज़र बंद नहीं कर देते। यहाँ नमूना कोड है

        @RequestMapping(value = "/login")
        @ResponseBody
        public BooleanResponse login(HttpSession session,HttpServletRequest request){
            //HttpServletRequest used to take data to the controller
            String username = request.getParameter("username");
            String password = request.getParameter("password");

           //Here you set your values to the session
           session.setAttribute("username", username);
           session.setAttribute("email", email);

          //your code goes here
}

आप दृश्य पक्ष पर विशिष्ट चीज़ नहीं बदलते हैं।

<c:out value="${username}"></c:out>
<c:out value="${email}"></c:out>

लॉगिन करने के बाद आप वेब साइट के किसी भी स्थान पर कोड जोड़ें। यदि सत्र सही ढंग से सेट है, तो आप वहां मान देखेंगे। सुनिश्चित करें कि आपने jstl टैग और El- अभिव्यक्तियों को सही तरीके से जोड़ा है (यहां jstl टैग सेट करने के लिए लिंक है https://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-project सही ढंग से / )


0

इस विधि का उपयोग करने के लिए बहुत सरल आसान है

HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getNativeRequest();

                                                            request.getSession().setAttribute("errorMsg", "your massage");

Jsp में एक बार उपयोग करें तो हटा दें

<c:remove var="errorMsg" scope="session"/>      

0

स्प्रिंग 4 वेब एमवीसी में। आप नियंत्रक स्तर के @SessionAttributeसाथ विधि में उपयोग कर सकते हैं@SessionAttributes

@Controller
@SessionAttributes("SessionKey")
public class OrderController extends BaseController {

    GetMapping("/showOrder")
    public String showPage(@SessionAttribute("SessionKey") SearchCriteria searchCriteria) {
     // method body
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.