Java 在Ajax调用中获取会话数据

Java 在Ajax调用中获取会话数据,java,ajax,jsp,session,jakarta-ee,Java,Ajax,Jsp,Session,Jakarta Ee,您好,我正在查询数据库以根据某些条件加载所有项目,并将会话中的结果设置为 data = service.getData(); session.setAttribute("data", data); 现在我试图通过Ajax调用访问这些数据,我的Ajax调用由另一个servlet提供,而不是从DB获取数据的servlet 使用jquery的Ajax调用 $.ajax({ type: "POST", url: "/com/tp/AjaxXML.jsp", data: ({cm

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

data = service.getData();
session.setAttribute("data", data);
现在我试图通过Ajax调用访问这些数据,我的Ajax调用由另一个servlet提供,而不是从DB获取数据的servlet

使用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 ");
    }
}
if(“report.equals(cmd)){
列表数据=(列表)请求.getSession().getAttribute(“数据”);
如果(数据==null){
System.out.println(“数据为空”);
}
}
每次我通过Ajax调用将数据获取为null时,无论我如何尝试从第一个servlet正常访问会话数据,它都能正常工作

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

当我们执行
session.getId()时,我注意到了另一件事
pageContext.getSession().getId()
他们两个都返回了不同的Id?这对我来说应该是一样的吗?有人对此有不同意见吗

当我们执行
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模式的servlet的
doPost()
方法中

另见:
当我们执行
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模式的servlet的
doPost()
方法中

另见:

您需要显示更多围绕您发布的两行代码的代码。@gurung我认为其余代码与此无关,我只是想知道我们是否可以通过ajax调用访问会话中的数据集?请尝试使用
request.getSession(false)
在第二种情况下。您可能想检查一下:这仍然无法处理request.getSession(false),该链接指的是Php,但是我在J2EEM中遇到了这个问题。您需要显示更多围绕您发布的两行代码的代码。@gurung我认为其余代码与此无关。我只想知道我们是否可以通过ajax调用访问会话中的数据集?请尝试使用
request.getSession(false)
在第二种情况下。您可能想检查一下:这仍然无法处理请求。getSession(false),该链接指向Php,但是我在J2EE中遇到了这个问题