我有基本的登录注销会话管理问题。 当我点击登录按钮时,下面的这个功能被触发。在LDAP身份验证之后,它移动到index.html,我显示他们的名字。
function validate()
{
var pageTitle=$(document).attr('title');
var un=document.getElementById('username').value;
var pwd=document.getElementById('pass').value;
$.ajax({
'url':'/analytics_1/validate',
'data':'userName='+un+'&password='+pwd,
'type':'GET',
'success':function(response)
{
if(response==1)
{
$.ajax({
'url':'/analytics_1/LogButton',
'type':'POST',
'data':'userName='+un+'&buttonId=VIKALPLoginButton&pageTitle='+pageTitle,
'success':function()
{
window.open("index.html","_self");
}
});
}
else
{
alert("Invalid Credentials");
}
}
});
}
我在检查它是否是新的
之后在LogButton.java中创建了Sessionif(session.isNew())
{
System.out.println("session is not set, lets create the name");
associate=req.getParameter("userName");
session.setAttribute("Associate",associate);
}
else
{
System.out.println("session is already set, lets get the name");
associate=(String)session.getAttribute("Associate");
}
我从成功登录后创建的会话中获取了他们的名字
我做了一些行动并退出,
$('#logout').on('click',function()
{
var pageTitle=$(document).attr('title');
$.ajax({
'url':'/analytics_1/LogButton',
'data':'buttonId=VIKALPLogoutButton&pageTitle='+pageTitle,
'type':'POST',
'success':function()
{
window.open('Login.html',"_self");
},
'error':function(err)
{
alert("haha:"+err.response);
}
});
});
在LogButton.java中,我检查按钮是否为VIKALPLogoutButton,如果为true,我继续使会话无效并删除属性
if(button.equals("VIKALPLogoutButton"))
{
System.out.println("deleting the session cuz of logout");
session.removeAttribute("Associate");
session.invalidate();
//System.out.println("what happens to the session? " +session.isNew());
}
所有这些都按照要求发生。现在出现了安全用例:如果我在没有登录的情况下访问index.html会发生什么?
所以当index.html加载时,我开始检查是否设置了会话,
$(document).ready(function () {
$.ajax({
'url':'/analytics_1/GetAssocId',
'type':'POST',
'success':function(response)
{
if(response!="null")
{}
else
{
window.open("Login.html","_self");
}
$('#name').text(response);
}
});
.....
.....
}
GetAssocId.java:
public void doPost(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException
{
HttpSession session=req.getSession();
PrintWriter out=res.getWriter();
out.print(session.getAttribute("Associate"));
}
这也可以正常工作,即如果没有创建会话,它会将我重定向到Login.html。
现在问题是,我无法登录,即使提供了有效的凭据,不知何故“Associate”属性设置为null,
下面是我在cmd中获得的System.out.println输出
以上白线:登录,退出操作(注意会话使我给出的输出无效)
白线下方:直接转到index.html,重定向到Login.html,然后使用有效凭据登录,
现在这是我的问题,它使会话无效,但仍然说会话已经存在。更令人困惑的是,会话存在,但值为空。
我如何克服这个问题?请帮忙
P.S:除了我为LogButton.java提供的片段之外,对于这个问题并不重要
答案 0 :(得分:1)
HttpSession session=req.getSession();
如果你看一下getSession
方法的文档
返回与此请求关联的当前HttpSession,如果没有当前会话且create为true,则返回新会话。 如果create为false且请求没有有效的HttpSession,则此方法返回null。
您正在调用req.getSession()
方法,该方法会为您提供新会话。可能需要使用现有的会话
HttpSession session=req.getSession(false);
由于您已经使会话无效,因此会话为null
。
您的其他问题
现在这是我的问题,它使会话无效,但仍然说会话已经存在。更令人困惑的是,会话存在,但值为空。
这是因为您创建了一个新会话,其中没有属性,这就是您获得null
的原因