2014-01-29 3 views
1

я следующий в моем GSP:Grails: Ошибка при прохождении Params через OAuth теге к контроллеру

<oauth:connect provider="facebook" params="[currentURL: location.protocol + '//' 
      + location.host + location.pathname]"> 
    <img src="../images/socialSites/facebook.png" alt="facebook" /> 
</oauth:connect> 

И следующий код в контроллере:

def currentURL = params.currentURL 
println "currentURL is :"+currentURL; 

и получаю эту ошибку и страница не отображается:

Caused by: java.lang.NullPointerException: Cannot get property 'protocol' on null object 

Я прочитал here, что OAuth может принимать все Params, что г: Li nk может принять, поэтому пытается отправить текущий url на контроллер, чтобы я мог перенаправить на ту же страницу после успешного входа в систему. Как мне это сделать?

ответ

1

location.protocol/location.host/location.pathname/etc. будет работать в JavaScript, но внутри карты params поддерживается только Groovy, и этот код не имеет доступа к состоянию на стороне клиента. Использовать

params="[currentURL: request.scheme + '://' + request.serverName + ':' + request.serverPort + request.forwardURI]" 

вместо этого.

+0

ok получил это .. но попробовал то, что вы сказали, и все еще, когда я вижу источник html-страницы, я не вижу никаких параметров в ссылке: facebook

0

Вы не можете добавлять params на вкладку oauth taglibconnect, поскольку она не добавляет данный params к URL.

Для достижения вашего требования создать свой собственный тег для проверки подлинности:

class MyOauthTagLib { 

    static namespace = 'o' 

    def connect = { attrs, body -> 
    String provider = attrs.provider 
    Map params = attrs.remove('params') 

    if (!provider) { 
     throw new GrailsTagException('No provider specified for <o:connect /> tag. Try <o:connect provider="your-provider-name" />') 
    } 

    Map a = attrs + [url: [controller: 'oauth', action: 'authenticate', params: [provider: provider] + params]] 
    out << g.link(a, body) 
    } 
} 

и использовать его в GSP:

<o:connect provider="facebook" params="[currentURL: request.scheme + '://' + request.serverName + ':' + request.serverPort + request.forwardURI]">facebook</o:connect> 

Примечания: - Используйте request как это было предложено @Burt Beckwith. Вы не можете получить доступ к location здесь.