2009-03-20 3 views
17

요청이 ajax 호출을 많이 사용하는 grails 애플리케이션을 개발 중입니다. 응답이 있어야합니다 (이 부분은 작동합니다). 그러나 URL을 입력하면 브라우저는 내가 요청한 page.Below 대신 home/index 페이지로 나를 데려 가야한다. 아약스 호출을위한 샘플 gsp 코드가있다. 우리는 브라우저의 URL 표시 줄에 http://localhost:8080/Dash/todo/list를 입력하면grails 컨트롤러에서 ajax 요청 또는 브라우저 요청 확인하기

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

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

, 컨트롤러는 컨트롤러에서이 문제를 확인하는 방법 http://localhost:8080/Dash/auth/index

로 리디렉션합니다.

답변

34

그것은 당신의 BootStrap.init 마감이 동적 메소드를 추가하는 것은 매우 일반적인 관행입니다 :

if(request.xhr) { ... } 
이 허용

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

현재 요청이 수행하여 Ajax 호출이 경우 테스트

가장 간단한 해결 방법은 잭 액션이 뭔가를 추가하는 것입니다

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

당신 또한 필터/인터셉터를 사용할 수 있습니다. 나는 사용자 정의 주석으로 ajax 전용 인 모든 액션에 주석을 달고 필터에서 이것을 검증 한 솔루션을 만들었습니다. 관례에 따라 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

안녕 지크프리트, 나는 그러한 특성 예외 에게 다음 없습니다 준다 당신의 대답에 시도 부트 스트랩 초기화 closure.It의 첫 부분을 추가 : groovy.lang.MissingPropertyException : 클래스에 대한 HttpServletRequest : BootStrap 도울 수 없습니까? – DonX

+0

전자 메일 주소도 제공하십시오 – DonX

+2

BootStrap 클래스에서 javax.servlet.http.HttpServletRequest 클래스를 가져와야합니다. 대답에 대한 전체 예제를 추가하겠습니다. –

3

일반적인 방법은 ajax 루틴에 헤더 또는 쿼리 문자열을 요청에 추가하고이를 감지하는 것입니다. 아약스 용 라이브러리를 사용하고 있다면 아마 이미 이것을 제공하고있을 것이다.

프로토 타입을 사용하는 것 같습니다. X-Requested-With header set to 'XMLHttpRequest'이 추가됩니다. 아마도 이것이 최선의 방법 일 것입니다.

3

Grails의 1.1 년부터 xhr 속성은 당신이 AJAX 요청을 감지 할 수있는 request 개체에 추가되었습니다. 그것은 사용의 예는 다음과 같습니다 : HttpServletRequest의 클래스 : 부트 스트랩

def MyController { 

    def myAction() { 
    if (request.xhr) { 
     // send response to AJAX request 
    } else { 
     // send response to non-AJAX request 
    } 
    } 
}