会话甚至在使其失效后仍然存在

时间:2017-03-02 06:15:13

标签: java session login

我有基本的登录注销会话管理问题。 当我点击登录按钮时,下面的这个功能被触发。在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中创建了Session
if(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输出 enter image description here

以上白线:登录,退出操作(注意会话使我给出的输出无效)

白线下方:直接转到index.html,重定向到Login.html,然后使用有效凭据登录,

现在这是我的问题,它使会话无效,但仍然说会话已经存在。更令人困惑的是,会话存在,但值为空。

我如何克服这个问题?请帮忙

P.S:除了我为LogButton.java提供的片段之外,对于这个问题并不重要

1 个答案:

答案 0 :(得分:1)

 HttpSession session=req.getSession();

如果你看一下getSession方法的文档

  

返回与此请求关联的当前HttpSession,如果没有当前会话且create为true,则返回新会话。   如果create为false且请求没有有效的HttpSession,则此方法返回null。

您正在调用req.getSession()方法,该方法会为您提供新会话。可能需要使用现有的会话

HttpSession session=req.getSession(false);

由于您已经使会话无效,因此会话为null

您的其他问题

  

现在这是我的问题,它使会话无效,但仍然说会话已经存在。更令人困惑的是,会话存在,但值为空。

这是因为您创建了一个新会话,其中没有属性,这就是您获得null的原因