वसंत 3 MVC नियंत्रक से HttpRequest तक पहुँचने


104

मैं @SessionAttributesउदाहरण के लिए कुकीज़ से निपटने के लॉगिन के लिए अनुरोध और सत्र विशेषताओं को खुद संभालना चाहता हूं, फिर इसे वसंत पर छोड़ दें ।

मैं सिर्फ यह पता नहीं लगा सकता कि HttpRequestकिसी कंट्रोलर के अंदर से मैं कैसे पहुँच सकता हूँ , मुझे एक लेयर ऊपर जाने @RequestAttributeऔर HttpRequestखुद को एक्सेस करने का तरीका चाहिए । Stripes के साथ एक ApplicationContextऔर कॉलिंग को लागू करके ऐसा करने के लिए इस्तेमाल किया getAttribute()

इसके अलावा, HttpServletRequestपैरामीटर के रूप में कार्य करना संभव नहीं है:

@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println(""+request.getSession().getCreationTime());
    return "home"; 
}

उपरोक्त विधि कुछ भी नहीं छापती है।

क्या आपके पास इस पर कोई सलाह है?

जवाबों:


184

स्प्रिंग MVC आपको HttpRequest देगा यदि आप इसे अपने नियंत्रक विधि हस्ताक्षर में जोड़ते हैं:

उदाहरण के लिए:

/**
 * Generate a PDF report...
 */
@RequestMapping(value = "/report/{objectId}", method = RequestMethod.GET)
public @ResponseBody void generateReport(
        @PathVariable("objectId") Long objectId, 
        HttpServletRequest request, 
        HttpServletResponse response) {

    // ...
    // Here you can use the request and response objects like:
    // response.setContentType("application/pdf");
    // response.getOutputStream().write(...);

}

जैसा कि आप देखते हैं, बस हस्ताक्षर में वस्तुओं HttpServletRequestऔर HttpServletResponseवस्तुओं को जोड़ने से स्प्रिंग एमवीसी उन वस्तुओं को आपके नियंत्रक विधि में पारित कर देता है। आप HttpSessionवस्तु भी चाहते हैं।

संपादित करें: ऐसा लगता है कि HttpServletRequest / Response स्प्रिंग 3 के तहत कुछ लोगों के लिए काम नहीं कर रहा है। एडुआर्डो ज़ोला ने बताया कि स्प्रिंग वेबरैपेस्ट / वेबस्पेस ऑब्जेक्ट्स का उपयोग करने का प्रयास करें।

मैं आपको दृढ़ता से समर्थित तर्कों की सूची पर ध्यान देने की सलाह देता हूं कि स्प्रिंग एमवीसी आपके हैंडलर तरीकों को ऑटो-जादुई रूप से इंजेक्ट करने में सक्षम है।


नमस्ते, संकेत के लिए thx, मुझे नहीं पता कि मैं क्या गलत कर रहा हूं, लेकिन यह काम नहीं कर रहा है: यह कुछ भी प्रिंट नहीं करता है: @RequestMapping (मूल्य = "/") सार्वजनिक स्ट्रिंग होम (HttpServletRequest request) {System.out। println ( "" + request.getSession () getCreationTime ()।); घर लौटना"; } यह मौजूदा राशि pof मिल प्रिंग करना चाहिए, लेकिन यह भी नहीं करता है, @RequestBody के साथ विधि की व्याख्या करने से कुछ भी नहीं बदलता है, कोई और सलाह? इसके लिए thx
JBoy

2
वसंत MVC के समर्थित तर्कों के लिंक के लिए @jjmontes धन्यवाद!
बरेठ

मैं वसंत के बारे में कुछ नहीं के बगल में जानता हूं, लेकिन मुझे @Contextउन्हें इंजेक्शन लगाने के लिए तर्क से पहले एनोटेशन जोड़ना पड़ा । कुछ नया हो सकता है, मुझे पता नहीं, लेकिन मुझे लगा कि मैं इसका उल्लेख करूंगा।
ivarni

81

मुझे पता है कि यह एक पुराना सवाल है, लेकिन ...

आप इसका उपयोग अपनी कक्षा में भी कर सकते हैं:

@Autowired
private HttpServletRequest context;

और यह HttpServletRequestआपके लिए आपके पद्धति पर उपयोग की वर्तमान आवृत्ति प्रदान करेगा ।


7
क्या इस तरह से ऐसा करने से नियंत्रक सेम को सिंगलटन होने से नहीं रोका जा सकता है?
13

2
वसंत नियंत्रक हमेशा एकल होते हैं।
डिविडी कैवर्ज़न

16
यह गलत लगता है - क्या होगा यदि नियंत्रक दिए गए समय में एक से अधिक अनुरोधों को संभाल रहा है? फिर "वर्तमान" अनुरोध क्या है?
sbk

2
इस प्रश्न में आपके द्वारा
Deividi Cavarzan

1
getThreadLocalRequest()GWT में कुछ ऐसा होना काफी उपयोगी होगा RemoteServiceServletजो हमेशा उच्च समवर्ती वातावरण में निष्पादित होने पर भी सही अनुरोध देता है।
युरी नकोनचैनी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.