grails - “render as JSON”将JSON显示为文本,而不是按预期将其返回给AJAX调用

标签 grails spring-security

我导航到indexMyController操作。 index页面上的某些代码正在AJAX回调myAction中的MyController。我希望myAction操作将一些数据作为JSON返回到我的AJAX调用中,这样我就可以在数据客户端进行一些操作,但是不是像我想要的那样将数据作为JSON返回,而是将数据显示为文本。

我的Grails Controller 的示例:

class MyController {
    def index() {
        render( view: "myView" )
    }

    def myAction {
        def mapOfStuff = [ "foo": "foo", "bar": "bar" ]
        render mapOfStuff as JSON
    }
}

我的JavaScript示例:
$( function() {
    function callMyAction() {
        $.ajax({
            dataType: 'json',
            url: base_url + '/myController/myAction',
            success: function( data ) {
                $(function() {
                    if( data.foo ) {
                        alert( data.foo );
                    }
                    if( data.bar ) {
                        alert( data.bar );
                    }
                });
            }
        });
    }
});

我期望的是我的页面将呈现,然后将调用我的JavaScript,然后将显示两个警报。相反,JSON数组在我的浏览器窗口中显示为文本:
{"foo":"foo","bar":"bar"}

此时,我地址栏中的URL的最后一段是myAction而不是index。现在,如果我手动输入索引页面的URL并按刷新,则所有操作都将按预期进行。

我有完全相同的方法打了六个AJAX call ,但都没有问题。这是怎么回事?

更新1:

我注意到了当我在indexMyController操作中设置一个断点,并在myAction Action 中设置另一个断点时,即使我导航到myAction,在登录后立即在index的断点之前命中index的断点。实际上,index操作中的断点永远不会命中。这显然更接近我的问题的根本原因,但是为什么会发生呢?

更新2:

我正在使用Spring Security,我注意到即使我将默认URL设置为...
grails.plugins.springsecurity.successHandler.defaultTargetUrl = '/myController'

...登录时MyController的“索引”操作中的断点永远不会被击中,但是myView正确呈现。 Spring Security在做什么,可以通过我的 Controller 加载我的 View 而又是什么呢?

更新#3:

我已经找到了解决该问题的方法,问题是Spring Security在后台做了一些奇怪的事情。所以我只是将alwaysUseDefault添加到我的配置中并将其设置为true,如下所示:
grails.plugins.springsecurity.successHandler.alwaysUseDefault = true

现在,我击中indexMyController Action 中设置的断点,然后才击中myAction中的断点,就像我期望的那样。不幸的是,此解决方案不是最佳解决方案,因为即使用户试图导航到其他页面,现在也总是在登录后将其重定向到defaultTargetUrl

尽管这种解决方案可以解决我的问题,但它提出了一个问题,Spring Security如何重定向到我的defaultTargetUrl,它被设置为这样……
grails.plugins.springsecurity.successHandler.defaultTargetUrl = '/myController'

...无需经历indexMyController操作?

最佳答案

尝试使用:

def mapOfStuff = [ foo: "foo", bar:"bar"]

而不是将这些键用作Groovy字符串。

关于grails - “render as JSON”将JSON显示为文本,而不是按预期将其返回给AJAX调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12904820/

相关文章:

authentication - Grails-在LoginController的authfail中拦截输入的用户名

hibernate - Grails - 将多对多父/子关系映射到单个连接表

security - Spring Security插件不引发事件

java - Spring Boot Swagger API 不工作

grails - 动态覆盖Mock()spock返回的对象的属性

rest - g :formRemote doesn't create proper code to update RESTful resource

rest - 将 REST 身份验证添加到 Grails + SpringSecurity 浏览器应用程序

Spring Security 自定义 UserDetailsS​​ervice 与 Hibernate

grails - 使用 Groovy Spring security getCurrentUser 获取有意义的字符串

Spring SavedRequest 知道 X-Forwarded-Prefix