0

我支持一些项目,使用ADF (using JDeveloper 11.1.2.2.0)并部署到Tomcat 7.0.28.

在登录之前和之后,IT 存在问题JSessionID:
应该有所不同。为了解决这个问题,在我的方法validate()中(在用户提交登录表单时执行)我执行以下操作:

ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
HttpSession session = (HttpSession)ec.getSession(false);
session.invalidate();
session = (HttpSession)ec.getSession(true);
//setting some special session attributes
ec.redirect("nextPage");

当我到达时,nextPage我可以获得具有上面设置的特殊属性的会话并走得更远。当我从 Firefox 或 Chrome 登录时,一切正常。

但是,当我使用 IE 8.0 登录并重定向到 时nextPage,我的代码会在没有这些特殊属性的情况下获取会话并将我返回到登录页面。

使用 Wireshark 我意识到,当 Firefox 登录时,它会发送带有用户输入(用户名/密码)的 POST 请求,使用 new 接收答案,使用 newJSessionID in SetCookie parameter发送另一个请求Adf-Window-id并接收答案,然后将其重定向到nextPage.

但是对于 IE 流程是不同的:登录时 IE 发送two POST request in a row (first with user input, second with Adf-Window-id),然后收到两个答案,每个答案都有不同的JSessionID. 它存储最后一个并被重定向到nextPage. 显然,最后一个 JSessionID 不属于我设置特殊属性的会话。

我已经花了几天时间试图通过挖掘配置和谷歌来解决这个问题,但没有成功。我所看到的 - IE 有时可以按预期登录(在这种情况下,上面提到的两个答案是以相反的顺序收到的),但它很少发生。

也许您遇到过同样的问题并解决了?或者,也许我做错了/期待错了?

4

2 回答 2

0

实际上,您所做的事情是行不通的。当您执行 Java EE 容器管理的身份验证时,您需要对用户会话进行身份验证。如果您使会话无效,则用户身份验证也将消失。唯一可行的方法是使用基本身份验证,在这种情况下,浏览器会随每个请求发送使用凭据。

Oracle WLS 对此有一个专有方法,允许更新会话 ID 而不会使其无效。Tomcat 似乎也存在类似情况,请参见此处:http ://www.koelnerwasser.de/?p=11

于 2012-08-29T05:45:12.000 回答
0

我通过实现自己的 servlet 解决了所描述的问题。

成功登录后,设置了必要的会话属性,并且会话不会失效。然后,用户被重定向到我自己的 servlet 的上下文中,它保存所有会话属性、使会话无效、创建新会话并恢复旧属性。之后,这个 servlet 进一步重定向用户,他应该在登录后到达哪里。当然,有一些安全技巧。

于 2012-09-03T07:23:10.883 回答