【问题标题】:sharing session in web applicationsWeb 应用程序中的共享会话
【发布时间】:2013-04-10 05:39:57
【问题描述】:

我正在使用 JSPServlets 开发 Web 应用程序(容器:Tomcat7,数据库:Oracle10

我开发了一些 Web 应用程序,例如 ProfileReportsLeads。然后我开发了一个Login 应用程序。在此应用程序中,我将 USERID 存储在 Session 中,并带有更多会话属性。

用户登录后,他将看到包含指向其他应用程序的链接的菜单,例如指向Profile 应用程序的链接。

所以当我在用户登录后访问Session时:

  • 如果我尝试使用同一个应用程序(登录)访问会话,那么我将获得具有所有必需属性的会话
  • 但是当我尝试从其他应用程序访问会话时,例如 Profiles 然后我得到会话 null

编码 sn-p 以检查会话(登录 Web 应用程序中的 Servlet 过滤器)

HttpSession session = request.getSession(false);
if(session==null)
{
    System.out.println("Session does not exist... Redirected to LOGIN Page.");
    response.sendRedirect("/ApplicationName/Login.jsp");
}

我正在访问Profile 应用程序中的会话以检查用户是否已登录。

然后我搜索了一下,发现Session出于安全原因不能从其他应用程序访问。(我也发现可以通过设置crossContext="true"来完成)

然后我找到了其他选项,例如将EAR 设置为所有应用程序然后部署它,但不幸的是EAR Tomcat7 不支持它。

我是网络环境的新手,所以如果有人在此之前做过这方面的工作,请告诉我有哪些选择?

提前致谢

更新1

现在我决定使用EAR,我将在其中打包所有WAR 文件,然后尝试在它们之间共享会话。由于Tomcat不支持EAR我已经安装了Oracle Glassfish,然后我创建了Enterprise Application Project,其中包含两个应用程序1. Login2. Profiles,然后创建了EAR文件,并将其部署在Glassfish上. 所以我想在这两个应用程序之间共享会话(在 Glassfish 上),所以如果有人对此有任何想法,请告诉我。 (链接到任何教程也将不胜感激)

【问题讨论】:

  • 表示您希望在同一 Web 服务器上运行的多个应用程序之间共享数据。这可以通过在 Web 服务器 Catalina 中进行一些操作来完成。我认为不会有另一种方法可以做到这一点,
  • @Nikhil 是的,我想在同一 Web 服务器(tomcat7)上运行的多个应用程序之间共享数据
  • stackoverflow.com/questions/9293350/…关键字:域级会话cookie
  • 单点登录可能对您有所帮助
  • 我认为您需要重新考虑您的架构。登录不应是应用程序。它应该是您的应用程序使用的模块或服务。

标签: java jsp tomcat servlets glassfish


【解决方案1】:

我在商店中看到的做法是将登录凭据填充到加密的 cookie 中并安装代理(java 过滤器、Web 服务器模块等,在需要用户数据的应用程序前面),这些代理将解密cookie 并将数据传递给下游应用程序。如果您想跨应用程序共享登录信息,请不要将登录信息存储在 HTTP 会话中。

【讨论】:

  • @GaborSch 你能详细说明为什么你认为它很老套吗?如果 Web 应用程序在不同的域上运行并且用户身份完全不相关,那么我会考虑采用完整的 SSO 解决方案。但是,如果您的应用程序都在同一个域上,我认为这种方法没有任何问题。
  • 我不会在会话 cookie 中存储任何用户凭据,无论是否加密。这是一个潜在的安全漏洞;不过,如果您使用不对称编码进行加密,那可能没问题。无论如何,恕我直言,这将涉及太多组件。
  • 使用Kerboros 为您处理此问题。为什么要重新发明轮子。
  • @GaborSch 您通过浏览器传播的任何东西都将是易受攻击的(SSL 与否)。有很多方法可以使其安全。就像例如存储对用户 ID 的不透明引用并将其映射回下游的实际 ID 等。从复杂性的角度来看,建立一个好的加密框架并不比建立一个 SSO 框架复杂。事实上,一个好的加密框架对于 SSO(SAML、OAuth 等)是必不可少的
  • @GaborSch 发帖人清楚地描述了对称加密,因为他指的是“将解密 cookie”的过滤器。我很抱歉,但这没有任何意义。过滤器将使用哪些加密密钥来解密 cookie?过滤器的实现中是否对键进行了硬编码?
【解决方案2】:

如上所述,您所说的要求是单点登录 (SSO)。您可以实现的最简单的 SSO 如下:

  1. 认证成功后添加带有加密用户名的cookie(不需要加密密码)
  2. 如果您使用用户名 cookie 访问您的任何应用程序并成功解密,则表示用户已通过身份验证,您不应显示登录页面。

使用 AES-256 进行加密。

【讨论】:

    猜你喜欢
    • 2012-04-05
    • 2017-03-19
    • 2011-03-07
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2012-02-26
    相关资源
    最近更新 更多