2009-03-20 14 views
17

मैं एक grails आवेदन विकसित कर रहा हूं जो बहुत सारे AJAX का उपयोग करता है। अगर अनुरोध AJAX कॉल है तो उसे प्रतिक्रिया देना चाहिए (यह हिस्सा काम कर रहा है), हालांकि अगर मैं यूआरएल में टाइप करता हूं ब्राउज़र को मुझे अनुरोधित पृष्ठ के बजाय घर/अनुक्रमणिका पृष्ठ पर ले जाना चाहिए। नीचे AJAX कॉल के लिए नमूना जीएसपी कोड है।grails नियंत्रक में AJAX अनुरोध या ब्राउज़र अनुरोध की पहचान

<g:remoteFunction action="list" controller="todo" update="todo-ajax"> 

<div id ="todo-ajax"> 
//ajax call rendered in this area 
</div> 

अगर हम ब्राउज़र URL बार में http://localhost:8080/Dash/todo/list टाइप करें, नियंत्रक http://localhost:8080/Dash/auth/index

की ओर ही रीडायरेक्ट नियंत्रक में इस मान्य करने के लिए कैसे।

उत्तर

34

यह अपने BootStrap.init बंद में इस गतिशील विधि जोड़ने के लिए काफी एक आम बात है:

if(request.xhr) { ... } 
: यदि वर्तमान अनुरोध करके एक ajax कॉल है आप परीक्षण करना

HttpServletRequest.metaClass.isXhr = {-> 
     'XMLHttpRequest' == delegate.getHeader('X-Requested-With') 
    } 

इस अनुमति देता है

सरल समाधान अपनी कार्य करने कार्रवाई करने के लिए कुछ इस तरह जोड़ने के लिए है:

if(!request.xhr) { 
    redirect(controller: 'auth', action: 'index') 
    return false 
} 

आप फ़िल्टर/इंटरसेप्टर का भी उपयोग कर सकते हैं। मैंने एक समाधान बनाया है जहां मैंने एजेक्स-केवल एक कस्टम एनोटेशन के साथ सभी क्रियाओं को एनोटेट किया है, और उसके बाद इसे फ़िल्टर में मान्य किया है। की grails एप्लिकेशन के अंतर्गत/conf/BootStrap.groovy

पूर्ण उदाहरण:

import javax.servlet.http.HttpServletRequest 

class BootStrap { 

    def init = { servletContext -> 

     HttpServletRequest.metaClass.isXhr = {-> 
      'XMLHttpRequest' == delegate.getHeader('X-Requested-With') 
     } 

    } 
    def destroy = { 
    } 
} 
+0

हाय Siegfried, मैं अपने answer.I साथ करने की कोशिश की है अपवाद ऐसा कोई संपत्ति निम्नलिखित देता है बूटस्ट्रैप init closure.It में पहले भाग कहा: HttpServletRequest वर्ग के लिए: बूटस्ट्रैप: groovy.lang.MissingPropertyException: ऐसी कोई संपत्ति नहीं: कक्षा के लिए HttpServletRequest: बूटस्ट्रैप क्या आप कृपया मेरी मदद कर सकते हैं – DonX

+0

कृपया अपना ईमेल पता भी प्रदान करें – DonX

+2

आपको अपने बूटस्ट्रैप क्लास में क्लास javax.servlet.http.HttpServletRequest आयात करने की आवश्यकता है। मैं जवाब में एक पूर्ण उदाहरण जोड़ूंगा। –

3

सामान्य विधि यह है कि AJAX दिनचर्या अनुरोध में हेडर या क्वेरी स्ट्रिंग जोड़ती है और इसका पता लगाती है। यदि आप AJAX के लिए लाइब्रेरी का उपयोग कर रहे हैं, तो यह शायद यह पहले से ही प्रदान करता है।

ऐसा लगता है कि आप प्रोटोटाइप का उपयोग कर रहे हैं, जो X-Requested-With header set to 'XMLHttpRequest' जोड़ता है; यह पता लगाना कि शायद आपकी सबसे अच्छी शर्त है।

3

Grails 1.1 के बाद से एक xhr संपत्ति request उद्देश्य यह है कि आप AJAX अनुरोध का पता लगाने के लिए अनुमति देता है जोड़ा गया है। यह उपयोग है का एक उदाहरण नीचे है:

def MyController { 

    def myAction() { 
    if (request.xhr) { 
     // send response to AJAX request 
    } else { 
     // send response to non-AJAX request 
    } 
    } 
} 
संबंधित मुद्दे