在Ajax调用中获取会话数据

时间:2011-12-14 05:55:29

标签: java ajax jsp session java-ee

嗨我正在查询数据库,根据某些条件加载所有项目,并将此结果设置为会话

data = service.getData();
session.setAttribute("data", data);

现在我试图通过Ajax调用访问这些数据,我的Ajax调用由不同的servlet提供,而不是从DB获取数据。

使用jquery调用Ajax

$.ajax({
    type: "POST",
    url: "/com/tp/AjaxXML.jsp",
    data: ({cmd: "report"}),
    dataType: "xml",
    success: function(xml) {
        $(xml).find('site').each(function(){
            var url = $(this).attr('url');                                  
        });
    }
});

在我的AjaxXML.jsp

我在做

if("report".equals(cmd)){
    List<Object> data = (List<Object>)request.getSession().getAttribute("data");

    if(data == null){
        System.out.println("data is null ");
    }
}

每次我通过Ajax调用将数据作为null获取时,我是如何尝试通常从我的第一个servlet访问会话数据。

如果我做错了什么,有人会告诉我吗?

当我们session.getId();pageContext.getSession().getId();时,我注意到了另一件事 他们俩都回归不同的身份?对我来说,他们应该和那些人有什么不同吗?

1 个答案:

答案 0 :(得分:1)

  

当我们session.getId();pageContext.getSession().getId();两个人都返回不同的ID时,我又注意到了一件事情?对我来说,他们应该和那些人有什么不同吗?

不,他们绝对不应该有所不同。但我假设您已在相同请求中检查过它们。如果您在不同的请求中检查它们,那么差异可以通过缺少正确的JSESSIONID cookie来解释。 Cookie是域和特定于上下文的。您显然是将ajax请求发送到其他域/上下文。 ajax URL中的前导斜杠/也证实了这个更少或更多。确保您将其发送到相同的域/上下文。使用与上下文相关的URL,如url: "AjaxXML.jsp",并将代码移动到相同的域/上下文,或在服务器级别打开不同上下文之间的会话共享。


无关具体问题,在JSP中执行Ajax响应处理是一个坏主意。而是在servlet中进行。

替换

url: "/com/tp/AjaxXML.jsp",

通过

url: "/com/tp/AjaxXML",

并将代码放在servlet的doPost()方法中,该方法映射在该URL模式上。

另见: