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