【问题标题】:My web application stop working after JSESSIONID appear in URLJSESSIONID 出现在 URL 中后,我的 Web 应用程序停止工作
【发布时间】:2015-10-20 22:08:30
【问题描述】:

我有一个在 Apache Tomcat 7 中运行并使用 Struts2 的 Web 应用程序。 我的登录系统是通过在会话中放置一个用户对象来实现的:

(绕过“if”和“try”以明确..)

UserService es = new UserService();
User user = es.login(username, password);
ActionContext.getContext().getSession().put("loggedUser", user);

然后,我尝试从拦截器中的会话中获取用户对象。如果正常,则有人登录。如果没有,则通过返回“notLogged”进入登录页面,Struts2 global-results 将在 struts.xml 中捕获该信息:

public String intercept(ActionInvocation invocation) {
    User loggedUser = (User)invocation.getInvocationContext().getSession().get("loggedUser");
    if (loggedUser == null) {
        return "notLogged";
    }
    try {
        return invocation.invoke();
    } catch ( Exception ignored ) {
        return "notLogged";
    }
}

struts.xml

<global-results>
    <result name="notLogged">/index.jsp</result> 
</global-results>

一切都很好,直到服务器管理员进行一些维护并且“jsessionid”开始出现在 URL 中。在此之后,我无法再导航我的系统(直到我将此 ID 复制并粘贴到我想去的每个 URL 中。无法形成操作目标)。我仍然可以登录,并且我看到 User 对象仍在捕获,但没有此 ID,我无法前往任何目的地。

我试过这个:https://fralef.me/tomcat-disable-jsessionid-in-url.html,并将COOKIE 放在我的 web.xml 中的tracking-mode 标记中,但事情变得最糟糕,因为现在我什至无法登录。

发生了什么,我可以做些什么来解决这个问题并让我的系统恢复工作?

【问题讨论】:

  • 您的浏览器出于某种原因开始拒绝 cookie(或某些网络基础设施更改从响应或请求中删除了 cookie)。可以避免使用 cookie,但必须正确编码所有 URL(例如,使用 标记)。检查cookie消失的位置。询问服务器管理员他做了什么导致这个问题。
  • 对不起。事实并非如此。我说这是在管理员更改一些服务器后开始的。我尝试的每个浏览器怎么会开始拒绝 cookie?任何地方。什么阴谋?不在浏览器中。我之前没有在 URL 中看到过这个 ID。
  • 据我所知,唯一的变化是服务器访问重定向从eic.cefet-rj.br/sagitariieic.cefet-rj.br/rukbat/app/sagitarii。这是重定向到内部网络的外部访问 ( :\sagitarii )
  • 可能与 cookie 路径有关。尝试更改 sessionCookiePath
  • @bayou.io :非常感谢。通过将&lt;Context sessionCookiePath="/"&gt; 放入服务器context.xml 来解决。请把它作为答案让我接受。

标签: java configuration struts2 tomcat7 session-cookies


【解决方案1】:

这显然是由 cookie 路径不匹配引起的。

只有当请求的 URL 路径与 cookie 路径匹配时,浏览器才会发回 cookie,例如

 cookie path :  /abc
request path:   /abc/xyz   // match
request path:   /xyz       // no match

Tomcat默认设置session cookie路径为web app路径,这样cookie就不会被发送到其他web app。但是,在您的情况下,中间件更改了请求 URL 路径,因此浏览器观察到不同的路径,导致 cookie 路径不匹配。

在大多数情况下,我建议将 cookie 路径设置为“/”,以便它匹配对服务器的所有请求(假设 Tomcat 上只有一个应用程序)

// context.xml
<Context sessionCookiePath="/">

【讨论】:

  • 完美!谢谢你的解释。知道原因比理解错误要好得多。
  • @bayou.io 如果你将/ 设置为cookie path,JSESSIONIDs 会在应用程序之间重叠,不是吗?
  • @bayou.io :正如 Andrea Ligios 所说,请编辑您的答案以在 context.xml 解决方案中明确引用 &lt;Context sessionCookiePath="/"&gt;(正如我评论我的问题)。我懒得回答自己,想接受你的解释。
  • @AndreaLigios - 绝对。但是,在大多数生产服务器上,无论如何都只有一个应用程序。您还可以为不同的应用程序使用不同的 cookie 名称。无论如何,cookie 路径是isolating cookie 的一种非常糟糕的方式; trickier 比人们预期的要多得多;它会引起很多头痛。这就是为什么我宁愿将其默认设置为 / 并有效地忘记 cookie 路径功能。
  • 在这些日子里,域名非常便宜,我们应该始终为新应用使用不同的域名。或者使用免费的子域。 Cookie Domain 擅长隔离 cookie。在过去设计 Servlet 的时候,可能有正当的理由使用路径来分隔应用程序;但这在今天是非常不寻常的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多