我正在尝试向现有Java EE Web应用程序添加安全区域。我正在使用Glassfish 3.1.2。
首先,我在应用服务器上配置了LDAP安全域。然后我编辑了web.xml,添加了security-constraint,login-config和security-role元素。我还编辑了glassfish-web.xml,以包括LDAP组和web.xml中定义的角色之间的映射。
到目前为止,一切都按预期进行。如果我尝试访问/ secure /目录中的某些内容,系统会提示我登录,如果登录成功,我将被带到请求的页面。
问题是会话没有保持登录状态。如果我尝试访问/ secure /目录中的另一个页面,它会提示我再次登录。
我可以看到它正在设置一个JSESSIONID cookie,但JSESSIONID值不断变化。我不确定是否会发生这种情况。
也许我在做一个错误的假设,认为应用服务器会为我处理这个问题?我是否需要向应用程序添加逻辑以检查会话是否已成功登录?
2013年3月8日更新
我监控HTTP以查看JSESSIONID正在改变的位置......
应用程序起始页
GET index.html (start page)
Request: JSESSIONID=545b99397ecfb0f7287a9f0bea4c
点击链接以确保资源
GET test.xhtml
Request: JSESSIONID=545b99397ecfb0f7287a9f0bea4c
输入用户名/密码,提交表格
POST j_security_check
Request: JSESSIONID=545b99397ecfb0f7287a9f0bea4c
GET test.xhtml
Request: JSESSIONID=545b99397ecfb0f7287a9f0bea4c
Response: JSESSIONID=54a5264a0cbbe0dbaf73c82cda55 (Set-Cookie)
点击链接到安全文件夹中的其他资源
GET test2.xhtml
Request: JSESSIONID=54a5264a0cbbe0dbaf73c82cda55
Response: JSESSIONID=54bdd1a27da000bcfe4ad80185b1 (Set-Cookie)
输入用户名/密码,提交表格
POST j_security_check
Request: JSESSIONID=54bdd1a27da000bcfe4ad80185b1
GET test2.xhtml
Request: JSESSIONID=54bdd1a27da000bcfe4ad80185b1
Response: JSESSIONID=5561dda1e57f165026ee570d7a28 (Set-Cookie)
如果我从web.xml中删除安全约束,我可以在不更改JSESSIONID的情况下浏览这些页面。
似乎客户端行为正常,它将JSESSIONID存储在cookie中并在请求中发送正确的值。