Ajax 和表单身份验证

Posted

技术标签:

【中文标题】Ajax 和表单身份验证【英文标题】:Ajax and form authentication 【发布时间】:2012-11-05 16:41:58 【问题描述】:

我正在尝试在我的 ajax 应用程序中实现表单身份验证。 我遇到的问题是,当会话到期时,我会收到 302 代码,该代码会将我重定向到我在 web.xml 中指定的登录页面(并且将整个应用程序刷新到登录页面时会搞砸一切)。

我想要做的是获取“未通过身份验证”(401)代码,然后在弹出窗口中显示登录表单,登录成功后继续我正在做的事情。

这是正在发生的事情的图片:

和文档 http://docs.oracle.com/javaee/1.4/tutorial/doc/Security5.html

基本上,我想显示弹出窗口而不是重定向到登录页面,然后不重定向到资源,而是以 AJAX 方式进行更新。 据我了解,由于无法避免重定向,因此不能仅在客户端完成(请参见此处:redirect info),我需要在服务器上编写某种逻辑以防止重定向,请参见此处有关在 IIS 中执行此操作的详细信息:IIS implementation

附:到目前为止:http://www.oracle.com/technetwork/articles/entarch/session-lifecycle-096133.html 看起来是最有希望的实现方式。该类已弃用,但我找不到新的类,并认为这是为 Weblogic 做的唯一方法。

【问题讨论】:

我不确定您所说的 web.xml 文件是如何工作的,但如果它所做的只是检查会话并在会话过期时重定向,您能否在有问题的页面? 我不想编写自己的逻辑来检查身份验证/会话过期,我想使用 Web 容器中 Web 应用程序可用的内容 您使用的是 Servlet 3.0 吗?史前 J2EE 教程链接和 Weblogic 标记不建议这样做,只是要求确定,因为使用 Servlet 3.0 中的新 API 工具可以做到这一点。否则,您将需要回退到特定于容器的黑客/解决方法(不幸的是,我认为很难得到 Weblogic 的答案,因为社区对这个闭源容器的支持非常低;您最有可能得到的最好的自制认证或采用更灵活的认证框架,如 Spring Security 或 Apache Shiro)。 我使用的 Weblogic 10.3.3 仅支持 Servlet 2.5。 罗曼,我不知道。我不做春天。 @Tolis:webapp 注册的过滤器(出于明显的安全原因)j_security_check 上调用。 j_security_check 上的请求完全在 servlet 容器内部进行处理和转发,然后请求到达 web 应用程序。 【参考方案1】:

这不是一个简单的方法,但它仍然有效

您的页面中有一个由用户填写的表单。

用户点击提交按钮。

一个ajax请求被发送到服务器。

服务器端实现可以检查会话是否存在。因此您可以发送响应代码 401..(response.setStatus());

这个 401 可以在客户端使用 ajax --- xhr.status 进行检查

如果响应是 401,您可以显示登录表单并隐藏当前表单。使用js和css。

用户填写登录信息并点击提交..

您可以对该登录请求的状态进行相同的服务器端检查和客户端检查。

如果登录成功那么你可以使用ajax或js提交第一个表单..

【讨论】:

我不认为我的服务器端代码在会话过期后运行,所以我无法检查代码中的任何内容或设置状态。 哦,应该的。我研究过的任何技术,让你要么覆盖超时行为,要么订阅会话超时事件。【参考方案2】:

您可能需要使用weblogic.xml Deployment Descriptor Elements 中所述的 servlet 身份验证过滤器

以下教程可能会对您有所帮助:oracle Servlet Authentication FiltersUsing servlet filters for user authenticationWriting Servlet Filters

【讨论】:

不是完整的答案,但我想这是唯一明智的方法,我会研究如何实现它,谢谢!【参考方案3】:

您可以使用心跳检查向您的服务器发送 ajax 请求来检查任何需要经过身份验证才能获取它的资源。如果您无法接收此资源,则意味着您尚未登录。因此您可以发送另一个身份验证请求继续你的渲染..

看这篇文章..http://ajaxpatterns.org/archive/Heartbeat.php

因此您的身份验证检查程序将被实施..

【讨论】:

但如果我经常这样做,心跳会延长会话。我可能会在每次提交之前做一个“测试”消息,不确定这是最好的方法。【参考方案4】:

您需要推送页面而不是投票。所以你需要连接 Strophe 和你的会话处理程序。当会话到期时,信号会发送到在您的 Web 应用程序中运行的 Strophe 实例,之后很容易进行弹出或其他操作。 对于我使用 Strophe 的所有实时内容!

This is book 在这个仪表上,这是link for Strophe,也是 php xmpp class 的链接。

您需要几天时间才能弄清楚这一点,但是这几天花得值! 如果您仔细阅读书籍并查看示例,只需了解基本的 javascript/jquery,您将能够开发强大的 Web 应用程序。

【讨论】:

【参考方案5】:

我知道您正在尝试对您的 ajax 应用程序进行 FORM 身份验证,但它真的需要吗?

BASIC 身份验证对 ajax 请求更简单、更透明,因为它由浏览器处理,而不是由您的应用处理。但我承认/理解弹出窗口很丑。

【讨论】:

以上是关于Ajax 和表单身份验证的主要内容,如果未能解决你的问题,请参考以下文章

在ajax请求期间处理MVC表单身份验证到期[重复]

使用 jQuery/ajax 的基本身份验证

Flask 中 AJAX 身份验证的 CSRF 保护

Phonegap (Android) 上的 ASP.NET 表单身份验证问题

有啥区别:Windows 身份验证、护照身份验证和表单身份验证?

混合模式联合身份验证和表单身份验证