2009-03-20 41 views
17

Tôi đang phát triển ứng dụng grails sử dụng rất nhiều ajax.If yêu cầu gọi ajax thì nó sẽ trả lời (phần này đang hoạt động), tuy nhiên nếu tôi nhập URL vào trình duyệt sẽ đưa tôi đến trang chủ/trang chỉ mục thay vì trang được yêu cầu.Below là mã gsp mẫu cho cuộc gọi ajax.Xác định yêu cầu ajax hoặc yêu cầu trình duyệt trong bộ điều khiển grails

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

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

nếu chúng ta gõ http://localhost:8080/Dash/todo/list trong thanh URL của trình duyệt, bộ điều khiển nên chuyển hướng đến http://localhost:8080/Dash/auth/index

Làm thế nào để xác nhận điều này trong bộ điều khiển.

Trả lời

34

Đó là một thực tế khá phổ biến để thêm phương pháp năng động này trong việc đóng cửa BootStrap.init của bạn:

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

này cho phép bạn kiểm tra xem các yêu cầu hiện tại là một cuộc gọi ajax bằng cách thực hiện:

if(request.xhr) { ... } 

Giải pháp đơn giản nhất là thêm một thứ như thế này vào hành động cần làm của bạn:

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

Bạn cũng có thể sử dụng bộ lọc/bộ chặn. Tôi đã xây dựng một giải pháp mà tôi đã chú thích tất cả các hành động chỉ là ajax với chú thích tùy chỉnh và sau đó đã xác thực điều này trong bộ lọc.

Ví dụ đầy đủ của grails-app/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

Hi Siegfried, tôi đã cố gắng với answer.I của bạn thêm phần đầu tiên trong bootstrap init closure.It được đưa ra sau ngoại lệ Không có tài sản như: HttpServletRequest cho lớp: bootstrap: groovy.lang.MissingPropertyException: Không có thuộc tính như vậy: HttpServletRequest cho lớp: BootStrap Bạn có thể vui lòng giúp tôi – DonX

+0

Vui lòng cung cấp địa chỉ email ur cũng – DonX

+2

Bạn cần nhập lớp javax.servlet.http.HttpServletRequest trong lớp BootStrap của mình. Tôi sẽ thêm một ví dụ đầy đủ cho câu trả lời. –

3

Phương pháp thông thường là có thói quen ajax thêm tiêu đề hoặc chuỗi truy vấn vào yêu cầu và phát hiện điều đó. Nếu bạn đang sử dụng một thư viện cho ajax, nó có thể cung cấp điều này rồi.

Dường như bạn đang sử dụng mẫu thử nghiệm, có thêm X-Requested-With header set to 'XMLHttpRequest'; phát hiện đó có lẽ là đặt cược tốt nhất của bạn.

3

Kể từ Grails 1.1 một tài sản xhr được bổ sung vào đối tượng request cho phép bạn để phát hiện các yêu cầu AJAX. Một ví dụ về việc sử dụng nó là dưới đây:

def MyController { 

    def myAction() { 
    if (request.xhr) { 
     // send response to AJAX request 
    } else { 
     // send response to non-AJAX request 
    } 
    } 
} 
Các vấn đề liên quan