Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails HTTP 500每秒响应一次请求_Grails - Fatal编程技术网

Grails HTTP 500每秒响应一次请求

Grails HTTP 500每秒响应一次请求,grails,Grails,我使用一个过滤器实现了一个自定义身份验证方案,该过滤器在我所有控制器的before拦截器中的AuthService上调用authenticate()方法。authenticate()方法使用groovy.sql.sql和尝试连接到数据库,然后检查以确保数据库用户具有适当的角色。数据库是Oracle,是遗留ERP的一部分,因此这是我进行身份验证的唯一方法 我遇到的问题发生在我使用无效凭据提交请求时。按预期引发包含“ORA-01017:无效用户名/密码;拒绝登录”的SQLException。我的tr

我使用一个过滤器实现了一个自定义身份验证方案,该过滤器在我所有控制器的before拦截器中的
AuthService
上调用
authenticate()
方法。
authenticate()
方法使用
groovy.sql.sql
和尝试连接到数据库,然后检查以确保数据库用户具有适当的角色。数据库是Oracle,是遗留ERP的一部分,因此这是我进行身份验证的唯一方法

我遇到的问题发生在我使用无效凭据提交请求时。按预期引发包含“ORA-01017:无效用户名/密码;拒绝登录”的SQLException。我的try/catch块捕获并抑制它,代码正确地拒绝请求。但是,下一个请求总是在500响应中返回SQLException,而不管提供的凭据如何。有没有关于为什么会这样以及我能做些什么来修复它的想法

def authenticate(def username, def password) {
    def authorized = false
    Sql sql

    if (username != null && !username.equals('')) {
        try {
            dataSource.setCredentialsForCurrentThread(username, password)

            sql = Sql.newInstance(dataSource)
            def row = sql.firstRow("**SQL removed for privacy**")

            if (row != null && row.has_permission == 1) {
                authorized = true
            }
        } catch (Exception e) {

        } finally {
            sql.close() 
        }
    }

    return authorized
}

我认为dataSource是应用程序的一个单例,因此在您设置了这个错误的用户名和密码之后,在第一次尝试获取连接(通过任何地方)时,将命中无效的用户名和密码


因此,当出现异常时,您必须返回默认用户名和密码。

我在发布的代码中没有看到任何错误。用户名和密码来自哪里?可能有问题。用户名和密码正在从params映射收集并传递到authenticate方法。在我看来,框架正在捕获SQLException并将其保存到下一个请求。不过,我对底层框架的理解还不够透彻。我认为dataSource对于应用程序来说是一个单例,因此,在您设置这个错误的用户名和密码后,第一次尝试获取连接(在任何地方)时,都会遇到无效的用户名和密码。因此,当出现异常时,您必须返回默认用户名和密码。我将尝试一下。我不认为这样做很有效,因为凭证是按线程设置的,而不是覆盖默认值,但是您的建议作为一个可能的解决方案是有意义的。我注意到同一个线程往往用于来自同一个客户机的请求,这就成功了。谢谢!将您的建议作为完整答案提交,以便我可以接受。这可以通过调用上面代码的catch块中的
dataSource.removeCredentialsFromCurrentThread()
来完成。