我在我的应用程序中使用Spring Security和jQuery。主页面通过 AJAX 将内容动态加载到选项卡中。一切都很好,但是有时候我的选项卡中会有登录页面,如果我输入凭据,我会被重定向到没有选项卡的内容页面。
所以我想处理这种情况。我知道有些人使用 AJAX 身份验证,但我不确定它是否适合我,因为它看起来很复杂,而且我应用程序不允许在没有登录之前进行任何访问。我想为所有 AJAX 响应编写一个全局处理程序,如果需要进行身份验证,它将执行window.location.reload()
。我认为在这种情况下,"最好是得到401
错误而不是标准的登录表单,因为它更容易处理。
所以,
1)是否可以为所有jQuery AJAX 请求编写 * 全局错误处理程序 *?
2)我如何定制Spring Security的行为,使其对 AJAX 请求发送401错误,而对常规请求发送401错误,以便照常显示标准登录页面?
3)也许你有更优雅的解决方案?请分享它。
- 谢谢-谢谢
7条答案
按热度按时间bvpmtnay1#
这里有一个我认为非常简单的方法。它是我在这个网站上观察到的方法的组合。我写了一篇关于它的博客文章:http://yoyar.com/blog/2012/06/dealing-with-the-spring-security-ajax-session-timeout-problem/
基本的想法是使用一个api url前缀(即/api/secured),就像上面建议的那样,还有一个身份验证入口点。
下面是身份验证入口点:
下面是Spring上下文xml中的内容:
dxpyg8gm2#
我使用了以下解决方案。
在Spring Security中定义了无效的会话url
为该页添加了以下控制器
对于 AJAX 使用ajaxSetup处理所有ajax请求:
pvcm50d13#
看一看http://forum.springsource.org/showthread.php?t=95881,我认为建议的解决方案比这里的其他答案要清楚得多:
1.在jquery AJAX 调用中添加一个自定义的头(使用'beforeSend'钩子)。你也可以使用jQuery发送的
X-Requested-With
头。1.配置SpringSecurity在服务器端查找该标头,以返回HTTP401错误代码,而不是将用户带到登录页面。
yacmzcpb4#
我刚刚想出了一个解决这个问题的方法,但是还没有彻底测试它。我还使用了spring、spring security和jQuery。首先,在我的登录控制器中,我将状态代码设置为401:
在它们的onload()方法中,我的所有页面都调用我的全局javascript文件中的一个函数:
}
在一个项目中,我通过在包含登录表单的iframe周围放置一个jQuery对话框来处理jQuery身份验证。
vxbzzdmp5#
我通常是这样做的:在每次 AJAX 时,在使用之前检查结果。
然后
HasErrors()
函数看起来像这样,并且可以在所有页面上共享。ycggw6v26#
因此,这里有两个问题:1)Spring安全性工作正常,但是响应通过 AJAX 调用返回到浏览器。2)Spring安全性跟踪最初请求的页面,以便在您登录后将您重定向到该页面(除非您指定在登录后总是要使用某个页面)。在本例中,请求是一个 AJAX 字符串,因此您将被重定向到该字符串,您将在浏览器中看到该字符串。
一个简单的解决方案是检测 AJAX 错误,如果发回的请求是特定于登录页面的,(Spring会发回登录页面的html,它将是请求的'responseText'属性)检测到它。然后只需重新加载当前页面,这将把用户从 AJAX 调用的上下文中删除。Spring随后会自动把它们发送到登录页面。(我使用的是默认的j_username,它是一个字符串值,对于我的登录页面是唯一的)。
y0u0uwnf7#
发生超时时,在会话已清除的情况下触发任何 AJAX 操作后,用户将被重定向到登录页面
}