我有两个应用程序 - 一个Java EE Web应用程序和一个Java SE applet。我想通过JSESSIONID(由Web应用程序创建)在applet中验证用户。
所以存在一个问题 - 如何将此JSESSIONID与特定用户相关联?
如何检查(在Web服务器应用程序端)哪个用户由此类JSESSIONID表示?在applet中,我将从cookie中读取它,然后我想编写一个简单的Servlet,它将接受此JSESSIONID作为POST消息。此后,当JSESSIONID错误时,我想在响应中写入任何内容,如果JSESSIONID是好的(即代表某人),则我想在用户信息中写入。
有谁知道怎么做?
答案 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!
我对applet的了解不多,但我建议您通过网络浏览器以某种方式执行HTTP请求,以便自动处理安全标识(cookie)。
答案 1 :(得分:3)
Java EE容器将为您完成大部分工作。您可以使用几个快捷方式,具体取决于您使用的身份验证方法以及容器行为方式的详细信息。我暂时不理会那些捷径。我假设用户以某种形式向Web应用程序提供他们的信息 - 例如通过登录。
当用户登录时,创建会话(如果已经存在一个doe snot)并将其用户名(以及您喜欢的任何其他详细信息)作为会话属性添加到会话中。
当有来自已有会话的请求时,只需从会话中检索用户详细信息。容器负责将请求中的会话ID映射到正确的会话对象,并使其可用于请求。
如果会话ID无效,容器将不会将会话对象与请求关联。
最后要注意的是HttpOnly cookies。容器应默认使用这些会话ID(以防止XSS攻击)。要使applet可用的会话ID,您需要禁用会话cookie的HttpOnly保护。这意味着如果您的应用程序有XSS漏洞,攻击者很容易窃取用户会话cookie。