【问题标题】:Ajax and form authenticationAjax 和表单身份验证
【发布时间】: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 应用程序。

标签: javascript ajax jsp web-applications weblogic


【解决方案1】:

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

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

用户点击提交按钮。

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

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

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

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

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

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

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

【讨论】:

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

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

以下教程可能会对您有所帮助:
oracle Servlet Authentication Filters
Using servlet filters for user authentication
Writing 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 请求更简单、更透明,因为它由浏览器处理,而不是由您的应用处理。但我承认/理解弹出窗口很丑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 2013-11-15
      • 2020-06-21
      • 2011-06-11
      • 1970-01-01
      相关资源
      最近更新 更多