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 和表单身份验证的主要内容,如果未能解决你的问题,请参考以下文章
Phonegap (Android) 上的 ASP.NET 表单身份验证问题