2014-05-14 5 views
0

로그인을 처리하기 위해 a를 사용하고 있습니다. 인증 정보가 올바르지 않은 경우 Ajax를 사용하여 동일한 웹 페이지에 오류 메시지를 인쇄하지만 성공한 경우 다른 웹 페이지로 전달하고 싶습니다. 무슨 일이 일어나고있는 건 성공의 경우에도 같은 페이지에 결과를 인쇄한다는 것입니다. 이것이 부분적으로 Ajax로 리다이렉트를 보낼 수 없다는 사실과 관련이 있다는 것을 알고 있습니다. 그러나, 그것에 대해 갈 방법을 알고 여전히 안돼서. 어떤 제안? 여기 <g : remoteForm> 리디렉션이 발생하지 않습니다.

내 GSP 섹션이 양식으로 할 필요가있다 : 여기

<g:formRemote name="subForm" url="[controller:'admin', action:'authenticate']" update =  "error_message"> 
     <br><br><label>User Name (email): </label><g:textField name = "username" /><br><br> 
     <label>Password: </label><g:field name = "password" type = "password" /><br><br><br><br> 
     <div id = "error_message" style = "text-align: center"> </div> 
     <div style = "text-align: center">(for TWC employees only)</div> 
     <g:submitButton id = "submit_button" name="Submit"/> 
    </g:formRemote> 

과하면 컨트롤러 메소드 '인증'입니다 : 그대로

def authenticate = { 

    try { 
      MongoClient mongoClient = new MongoClient("localhost", 27017) 
      DB db = mongoClient.getDB("admin"); 
      def userName = params.username 
      def passWord = params.password 
      boolean auth = db.authenticate(userName, passWord.toCharArray())     

      if (auth) 
       redirect (action: loggedin) 
      else { 
       render "Login or Password incorrect!" 
      } 
    } 
    catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } 
    catch (MongoException e) { 
      e.printStackTrace(); 
    } 
} 

def displayerror = { 
    render "Login or Password incorrect!" 
} 

def loggedin = {} 

, 나는를 얻을 수 없다 gsp는 'loggedin'메소드에 해당합니다. 어떤 아이디어?

답변

0

이전 포스터의 가장 유용한 제안 사항에 약간의 조정이 필요합니다. 이것은 실제로 문제를 해결할 코드입니다. 아래

<g:formRemote name="subForm" url="[controller:'admin', action:'authenticate']" onSuccess="doResult(data)"> 
     <br><br><label>User Name (email): </label><g:textField name = "username" /><br><br> 
     <label>Password: </label><g:field name = "password" type = "password" /><br><br><br><br> 
     <div id = "error_message" style = "text-align: center"> </div> 
     <div style = "text-align: center">(for TWC employees only)</div> 
     <g:submitButton id = "submit_button" name="Submit"/> 
    </g:formRemote> 

자바 스크립트 :

//success case 
       render(contentType: 'text/json') { 
        [success: true, url: createLink(controller: 'whateverController', action: 'whateverAction')] 
       } 
      } 
      else { 
       render(contentType: 'text/json') { 
        ["success": false, "message": 'Login or Password is incorrect.'] 
       } 

아래

function doResult(data) { 
     if (data.success == true) { 
      window.location.href = data.url; 
     } else { 
      $("#error_message").html(data.message); 
     } 
    } 

컨트롤러 코드 섹션 코드의 마지막 세트에서 JSON 변환을 가져 오기는 하나 필요하지 않습니다.

0

아약스를 사용하여 리디렉션을 보낼 수 없다는 것은 맞습니다. 그러나 할 수있는 일은 필요할 경우 읽을 수 있고 리디렉션 할 수있는 아약스 응답에서 다시 보낼 수 있습니다.

div를 AJAX 호출의 응답으로 업데이트하는 대신 일부 JSON 데이터를 다시 보내고 formRemote 태그의 onSuccess 속성을 사용하여 그에 따라 작동 할 수있는 함수에 결과를 전달해야합니다. 제거되는 onSuccess 지금 formRemote 태그를 설정하고 update 위의

<g:formRemote name="subForm" url="[controller:'admin', action:'authenticate']" onSuccess="doResult(e)"> 
     <br><br><label>User Name (email): </label><g:textField name="username" /><br><br> 
     <label>Password: </label><g:field name="password" type="password" /><br><br><br><br> 
     <div id="error_message" style="text-align: center"> </div> 
     <div style="text-align: center">(for TWC employees only)</div> 
     <g:submitButton id="submit_button" name="Submit"/> 
    </g:formRemote> 

주의 사항 :

난 당신이 formRemote 태그에 대한 문서를 통해 읽고 시작하는 것이 좋습니다 것입니다

은 다음과 같이 고려 . 양식 제출의 응답은 이제 javascript 함수 doResult으로 전달됩니다.

<script> 
    function doResult(response) { 
    var result = eval('(' + response.responseText + ')'); 
    if (result.success == true) { 
     window.location.href = result.url; 
    } else { 
     $("#error_message").html(result.message); 
    } 
    } 
</script> 

남아있는 유일한 방법은 컨트롤러가 양식 제출에 응답하는 방법을 변경하는 것입니다 :

는이 같은 함수가 보일 수 있습니다 것입니다. 먼저 import grails.converters.JSON에 대한 가져 오기를 컨트롤러에 추가해야합니다. 그런 다음 응답 방식을 변경하십시오. 많은 모두 한 번에 걸릴처럼 보일 수

import import grails.converters.JSON 
... 
// in the case of an error 
render [success: false, message: "Login or Password incorrect!"] as JSON 
return 
... 
// in the case of success 
render [success: true, url: createLink(controller: 'whateverController', action: 'whateverAction')] as JSON 
return 

,하지만 당신은 그것을 몇 번을 일단은 아주 간단하게 : 그것은 다음과 같을 수 있습니다. 많은 도움이되는 한 가지는 Grails documentation입니다. 길지만 길게 쓰여 많은 도움이 될 것입니다.

+0

잘 설명해 주셔서 감사합니다.나는 당신의 대답을 upvote 하겠지만 아직 충분한 명성이 없습니다. 나는 grails 문서를 읽었으며 이제 Ajax 통신의 순서를 이해한다. 위에서 설명한 내용을 구현했지만 아직 원하는 결과를 얻지 못했습니다. 제출 버튼을 누르면 Chrome의 디버거가 Uncaught ReferenceError : e가 정의되지 않았다고 불평합니다. adminlogin : 49 jQuery.ajax.success adminlogin : 49 –

+0

j jquery-1.11.0.min.js : 2 k.fireWith jquery-1.11. 0.min.js : 2 x jquery-1.11.0.min.js : 4 b jquery-1.11.0.min.js : 4 이것은 최소한 jQuery가 제대로로드되고 있고 Ajax 요청이 해고 당했다고합니다. 권리? 불평하는 'e'는 위의 html 샘플에서 정의한 "doresult (d)"함수에 대한 인수입니다. 더 이상의 제안? –

+0

죄송합니다. 위의 의견은 댓글 길이 제한으로 인해 2 건의 제출에 실패했습니다. –

관련 문제