JSESSIONID存储在哪里? (JavaEE的)

时间:2012-05-13 07:35:33

标签: java jsp java-ee applet jsessionid

我有两个应用程序 - 一个Java EE Web应用程序和一个Java SE applet。我想通过JSESSIONID(由Web应用程序创建)在applet中验证用户。

所以存在一个问题 - 如何将此JSESSIONID与特定用户相关联?

如何检查(在Web服务器应用程序端)哪个用户由此类JSESSIONID表示?在applet中,我将从cookie中读取它,然后我想编写一个简单的Servlet,它将接受此JSESSIONID作为POST消息。此后,当JSESSIONID错误时,我想在响应中写入任何内容,如果JSESSIONID是好的(即代表某人),则我想在用户信息中写入。

有谁知道怎么做?

2 个答案:

答案 0 :(得分:10)

JSESSIONID是一种您通常不应该关心的低级机制。在服务器端,servlet容器透明地将JSESSIONID转换为servlet中可用的HttpSession对象。会话ID也使用Cookie标头或URL重写透明地传递给服务器。

因此,如果您点击链接或在网页上发布普通表单,浏览器会自动传递JSESSIONID cookie或将其附加到网址。

您的设计存在一个主要缺陷:安全servlet容器应将HttpOnly属性添加到JSESSIONID cookie(请参阅:How do you configure HttpOnly cookies in tomcat / java webapps?)这是为了防止JavaScript读取JSESSIONID cookie出于安全原因 - 比如劫持用户会话。你的applet甚至可能看不到那个cookie!

我对的了解不多,但我建议您通过网络浏览器以某种方式执行HTTP请求,以便自动处理安全标识(cookie)。

答案 1 :(得分:3)

Java EE容器将为您完成大部分工作。您可以使用几个快捷方式,具体取决于您使用的身份验证方法以及容器行为方式的详细信息。我暂时不理会那些捷径。我假设用户以某种形式向Web应用程序提供他们的信息 - 例如通过登录。

当用户登录时,创建会话(如果已经存在一个doe snot)并将其用户名(以及您喜欢的任何其他详细信息)作为会话属性添加到会话中。

当有来自已有会话的请求时,只需从会话中检索用户详细信息。容器负责将请求中的会话ID映射到正确的会话对象,并使其可用于请求。

如果会话ID无效,容器将不会将会话对象与请求关联。

最后要注意的是HttpOnly cookies。容器应默认使用这些会话ID(以防止XSS攻击)。要使applet可用的会话ID,您需要禁用会话cookie的HttpOnly保护。这意味着如果您的应用程序有XSS漏洞,攻击者很容易窃取用户会话cookie。